仮想メモリ
アドレス空間の抽象化とメモリ保護
仮想メモリとは
仮想メモリは、各プロセスに独立したアドレス空間を提供する仕組みです。 プロセスは物理メモリのアドレスを意識せず、仮想アドレスを使用します。 MMU(Memory Management Unit)が仮想アドレスを物理アドレスに変換します。
仮想メモリのメリット
メモリ保護
各プロセスのアドレス空間が分離され、他プロセスのメモリにアクセス不可。
アドレス空間の独立性
全プロセスが同じ仮想アドレス(例: 0x400000)から開始可能。
物理メモリ以上の使用
スワップを使用して、物理メモリ以上のメモリを使用可能。
共有メモリ
同じ物理ページを複数プロセスの仮想アドレスにマッピング可能。
ページング
仮想アドレス → ページテーブル → 物理アドレス
仮想ページ
4KB単位
→4KB単位
MMU
変換
→変換
物理フレーム
4KB単位
4KB単位
ページサイズ
通常4KB。Huge Pageは2MBまたは1GB(TLBミス削減)。
ページテーブル
仮想ページと物理フレームの対応表。多段構造(x86-64は4段)。
TLB (Translation Lookaside Buffer)
ページテーブルのキャッシュ。高速なアドレス変換を実現。
ページフォルト
アクセスした仮想ページが物理メモリに存在しない場合に発生。 カーネルがページを読み込み、ページテーブルを更新します。
Minor Fault
- • ディスクI/O不要
- • ゼロページ割り当て
- • CoW(Copy-on-Write)
Major Fault
- • ディスクI/Oが必要
- • スワップからの読み込み
- • ファイルマップの読み込み
プロセスのメモリレイアウト
カーネル空間(アクセス不可)
スタック ↓(下方向に成長)
...
ヒープ ↑(上方向に成長)
BSS(未初期化データ)
Data(初期化データ)
Text(コード)
メモリ確認コマンド
1 # プロセスのメモリマップ 2 cat /proc/PID/maps 3 4 # メモリ使用詳細 5 pmap -x PID 6 7 # ページフォルト確認 8 ps -o pid,min_flt,maj_flt,cmd -p PID 9 10 # vmstat でページング状況 11 vmstat 1 12 # si: swap in, so: swap out 13 14 # Huge Page設定確認 15 cat /proc/meminfo | grep Huge 16 17 # Transparent Huge Pages 18 cat /sys/kernel/mm/transparent_hugepage/enabled
SRE/インフラ観点
パフォーマンスチューニング
- • Huge Pages: 大規模DBで有効(TLBミス削減)
- • vm.swappiness: スワップ傾向の調整(0-100)
- • overcommit: vm.overcommit_memory で制御
トラブルシューティング
- • Major Page Fault多発 → メモリ不足またはI/O問題
- • メモリリーク調査: pmap, valgrind, /proc/PID/smaps