CPU とメインメモリのあいだに設けられ、両者の速度差を埋める、高速で低容量な記憶装置のことです。
キャッシュ (cache) は「貯蔵庫」のような意味合いの英単語です。「現金 (cash)」とは違います。
CPU の速度に比べると、メインメモリにアクセスする速度は非常に遅いため、メインメモリへのアクセスがボトルネックとなって、全体の性能を落とす結果になります。そこで、メインメモリよりも高速なキャッシュメモリをあいだに設け、使用頻度が高いデータをキャッシュメモリに保存しておくことで、メインメモリへアクセスする機会を減らして高速化を図ります。
キャッシュメモリは通常、高速・低容量・高価な SRAM を使って構成されます(メインメモリには低速・大容量・安価な DRAM を使います)。キャッシュメモリは高速ですが、それはメインメモリとの比較の話であって、レジスタよりは低速です。
現代のコンピュータでは、キャッシュメモリを複数個搭載していることが多く、CPU からみて階層構造になっています。CPU に近い側から順に、1次キャッシュ、2次キャッシュ、3次キャッシュ・・・というふうに呼ばれます。CPU に近い側ほど、高速で低容量です。
キャッシュメモリへのデータの保存や参照は自動で行われ、プログラムやコンピュータの利用者などが特別指示を与える必要はありません。いくつか手法がありますが、基本的な考え方は次のようになります。
データにアクセスしたいとき、そのデータがキャッシュメモリ内に存在していれば、キャッシュメモリのデータを使います。。キャッシュメモリ内に存在しなければ、メインメモリからデータをキャッシュメモリへコピーし、次回以降のアクセスではキャッシュメモリ内のデータを使えるようにします。データをキャッシュメモリに記憶することを、キャッシュすると表現します。
2次キャッシュ以下のキャッシュメモリが存在する場合は、1次キャッシュから順番に探していきます。また、1次キャッシュに記憶しきれないデータは2次キャッシュ以下に記憶します。
データを参照したいとき、そのデータがキャッシュメモリに存在することをキャッシュヒットといいます。逆に、キャッシュメモリに存在しないことをキャッシュミスといいます。
プログラミングにおいては、キャッシュメモリの存在を意識しないことが多いですが、場合によっては意識しなければならないケースもあります(DMA 使用時など)。
また、メインメモリからキャッシュするとき、対象のデータだけでなく、周辺のデータもまとめてコピーされます。これは、メインメモリへのアクセスは、参照局所性が高いことを利用した発想です。
そのため、変数の宣言順を工夫するなどして、同タイミングで使うデータをできるだけ1箇所に集めておくことでキャッシュヒットの確率を上げるといった工夫を凝らすことはできます。
ほかの例として、二次元配列の要素を順番に参照するとき、メインメモリ上での並び順に沿う方向に参照したほうが効率が良くなることがあります(アルゴリズムとデータ構造編【データ構造】第2章)
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
![]() |
管理者情報 | プライバシーポリシー |