メモリの階層 — 速さと容量の綱引き
「速くて・大容量で・安い」メモリがあれば話は簡単。でも現実には速いものほど小さく高い。だからコンピュータは、小さくて速い記憶から大きくて遅い記憶までをピラミッド状に積み重ねて使います。その綱引きと、なぜこれでうまくいくのかを見ていきましょう。
1. なぜピラミッドなのか — 速さ・容量・値段のトレードオフ
記憶装置は、CPUに近い順にレジスタ → L1/L2/L3キャッシュ → 主記憶(RAM)→ SSD → HDDと並びます。上へ行くほど速いけれど小さく・高価。下へ行くほど遅いけれど大きく・安価。この相反する性質を1つで満たす部品は存在しないので、全部を階層として組み合わせます。
下のピラミッドで、表示する指標(速さ・容量・値段)を切り替えて、各段の性質が上下でどう逆転するか見てください。
記憶のピラミッド — 指標を切り替えて綱引きを見る
右のバーが選んだ指標の大きさ(対数・概算)。上の段ほど速く・小さく・高価、下の段ほど遅く・大きく・安価と、きれいに逆転しています。CPUは頻繁に使うものを上へ、めったに使わないものを下へ置きます。
POINT — メモリ階層の大原則
「速い・大きい・安い」は同時に3つとも成り立たない。速いメモリ(SRAM)は面積と電力を食うので大容量にできず高価。安くて大容量のメモリ(HDD/SSD)は遅い。だから速い記憶を少しだけ、遅い記憶をたっぷり用意し、よく使うデータを上の層に集めることで「全体として速く、かつ大容量」を演出する。
2. 速さの差を体感する — レジスタが1秒なら?
階層ごとの速さの違いは、数字(ナノ秒)で見てもピンときません。そこでレジスタへのアクセスを「1秒」に引き伸ばしてみましょう。すると各層の待ち時間が、秒・分・日・月という身近なスケールで見えてきます。この差は想像以上に大きいのです。
もしレジスタが1秒なら — 待ち時間の実感スケール
横軸は「実感時間」の対数目盛り。レジスタが1秒だとすると、RAMは約1分40秒、SSDは約1日、HDDに至っては数ヶ月待つ感覚。だからCPUは、なるべく上の層で用を済ませたいのです。
平均アクセス時間 = ヒット時間 + ミス率 × ミスペナルティ
AMAT。上の層で見つかれば(ヒット)速い。見つからず下へ探しに行くほど(ミス)ペナルティが大きい。ミス率を下げるのがキャッシュ設計の核心
3. データを探す旅 — 上の層から順に見に行く
CPUがデータを欲しがると、まず一番上のキャッシュを見ます。あれば(ヒット)即完了。なければ(ミス)1つ下の層を探しに行き…と、見つかるまで下りていきます。深く潜るほど待ち時間は跳ね上がります。下のデモで、データの置き場所を変えて「探す旅」の長さを比べてみましょう。
データ探索の旅 — どこで見つかるかで待ちが激変
青い粒がCPUの要求。上の層から順に確かめ、✗(ミス)を越えて✓(ヒット)まで下ります。右上の「待ち時間」が、越えた層のぶんだけ積み上がります。浅い層でヒットするほど圧倒的に速い。
4. なぜキャッシュは効くのか — 局所性という性質
「よく使うデータを上に置く」と言っても、次に何を使うか事前には分かりません。ところが実際のプログラムは「さっき使ったものの近くを、またすぐ使う」という強い傾向(局所性)を持っています。だから直近に触れたデータをキャッシュに残すだけで、次のアクセスがよく当たるのです。
局所性のちから — アクセスの並び方でヒット率が激変
キャッシュは「行(隣り合う数バイトのまとまり)」単位で読み込みます。連続アクセスなら1回読めば周辺もヒット続き。ランダムだと毎回ミスして下の層へ。同じキャッシュでもヒット率がまるで違うのが分かります。
注意 — 「キャッシュを増やせば速くなる」わけではない
キャッシュが効くのは局所性があるから。データを飛び飛びにランダムアクセスするプログラムは、いくらキャッシュを積んでもヒットせず遅いまま。速いコードとは、なるべく連続した・近いメモリを続けて触るコードのこと。「配列を素直に順番に舐める」が速いのはこのため。
5. まとめ — 速さと容量を両立させる知恵
- トレードオフ:速い・大きい・安いは同時に成り立たない。だから階層で組み合わせる。
- 桁違いの差:レジスタが1秒ならRAMは分、ディスクは月。深く探すほど待ちが跳ね上がる。
- 局所性が鍵:直近&近所をまた使う性質があるから、キャッシュは高いヒット率を稼げる。
一歩先へ — 階層はもっと複雑で賢い
現代のシステムでは、複数CPU間でメモリ距離が変わるNUMA、GPU向けの超広帯域HBM、電源を切っても消えず容量も大きい不揮発メモリ、次に使うデータを予測して先読みするプリフェッチなど、階層の上下をまたぐ工夫が積み重なっている。次の「キャッシュのしくみ」で、この上位層の中身(マッピング方式・ヒットとミス)にさらに踏み込む。