FE EXAM

キャッシュメモリの仕組み(ヒットとミス)

CPUと主記憶の間に置く高速な記憶で、よく使うデータを保持する

INTERACTIVE VISUALIZATION
CPU
キャッシュ
主記憶
ヒット
ミス
シナリオ
キャッシュヒット
フェーズ
request
進捗
1 / 5
シナリオ
ステップ1 / 5
要求アドレス
0x1ACPUがほしいデータの番地
STEP 1/5CPUがデータを要求CPU(=計算を行う部品)が「番地 0x1A のデータがほしい」と要求を出します。CPUはまず最初にキャッシュメモリへ問い合わせます。
0x1A 要求CPU計算する部品キャッシュ高速・小容量主記憶低速・大容量
階層キャッシュ(L1 → L2 → L3 → 主記憶 の順に探す)
L1数十KB
最速(CPUコアに内蔵)
L2数百KB〜数MB
高速
L3数MB〜数十MB
中速(複数コアで共有)
解説

📌
キャッシュメモリとは

CPUと主記憶の間に挟む「速い小箱」CPUキャッシュ高速主記憶低速よく使うデータをコピーして手元に置く

キャッシュメモリ(cache memory)とは、CPU(計算する部品)と主記憶(メインメモリ)の間に置く、小さくて高速な記憶のことです。主記憶はCPUに比べてかなり遅いため、CPUが毎回主記憶に取りに行くと待ち時間だらけになります。そこで、よく使うデータをCPUの近くにコピーして置いておき、待ち時間を減らすのがキャッシュの役割です。

身近な例で考えると、図書館と手元のメモの関係に似ています。調べ物のたびに毎回図書館(=主記憶)の奥まで本を取りに行くのは大変なので、よく使うページは手元のメモ帳(=キャッシュ)に書き写しておきます。次に同じ内容が必要なときは、図書館まで行かずに手元のメモを見れば一瞬で済みます。

上のツールで「キャッシュヒット」「キャッシュミス」を選んで▶ボタンを押すと、CPUがデータを要求してからキャッシュを確認し、データを受け取るまでの流れが1ステップずつ見られます。矢印の動きとフェーズの色に注目してください。

📌
ヒット/ミスの判定

CPUがデータを要求すると、キャッシュはまず「そのデータのコピーを自分が持っているか」を確認します。この確認結果によって、その後の動きが大きく変わります。

判定は次の2通りです。
キャッシュヒット:要求したデータがキャッシュにあった状態。主記憶に行かずにすぐ返せるので高速
キャッシュミス:要求したデータがキャッシュに無かった状態。遅い主記憶まで取りに行くので低速

キャッシュミスが起きたとき、キャッシュは主記憶から取得したデータを自分にもコピーして保存します。こうしておくと、次に同じデータが必要になったときはヒットして高速に返せます。「一度使ったデータは、また近いうちに使われやすい」という経験則を利用しているわけです。上のツールでミスのシナリオを再生すると、「主記憶から取得 → キャッシュにコピー保存」のステップが確認できます。

全体の速さは「どれだけヒットできるか」で決まります。ヒットの割合(ヒット率)が高いほど、遅い主記憶へのアクセスが減り、システム全体が速くなります。

📌
階層キャッシュ(L1/L2/L3)

近くて速い順に L1 → L2 → L3 → 主記憶CPUL1L2L3主記憶遠い層ほど大容量だが少しずつ遅くなる

現代のCPUでは、キャッシュ自体も何段階かの階層に分かれています。これをL1・L2・L3キャッシュと呼びます(Lは Level の頭文字)。CPUに近いほど速いが小さく、遠いほど大きいが少し遅い、という関係になっています。

各レベルの位置づけは次の通りです。
L1キャッシュ:CPUコアに内蔵された最速のキャッシュ。容量は数十KBと小さい
L2キャッシュ:L1で見つからなかったときに探す。数百KB〜数MB
L3キャッシュ:複数のCPUコアで共有することが多い。数MB〜数十MB

レベル速度容量
L1最速(CPUコアに内蔵)数十KB
L2高速数百KB〜数MB
L3中速(複数コアで共有)数MB〜数十MB

探す順番はL1 → L2 → L3 → 主記憶です。まず一番近くて速いL1を確認し、無ければL2、それでも無ければL3、最後に主記憶へ行きます。近い層でヒットするほど速いので、できるだけ手前で見つかるようにデータを配置するのがポイントです。これは前のページで学んだメモリ階層の考え方を、キャッシュの中でもう一段細かく適用したものといえます。

📌
なぜキャッシュで速くなるのか

CPUキャッシュHIT5ナノ秒で返却CPUキャッシュ×主記憶MISS100ナノ秒かかる

キャッシュで速くなる理由は、主記憶とキャッシュのアクセス速度の差がとても大きいからです。一般的に主記憶(DRAM)へのアクセスには100ナノ秒程度かかるのに対し、L1キャッシュは数ナノ秒で返せます。CPUが主記憶に直接アクセスするたびに100ナノ秒待つのは、CPUの処理速度に対してかなりのロスになります。

キャッシュが効くのは、プログラムのメモリアクセスに局所性(locality)という偏りがあるからです。
時間局所性:一度使ったデータは、近いうちにまた使われやすい(例:ループ変数は何度も読み書きされる)
空間局所性:あるデータを使ったとき、その近くのデータも続けて使われやすい(例:配列を先頭から順に処理する)

この局所性があるからこそ、「一度取り出したデータをキャッシュに保存しておく」戦略が当たります。局所性がまったくなくランダムに飛び回るアクセスでは、キャッシュに保存しても次に使われる保証がなく、ほぼ毎回ミスになってしまいます。キャッシュとは「プログラムの偏った使い方」を利用して速度を稼ぐ仕組みといえます。

📌
書き込みポリシー(ライトスルー vs ライトバック)

ライトスルーCPUキャッシュ主記憶同時に書くライトバックCPUキャッシュ主記憶後でまとめて

CPUがデータを書き込むとき、キャッシュと主記憶をどう更新するかには2つの方式があります。

ライトスルー(Write-through)とは、書き込みのたびにキャッシュと主記憶の両方を同時に更新する方式です。
・メリット:キャッシュと主記憶の内容が常に一致するため、データの食い違いが起きない
・デメリット:書き込みのたびに遅い主記憶にアクセスするので、書き込みが遅くなりやすい

ライトバック(Write-back)とは、とりあえずキャッシュだけ更新し、そのデータがキャッシュから追い出されるタイミングで主記憶に書き戻す方式です。
・メリット:書き込みがキャッシュだけで完結するため高速。連続した書き込みをまとめて1回で済ませられる
・デメリット:キャッシュと主記憶の内容が一時的にズレるため、管理が複雑になる

身近な例でいうと、ライトスルーはメモ帳に書いたらすぐ本棚のノートにも転記するイメージ、ライトバックはメモ帳に書いておき、ページが埋まったら本棚に移すイメージです。現代のCPUでは、書き込み速度を重視してライトバックが多く採用されています。

関連コンテンツ