メモリ(作業机)— 今すぐ使うものを広げる場所

上級の解説は準備中のため、上級の内容を表示しています。

概要 — まず全体をつかむ

中級ではRAMの正体(DRAM/SRAM)と速さの要素を見ました。上級では、なぜ階層にすると速さと大きさを両立できるのか、そして仮想記憶の裏側へ。

詳細 — 1段階ずつ追う

記憶階層という考え方

記憶は1種類では成り立ちません。速いメモリは高価で小さく、大きいメモリは安いが遅い——この矛盾を、層に積むことで解いています。

  • レジスタ — CPU内。最速だが数十個ぶん
  • L1/L2/L3キャッシュ(SRAM) — コアに近いほど速く小さい
  • 主記憶(DRAM) — 大容量だがキャッシュより桁違いに遅い
  • スワップ(ストレージ上) — あふれた分の退避先。さらに桁違いに遅い
アニメーション『記憶の階層(速さと容量)』を開く
速い・小さい遅い・大きい記憶の階層レジスタCPU直近で最速・最小L1キャッシュコアごとの最速メモリL2・L3キャッシュやや大きい高速メモリメモリ(RAM)作業机・電源で消える(揮発)SSD倉庫・速い(消えない)HDD倉庫・大容量(消えない)速さと容量はトレードオフ。よく使うものを上へ置き、全体を速く見せる

上ほど速く小さく、下ほど遅く大きい。よく使うものを上の層に集められれば、全体としては速いのに大きい——見かけを両立できます。その「集め方」を支えるのが次の局所性です。ストレージ側の階層は storage で扱います。

局所性がキャッシュを効かせる

キャッシュが成立する根拠は、プログラムのアクセスに偏りがあることです。

  1. 時間的局所性 — いま触れたデータ・命令は、近いうちにまた触れやすい(ループ変数など)
  2. 空間的局所性 — あるアドレスに触れたら、その近くも続けて触れやすい(配列の連続走査など)

だからキャッシュは1バイト単位でなく、キャッシュライン(※1 キャッシュライン、64バイト前後)でまとめて持ってきます。1回のミスで周辺ごと引き込めば、続く空間的アクセスはヒットします。

登場人物メモ:

  • ※1 キャッシュライン — キャッシュが出し入れする最小のまとまり。1バイト欲しくても行ごと運ぶ

ヒット率が性能を左右します。目安でL1ヒットが数ns・主記憶が約100nsなら、ヒット率が数%変わるだけで平均アクセス時間が大きく動きます。「計算より、データが来るのを待つ時間」が全体を決めることが多いのはこのためです。

仮想記憶とページング

各プロセスには、実メモリの量や配置と切り離した仮想アドレス空間が与えられます。「自分だけが広い連続メモリを持っている」という見かけを、OSとハードが作ります。

  • ページ — アドレス空間を固定長(多くは4KB)に区切った単位
  • ページテーブル — 仮想ページ → 物理ページ の対応表。変換は※2 MMUが担う
  • TLB — 直近の変換結果をためる小さなキャッシュ。無いと表をたどり直す(遅い)
  • ページフォルト — 目的ページが主記憶に無いときの割り込み。OSがストレージから読み込む(重い)
  • スワップ — 使っていないページをストレージへ退避し、空きを作る
アニメーション『仮想メモリ(見せかけの広い空間)』を開く
仮想メモリ — 広い仮想アドレスを、狭い物理メモリ+ストレージへ対応づけるプロセスが見る仮想アドレス空間(広い)仮想ページ V0仮想ページ V1仮想ページ V2仮想ページ V3仮想ページ V4仮想ページ V5⋮ さらに続く(見かけ上とても広い)ページテーブル(対応表)V0実メモリ F2V1実メモリ F0V2スワップへ退避V3実メモリ F3V4スワップへ退避V5実メモリ F1実メモリへ足りない分は退避(スワップ)実際の物理メモリ(狭い)フレーム F0(V1)フレーム F1(V5)フレーム F2(V0)フレーム F3(V3)スワップ(ストレージへ退避)V2V4当面使わないページを退避(遅い)広く見せかけ、足りない分はストレージで代用(スワップ)。使いすぎると激遅になる

登場人物メモ:

  • ※2 MMU — メモリ管理ユニット。仮想アドレスを物理アドレスへ変換するCPU内の回路

このおかげで、各プロセスは他をのぞけず(保護)、物理より広いアドレスを扱え(スワップ)、断片化した物理メモリを連続に見せられます。プロセスごとに空間が分かれる話は process-and-thread と、CPU側の実行は cpu につながります。

⚠️ 深部の落とし穴

  • スラッシング — メモリ不足でページの出し入れが多発し、実処理よりスワップ待ちが増えて激重になる
  • TLBミスの多発 — 広いメモリをまばらに触ると変換キャッシュが外れ、ページウォークが増える
  • キャッシュに乗らない書き方 — 大きな配列を飛び飛びに触ると空間的局所性が崩れ、ミスだらけになる
  • 保存し忘れ — 主記憶は揮発性。電源が切れれば作業内容は消える(こまめに保存)

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. 仮想アドレスから物理アドレスへの変換を高速化する専用の小さなキャッシュは?

2. 記憶階層の並びと性質として正しいのは?

3. キャッシュが1バイト単位でなく「キャッシュライン」でまとめて出し入れするのはなぜ?

4. メモリ不足でページの出し入れが多発し、実処理よりスワップ待ちが増えて激重になる現象はどれ?

5. 目的のページが主記憶に無いときに起きる割り込みで、OSがストレージから読み込む——これは何?

6. 仮想アドレス空間を固定長(多くは4KB)に区切った単位を何と呼ぶか、カタカナで答えてください。

7. 仮想アドレスを物理アドレスへ変換するCPU内の回路を、英字3文字で答えてください。

8. キャッシュがよく効くのは、プログラムが「直近使ったもの・その近く」を再び使う偏りを持つからです。この性質は?