中級ではRAMの正体(DRAM/SRAM)と速さの要素を見ました。上級では、なぜ階層にすると速さと大きさを両立できるのか、そして仮想記憶の裏側へ。
概要 — まず全体をつかむ
詳細 — 1段階ずつ追う
記憶階層という考え方
記憶は1種類では成り立ちません。速いメモリは高価で小さく、大きいメモリは安いが遅い——この矛盾を、層に積むことで解いています。
- レジスタ — CPU内。最速だが数十個ぶん
- L1/L2/L3キャッシュ(SRAM) — コアに近いほど速く小さい
- 主記憶(DRAM) — 大容量だがキャッシュより桁違いに遅い
- スワップ(ストレージ上) — あふれた分の退避先。さらに桁違いに遅い
アニメーション『記憶の階層(速さと容量)』を開く
上ほど速く小さく、下ほど遅く大きい。よく使うものを上の層に集められれば、全体としては速いのに大きい——見かけを両立できます。その「集め方」を支えるのが次の局所性です。ストレージ側の階層は storage で扱います。
やさしく言うと(中級)
メモリの実体はRAM(Random Access Memory)で、どの番地にもほぼ同じ速さで直接アクセスできる揮発性の記憶装置です。CPUはここに置かれた命令とデータを直接読み書きします(主記憶)。
RAMには大きく2種類あります。
- DRAM — コンデンサで1ビットを記憶。安価で大容量にしやすいが、電荷が抜けるためリフレッシュ(定期的な再書き込み)が必要。主に主記憶に使う
- SRAM — フリップフロップで記憶。高速でリフレッシュ不要だが高価・大容量化しにくい。主にCPUのキャッシュに使う
アニメーション『メモリ=作業机』を開く
局所性がキャッシュを効かせる
キャッシュが成立する根拠は、プログラムのアクセスに偏りがあることです。
- 時間的局所性 — いま触れたデータ・命令は、近いうちにまた触れやすい(ループ変数など)
- 空間的局所性 — あるアドレスに触れたら、その近くも続けて触れやすい(配列の連続走査など)
だからキャッシュは1バイト単位でなく、キャッシュライン(※1 キャッシュライン、64バイト前後)でまとめて持ってきます。1回のミスで周辺ごと引き込めば、続く空間的アクセスはヒットします。
登場人物メモ:
- ※1 キャッシュライン — キャッシュが出し入れする最小のまとまり。1バイト欲しくても行ごと運ぶ
ヒット率が性能を左右します。目安でL1ヒットが数ns・主記憶が約100nsなら、ヒット率が数%変わるだけで平均アクセス時間が大きく動きます。「計算より、データが来るのを待つ時間」が全体を決めることが多いのはこのためです。
やさしく言うと(中級)
- 速さ — メモリ(RAM)はストレージより桁違いに速い。ただしCPUのキャッシュ(SRAM)よりは遅い
- 消えるか — メモリは揮発性で電源を切ると消える/ストレージは不揮発性で残る
- 役割 — メモリは「今使うもの」を広げる作業場/ストレージは「しまっておく」保管庫
速さの階層は「CPU内レジスタ → キャッシュ(SRAM)→ 主記憶(DRAM)→ ストレージ」の順。上ほど速く小さく、下ほど遅く大きくなります。
仮想記憶とページング
各プロセスには、実メモリの量や配置と切り離した仮想アドレス空間が与えられます。「自分だけが広い連続メモリを持っている」という見かけを、OSとハードが作ります。
- ページ — アドレス空間を固定長(多くは4KB)に区切った単位
- ページテーブル — 仮想ページ → 物理ページ の対応表。変換は※2 MMUが担う
- TLB — 直近の変換結果をためる小さなキャッシュ。無いと表をたどり直す(遅い)
- ページフォルト — 目的ページが主記憶に無いときの割り込み。OSがストレージから読み込む(重い)
- スワップ — 使っていないページをストレージへ退避し、空きを作る
アニメーション『仮想メモリ(見せかけの広い空間)』を開く
登場人物メモ:
- ※2 MMU — メモリ管理ユニット。仮想アドレスを物理アドレスへ変換するCPU内の回路
このおかげで、各プロセスは他をのぞけず(保護)、物理より広いアドレスを扱え(スワップ)、断片化した物理メモリを連続に見せられます。プロセスごとに空間が分かれる話は process-and-thread と、CPU側の実行は cpu につながります。
やさしく言うと(中級)
速さは容量だけでは決まりません。実効性能を左右する主な要素は次のとおりです。
- レイテンシ — アクセス要求から実際にデータが返るまでの待ち時間
- バス幅とチャネル数 — 一度に運べる幅。デュアルチャネルにすると実効バス幅が増え、帯域(1秒あたりの転送量)が上がる
- クロック(転送レート) — 単位時間あたりのやり取り回数
そして容量が足りないと、あふれた分を仮想メモリとしてストレージ上の領域(スワップ/ページファイル)に退避します。ストレージはDRAMより桁違いに遅いため、これが多発すると動作が急に重くなります。
⚠️ 深部の落とし穴
- スラッシング — メモリ不足でページの出し入れが多発し、実処理よりスワップ待ちが増えて激重になる
- TLBミスの多発 — 広いメモリをまばらに触ると変換キャッシュが外れ、ページウォークが増える
- キャッシュに乗らない書き方 — 大きな配列を飛び飛びに触ると空間的局所性が崩れ、ミスだらけになる
- 保存し忘れ — 主記憶は揮発性。電源が切れれば作業内容は消える(こまめに保存)
やさしく言うと(中級)
- 重い・カクつく — メモリ不足で仮想メモリへの退避(スワップ)が多発し、遅いストレージ待ちが増える
- 保存し忘れで消える — 揮発性なので、電源が切れると主記憶上の作業内容は失われる
- まれなビット反転 — 宇宙線やノイズで1ビットが化けることがある。サーバ用途ではECCメモリが誤りを検出・訂正する
理解度チェック
そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。
問1. 仮想アドレスから物理アドレスへの変換を高速化する専用の小さなキャッシュは?
問2. 記憶階層の並びと性質として正しいのは?
問3. キャッシュが1バイト単位でなく「キャッシュライン」でまとめて出し入れするのはなぜ?
問4. メモリ不足でページの出し入れが多発し、実処理よりスワップ待ちが増えて激重になる現象はどれ?
問5. 目的のページが主記憶に無いときに起きる割り込みで、OSがストレージから読み込む——これは何?
問6. 仮想アドレス空間を固定長(多くは4KB)に区切った単位を何と呼ぶか、カタカナで答えてください。
問7. 仮想アドレスを物理アドレスへ変換するCPU内の回路を、英字3文字で答えてください。
問8. キャッシュがよく効くのは、プログラムが「直近使ったもの・その近く」を再び使う偏りを持つからです。この性質は?