記憶装置ごとにアクセス速度を比較すると、下記のような並びとなります。
CPUのレジスタ >(超えられない壁) メモリ(主記憶装置) >(超えられない壁) ハードディスクなどの磁気ディスク装置
速い --------------------------------------------------------------------------------- 遅い
右に行くほど安価で大容量
上の図を見ると、高速なレジスタとメモリにすれば良いと言いたくなりますが、記憶装置は高速になればなるほど1ビットあたりの単価が高くなっていきます。そのため全てレジスタにしたり、メモリにすることは現実的ではないようです。
記憶装置間の速度ギャップを埋めて、待ち時間によるロスを防ぐための手法が
キャッシュです。
キャッシュも種類があり、レジスタとメモリの間に設けるキャッシュメモリや、メモリとハードディスクの間に設けるディスクキャッシュなどがあります。
本当にキャッシュって言葉は色んなところで出てきますね。
ちなみにキャッシュの意味は
英語で「cache」と表記し、「貯蔵所」「隠し場所」という意味を持ちます。
らしいです。キャッシュって言葉が出てきたら、一時的に保存するんだなーとイメージしておけばオッケーですね。
キャッシュメモリ
CPUはコンピュータの動作に必要なデータやプログラムをメモリ(主記憶装置)との間でやりとりします。
CPUに比べるとメモリは非常に遅いので、読み書きするたびにメモリへアクセスしていると、待ち時間ばかりが発生してしまいます。
メモリとCPUの間に、より高速に読み書きできるメモリを置いて、温度差によるロスを吸収させます。
これをキャッシュメモリと呼びます。
CPU ← キャッシュメモリ ← メモリ
// 主記憶装置(メモリ)から読み込んだデータは、キャッシュメモリにも保持される。
CPU ← キャッシュメモリ メモリ
// 同じデータを読む時は、高速なキャッシュメモリから取得することができる。
CPUの中にはキャッシュメモリが入っていて、処理の高速化が図られています。
キャッシュは1次キャッシュ、2次キャッシュと重ねて設置することが可能です。
CPU① → SRAM②
→ DRAM③
①1次キャッシュ
③2次キャッシュ
このキャッシュメモリと同じ役割を主記憶装置と磁気ディスク装置の間で担うのが
ディスクキャッシュです。
ディスクキャッシュは専用に半導体メモリを搭載したり、主記憶装置の一部を間借り
したりして実装します。
高速(小容量)|レジスタ
|キャッシュメモリ
|主記憶装置
|ディスクキャッシュ
低速(大容量)|磁気ディスク装置
// 記憶階層と呼びます
主記憶装置への書き込み方式
キャッシュメモリは読み出しだけじゃなく、書き込みでも使われます。
ただし、読み出しと違って書き込みの場合は「書いて終わり」とはなりません。
更新した内容をどこかのタイミングで主記憶装置にも反映しなければなりません。
主記憶装置を書き換える方式は、ライトスルー方式とライトバック方式の2つがあります。
ライトスルー方式
キャッシュメモリへの書き込みを行う際に、主記憶装置へも同時に書き込みを行います。
CPU → キャッシュメモリ
→ DRAM(主記憶装置)
ライトバック方式
この方式では、普段はキャッシュメモリしか書き込みを行いません。
キャッシュメモリから追い出されるデータが発生した際に、その内容を主記憶装置へと書き戻して
更新内容を反映させます。
CPU → キャッシュメモリ
キャッシュメモリ(追い出されたデータ) → DRAM(主記憶装置)
ヒット率と実行アクセス時間
キャッシュメモリの容量は小さいため、目的とするデータが必ずそこに入っているわけではありません。
目的とするデータがキャッシュメモリに入っている確率をヒット率と呼びます。
キャッシュメモリに目的のデータが存在する確率 = ヒット率
キャッシュメモリになくて、主記憶装置を読みに行く確率 = 1ーヒット率
例えばキャッシュメモリのヒット率が70%なら、主記憶装置を読みに行く確率は30%となります。
計算式にすると
①キャッシュメモリのアクセス時間 ✖️ ヒット率
②主記憶装置のアクセス時間 ✖️ (1ーヒット率)
① + ② = 実行アクセス時間
となります。
メモリインタリーブ
主記憶装置へのアクセスを高速化する手法として、キャッシュメモリ以外にあげられるのが
メモリインタリーブです
主記憶装置の中を複数の区画(バンク)に分割します。
バンク0 バンク1 バンク2
0番地 1番地 2番地
3番地 4番地 5番地
6番地 7番地 8番地
上記の区画はそれぞれ並行してアクセスできます。
複数バンクに同時にアクセスすることで、連続した番地のデータを一気に
読み出すことができます。
バンク0 バンク1 バンク2
------------------ 0~2番地のデータを一気にとる
3番地 4番地 5番地
6番地 7番地 8番地
ただ、ランダムアクセスなどの連続しないデータの読み出しでは
効力を発揮できないようです。
まとめ
さすが精密機械。ちゃんと仕組みは理解しよう。