コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB

ページングとスワップ

生田 陸人
LuaGate エンジニア / 現役エンジニア
編集 LuaGate編集部

ページングとスワップ

このレッスンで分かること

  • ページング はメモリを固定サイズ(典型 4KB)の ページ に区切り、ページ単位で仮想 ↔ 物理を対応付ける仕組みです
  • スワップ は使われていないページをディスクに追い出し、必要になったら読み戻す機能です
  • スワップが頻発する スラッシング に陥ると、システムはほぼ停止します

ページングとスワップ とは

ページングとスワップ。本レッスンでは、ページングとスワップ の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。

ページング

仮想空間も物理メモリも 4KB(一部 2MB / 1GB の huge page もある)の単位でブロック化します。

用語意味
ページ仮想側のブロック
ページフレーム物理側のブロック
ページテーブル仮想ページ → 物理フレームの対応表
ページフォルト仮想ページに物理が割り当てられていないときの割込み

ページテーブルはプロセスごとに 1 つ存在し、CPU のレジスタ(x86 なら CR3)にトップアドレスがロードされます。プロセス切替えで CR3 を入れ替えるだけで、メモリ世界が丸ごと切り替わります。

アドレス変換の図解

diagram (will load when visible)

頻繁にアクセスする変換結果は TLB(Translation Lookaside Buffer) にキャッシュされ、ページテーブル走査をスキップできます。

ページフォルトの種類

種類原因対応
マイナーフォルトRAM 上にはあるがマップしていない即座にマッピングして再開
メジャーフォルトRAM から落ちている(スワップ/ファイル)ディスクから読み戻す
不正アクセスアクセス権なし/未割当てSIGSEGV を投げてプロセス停止

C や Rust で *ptr がクラッシュすると、それは「不正アクセスの結果 SIGSEGV を受け取った」状態です。

スワップ

物理 RAM が足りなくなると、OS は使用頻度の低いページをディスク上の スワップ領域 にコピーし、その物理フレームを解放します。後で必要になるとフォルト → ディスクから読み戻し、という流れです。

ターミナル

# Linux でのスワップ確認 swapon --show free -h

プレーンテキスト

total used free shared buff/cache available Mem: 8.0G 5.4G 420M 180M 2.2G 2.0G Swap: 2.0G 450M 1.5G

Swap: used が大きく増え続けると、システムはスワップ中の可能性があります。

ページ置換アルゴリズム

どのページを追い出すかは性能に直結します。

  • FIFO 古く読まれた順に追い出す。実装は簡単だが、よく使うページも追い出してしまう
  • LRU(Least Recently Used) 最後にアクセスされた時刻が古いものから追い出す。理想に近いが正確な実装は重い
  • クロックアルゴリズム LRU の近似版で、参照ビットを巡回的にチェックする。Linux で実用化

トレードオフ

  • ページサイズを大きくすると TLB のヒット率は上がる が、内部フラグメンテーション(中途半端な空き)が増える
  • スワップは「OOM Killer 起動を遅らせる安全弁」ですが、頻発すれば応答性が壊滅。データベースサーバーではスワップを実質無効化する vm.swappiness=1 設定が定石です
  • SSD 上のスワップは HDD より高速ですが、書き込み寿命を消費します

よくある誤解

  • 「スワップを増やせばメモリが増えたことになる」は誤りで、スワップは 緊急避難所 であり、ディスク I/O 速度に律速されるため RAM の置き換えにはなりません
  • 「スラッシングはハードウェアの問題」も誤りで、原因はワーキングセットが RAM に収まらないことであり、設計やデータ構造の問題です

やってみよう

ターミナル

vmstat 1 5

si(swap in)と so(swap out)の列が常に 0 なら平和、頻繁に値が立つならスワップが動いています。同じく /proc/meminfoActive Inactive を眺めるとページの状態が見えます。

よくある質問

Q. このトピックは実務でどう役立ちますか?

A. DB のクエリ最適化、API 設計、データ構造の選択など、設計判断の根拠になります。表面的にライブラリを使うだけでなく「なぜそれが速いのか」を理解できると、性能問題を未然に防げます。コーディング面接でも頻出のテーマです。

Q. 計算量はどう求めれば良いですか?

A. ループのネストごとに掛け算する、再帰なら漸化式から解く、というのが基本です。Big-O 表記は定数倍と低次の項を無視するため、n の指数(n²、n log n など)に注目してください。最悪・平均・最良の 3 つを意識すると説得力が増します。

Q. 覚えるべき定番アルゴリズムは何ですか?

A. 二分探索、クイックソート/マージソート、BFS/DFS、ダイクストラ、DP の基本問題(フィボナッチ・ナップサック)が必修です。これらを「白紙から書ける」状態にすると、応用問題が一気に解けるようになります。

次のレッスン

次は mmap とメモリマップトファイル で、ページングとスワップ を学びます。

事前確認 — 進む前に次の 3 つができることを確認しましょう。

  1. ページングとスワップ の要点を自分の言葉で説明できる
  2. このレッスンの最小コード (または操作手順) を見ずに書ける
  3. 練習問題やクイズで間違えた箇所を読み直して理解した

理解度チェック (30 秒)

Q. ページングとスワップ とは何か、1 文で説明してください。

この章のポイント

A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。

関連レッスン