Web教材一覧ハードウェアとソフトウェア

記憶階層とキャッシュメモリ

キーワード

記憶階層、アクセスの局部性、キャッシュメモリ、ヒット率、ライトバック、ライトスルー、2次キャッシュ

過去問題:記憶階層とキャッシュメモリ


記憶階層

記憶階層の体系図

コンピュータの能力を向上するには,CPUやすべての記憶装置に高速のものを用いればよいのですが,大量のデータを保管するには大きな記憶容量が必要ですから,膨大な費用がかかってしまいます。それで,高価だが高速な小容量の記憶装置と,低速だが安価な大容量の記憶装置を組み合わせることが必要になります。これを記憶階層といいます。
 しかし,CPU-メモリ-ディスクをそのままつないだのでは,それらの間の処理速度に大きなギャップがあります。メモリからCPUに取り出して処理をする時間やディスクからデータを読み込んでメモリに入れる時間で空き時間が生じてしまいます。それを防ぐために,キャッシュメモリディスクキャッシュを設置します。これらを総称して緩衝記憶装置(バッファメモリ)といいます。

ディスクキャッシュとは、メモリとディスク間に置くキャッシュで,考え方はキャッシュメモリと同じです。個々のディスク装置あるいはディスク制御装置に半導体記憶装置を置き,必要なデータがここにあれば,いちいちディスクを読みに行かないでデータが得られるようにしたものです。

アクセスの局部性
常識的に考えて,あるデータやプログラムのある部分をアクセスすれば,次にはその近くにあるデータやプログラムがアクセスされる確率が大きいと思われます。それをアクセスの局部性といいます。
キャッシュメモリ
CPUとメモリの間にキャッシュメモリという高速のSRAMのメモリを設置し,CPUからの命令によりメモリからCPUにデータを読み込むときに,その付近のデータもキャッシュメモリに転送しておきます。次にCPUから取り出し命令があったときは,まずキャッシュメモリを調べてそこにあればそのデータをCPUに取り出します。

キャッシュの説明図
ヒット率
必要なデータがキャッシュメモリにあることをヒットしたといい、その確率をヒット率といいます。もし,メモリからの取り出し時間が50ns,キャッシュメモリからの取り出し時間を10nsであり,ヒット率0.9であるとすれば,平均取り出し時間は,
   10×0.9+50×(1-0.9)=14ns
になります。
 キャッシュメモリの容量を大きくすればヒット率が大きくなり、処理速度が向上しますが、高速素子数が増えるので高価になります。
ミスペナルティ
必要なデータがキャッシュメモリになかったことをヒットミスといい、その確率をミス率といいます。
    ミス率=1-ヒット率
の関係があります。ミスが発生すると、メモリからキャッシュメモリへの移動が行われます。さらに、詳細は省略しますが、キャッシュレジスタ管理情報の入れ替えなどの作業が発生します。それによるCPUの負荷損失をミスペナルティといいます。
 これを考慮すると、平均アクセス時間は、
   平均アクセス時間=ヒット率×キャッシュメモリへのアクセス時間
           +ミス率×(メモリへのアクセス時間+ミスペナルティ関連時間)
となります。
 なお、OSはミスペナルティの作業時間を低減する工夫をしています。
コンパクション
データがメモリ内の連続した領域にあれば、ヒット率が高くなります。メモリ内に分散している領域を一か所にまとめる処理をコンパクションといいます。
1次キャッシュと2次キャッシュ
最近のパソコンでは,キャッシュメモリを2段階に用意しています。CPUから近い順に1次キャッシュ,2次キャッシュといいます。一般には1次キャッシュを内部キャッシュとして1~16KB程度のメモリをCPU内部に内蔵し,2次キャッシュを外部キャッシュとしてCPU外部に64KB~1MB程度のSRAMを実装しています。
キャッシュライン
メモリからキャッシュに持ってくるデータの単位をキャッシュラインといいます。すなわち、キャッシュメモリには多数のキャッシュラインが存在します。
キャッシュラインのサイズが小さいとヒット率が小さく、メモリからキャッシュへの転送頻度が増大してキャッシュの効率が悪くなります。逆に大きすぎると、使われない部分が多くなるし、ライン数が少なくなり、キャッシュメモリの容量が非効率になります。32バイト~256バイト程度が一般的です。32バイト~256バイト程度が一般的です。
ライトスルー方式とライトバック方式
書き込み処理をしたときは、キャッシュメモリのデータをメモリに書き出す必要があります。
ライトスルー方式:キャッシュメモリの内容が更新されると、直ちにメモリも更新します。
ライトバック方式:直ちに更新するのではなく、メモリからキャッシュメモリへ新しい部分が転送される直前にまとめてメモリを更新します。