仮想メモリ

アドレス空間の抽象化とメモリ保護

仮想メモリとは

仮想メモリは、各プロセスに独立したアドレス空間を提供する仕組みです。 プロセスは物理メモリのアドレスを意識せず、仮想アドレスを使用します。 MMU(Memory Management Unit)が仮想アドレスを物理アドレスに変換します。

仮想メモリのメリット

メモリ保護

各プロセスのアドレス空間が分離され、他プロセスのメモリにアクセス不可。

アドレス空間の独立性

全プロセスが同じ仮想アドレス(例: 0x400000)から開始可能。

物理メモリ以上の使用

スワップを使用して、物理メモリ以上のメモリを使用可能。

共有メモリ

同じ物理ページを複数プロセスの仮想アドレスにマッピング可能。

ページング

仮想アドレス → ページテーブル → 物理アドレス

仮想ページ
4KB単位
MMU
変換
物理フレーム
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# プロセスのメモリマップ
2cat /proc/PID/maps
3
4# メモリ使用詳細
5pmap -x PID
6
7# ページフォルト確認
8ps -o pid,min_flt,maj_flt,cmd -p PID
9
10# vmstat でページング状況
11vmstat 1
12# si: swap in, so: swap out
13
14# Huge Page設定確認
15cat /proc/meminfo | grep Huge
16
17# Transparent Huge Pages
18cat /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