メモリ管理 — 仮想メモリ・ページング・アロケーション
メモリ管理 — 仮想メモリ・ページング・アロケーション
🎯 このレッスンを読み終えたら
このレッスンを読み終えると、次の3つを自信を持って説明できるようになります。
- ▸✅ Stack / Heap / Code / Data セグメント
- ▸✅ ページングとセグメンテーション + 仮想メモリ
- ▸✅ ページフォルト + LRU ページ置換
学習目標をチェックリストとして手元に置き、すべて答えられるようになったらレッスンを閉じてください。
仮想メモリ — *無限メモリの幻想*
一言で言うと: 各プロセスがすべてのメモリを自分のものとして見ているかのような幻想。実際には OS がページ単位で物理 RAM にマッピングしています。
なぜ必要なのか:
変数アクセスの6ステップ (例: int x = 5; printf("%d", x);):
1. 仮想アドレス — &x = 0x7fff5fbff8ac (スタック領域)
2. MMU 変換 — Memory Management Unit がページテーブルを参照
3. TLB キャッシュ — よく使うマッピングは CPU キャッシュに(1サイクルのヒット)
4. 物理アドレス — 0x7fff5fbff8ac → 物理 RAM 0x12345678
5. キャッシュ確認 — L1 → L2 → L3 → RAM (4 → 12 → 40 → 200 サイクル)
6. 値の返却 — 5 がレジスタへ
> 💡 ページフォルト = ページテーブルにマッピングなし → OS がディスクからロード → 非常に遅い(数 ms)。
ページング — 4 KB 単位のメモリ管理
ページ = 4 KB (Linux 標準)。仮想・物理メモリともにページ単位で管理。
ページテーブルの構造:
- ▸プロセスごとに独立したページテーブル
- ▸仮想ページ番号 → 物理ページ番号 + 権限 (r/w/x)
- ▸64bit システム = 4段階ページテーブル (PML4 → PDPT → PD → PT)
TLB (Translation Lookaside Buffer):
- ▸CPU 内のページマッピングキャッシュ(通常 64〜1024 エントリ)
- ▸ヒット時は 1 サイクル、ミス時はページテーブルウォーク(10〜100 サイクル)
ページングの落とし穴:
ヒュージページ (2 MB・1 GB):
- ▸大量メモリを扱う DB や JVM で使用
- ▸TLB ミス減少 → パフォーマンス向上
- ▸Linux:
echo 1024 > /proc/sys/vm/nr_hugepages
メモリリーク + OOM デバッグ
メモリリーク: 確保したメモリを解放しない → 時間とともに蓄積 → 最終的に OOM 発生。
言語別のリスク:
リーク診断ツール:
- ▸Linux:
valgrind --leak-check=full ./app(C/C++) - ▸Java:
jmap -heap <PID>→jhatまたは VisualVM - ▸Python:
tracemallocモジュールまたはobjgraph - ▸Node.js:
--inspect+ Chrome DevTools Heap Snapshot - ▸全言語共通:
topまたはhtopで RSS が増え続ける場合はリークを疑う
OOM Killer の動作:
1. RAM + スワップがほぼ枯渇
2. カーネルが oom_score を計算(メモリ使用量・優先度に基づく)
3. 最もスコアの高いプロセスに SIGKILL を送信
4. /var/log/syslog または dmesg に記録 (Out of memory: Kill process ...)
> 💡 本番サーバーでは vm.swappiness=10(スワップ最小化)とメモリ監視アラートの設定が必須です。
🤖 AI にはこう依頼してみよう
このレッスンの概念を理解していれば、AI に具体的な指示を出せるようになります。漠然とした「直して」ではなく、語彙のある依頼 — それがトークン節約の出発点です。
- ▸「このコードのメモリ使用パターン (heap/stack) を分析して」
- ▸「このプロセスの RSS / Virtual Memory を計測するコマンドを教えて」
なぜこれがトークンを減らすのか
概念を知らないと、AI の回答を受け取っても「それって何ですか?」と再質問しなければなりません。その「再質問」がトークンを消費します。概念を一度理解しておけば、会話が一度で完結します。