コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
ページングとスワップ
ページングとスワップ
このレッスンで分かること
- ページング はメモリを固定サイズ(典型 4KB)の ページ に区切り、ページ単位で仮想 ↔ 物理を対応付ける仕組みです
- スワップ は使われていないページをディスクに追い出し、必要になったら読み戻す機能です
- スワップが頻発する スラッシング に陥ると、システムはほぼ停止します
ページングとスワップ とは
ページングとスワップ。本レッスンでは、ページングとスワップ の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
ページング
仮想空間も物理メモリも 4KB(一部 2MB / 1GB の huge page もある)の単位でブロック化します。
| 用語 | 意味 |
|---|---|
| ページ | 仮想側のブロック |
| ページフレーム | 物理側のブロック |
| ページテーブル | 仮想ページ → 物理フレームの対応表 |
| ページフォルト | 仮想ページに物理が割り当てられていないときの割込み |
ページテーブルはプロセスごとに 1 つ存在し、CPU のレジスタ(x86 なら CR3)にトップアドレスがロードされます。プロセス切替えで CR3 を入れ替えるだけで、メモリ世界が丸ごと切り替わります。
アドレス変換の図解
頻繁にアクセスする変換結果は 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.5GSwap: used が大きく増え続けると、システムはスワップ中の可能性があります。
ページ置換アルゴリズム
どのページを追い出すかは性能に直結します。
- FIFO 古く読まれた順に追い出す。実装は簡単だが、よく使うページも追い出してしまう
- LRU(Least Recently Used) 最後にアクセスされた時刻が古いものから追い出す。理想に近いが正確な実装は重い
- クロックアルゴリズム LRU の近似版で、参照ビットを巡回的にチェックする。Linux で実用化
トレードオフ
- ページサイズを大きくすると TLB のヒット率は上がる が、内部フラグメンテーション(中途半端な空き)が増える
- スワップは「OOM Killer 起動を遅らせる安全弁」ですが、頻発すれば応答性が壊滅。データベースサーバーではスワップを実質無効化する
vm.swappiness=1設定が定石です - SSD 上のスワップは HDD より高速ですが、書き込み寿命を消費します
よくある誤解
- 「スワップを増やせばメモリが増えたことになる」は誤りで、スワップは 緊急避難所 であり、ディスク I/O 速度に律速されるため RAM の置き換えにはなりません
- 「スラッシングはハードウェアの問題」も誤りで、原因はワーキングセットが RAM に収まらないことであり、設計やデータ構造の問題です
やってみよう
ターミナル
vmstat 1 5si(swap in)と so(swap out)の列が常に 0 なら平和、頻繁に値が立つならスワップが動いています。同じく /proc/meminfo の Active Inactive を眺めるとページの状態が見えます。
よくある質問
Q. このトピックは実務でどう役立ちますか?
A. DB のクエリ最適化、API 設計、データ構造の選択など、設計判断の根拠になります。表面的にライブラリを使うだけでなく「なぜそれが速いのか」を理解できると、性能問題を未然に防げます。コーディング面接でも頻出のテーマです。
Q. 計算量はどう求めれば良いですか?
A. ループのネストごとに掛け算する、再帰なら漸化式から解く、というのが基本です。Big-O 表記は定数倍と低次の項を無視するため、n の指数(n²、n log n など)に注目してください。最悪・平均・最良の 3 つを意識すると説得力が増します。
Q. 覚えるべき定番アルゴリズムは何ですか?
A. 二分探索、クイックソート/マージソート、BFS/DFS、ダイクストラ、DP の基本問題(フィボナッチ・ナップサック)が必修です。これらを「白紙から書ける」状態にすると、応用問題が一気に解けるようになります。
次のレッスン
次は mmap とメモリマップトファイル で、ページングとスワップ を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- ページングとスワップ の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. ページングとスワップ とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン