株式会社ジオデータ開発 ロゴ
株式会社ジオデータ開発GEO DATA DEVELOPMENT Inc.

OPERATING SYSTEMS / MEMORY MANAGEMENT

仮想記憶とスラッシングを図解|ページフォールト・FIFO・LRU・ワーキングセット

PCのメモリが不足したとき、なぜ「作業が進むよりも、データの入替えで忙しくなる」のか。仮想記憶の内部を順番に見ていきましょう。

01|机が狭すぎると、書類の出し入れだけで一日が終わる

仕事机の上に置ける書類は3冊。ところが作業には4冊を繰り返し使います。1冊を棚に戻して別の1冊を取り出すたびに時間がかかり、書類を書く時間が減ってしまいます。

ページ 1Aページ 2Bページ 3Cページ 4D

コンピュータでは、机がRAM(主記憶)、棚がSSDなどの補助記憶、書類がページに相当します。大量のデータを扱うアプリケーションが複数動いていると、ページの入替えが増えて同じようなことが起こります。

02|RAM、SSD、仮想記憶の役割

場所・仕組み役割性質
RAM(Random Access Memory)/ラムCPUが今使うデータを置く高速だが容量は有限。一般に電源を切ると内容は失われる
SSD(Solid State Drive)/エスエスディーファイルなどを永続保存。ページの退避先にもなり得る一般にRAMより大幅に遅い
仮想記憶(Virtual Memory)プログラムに独立した仮想アドレス空間を見せる保護・アドレス変換・需要ページングを可能にする

仮想記憶は単純な「SSDをRAMの代わりにする仕組み」ではありません。まずプログラムごとに仮想アドレス空間を与え、使うページを物理RAMに対応付ける技術です。物理RAMにないデータが必要なら、OSが補助記憶などから取り込みます。

03|バイト・ページ・ページ枠の違い

CPUが扱うメモリはバイト単位でアドレス指定できますが、仮想記憶の管理では一定サイズのページ(page)にまとめます。物理RAM側の同じ大きさの区画がページ枠(frame)です。

ページ 14 KiBページ 24 KiBページ 34 KiBページ 44 KiB

たとえば一般的な4 KiBページでは1ページが4,096バイト。仮想ページ番号とページ内オフセットを組み合わせて場所を表します。ページサイズは環境によって異なり、大きなページ(huge page)もあります。

04|CPUからRAMまでの全体像

アプリ仮想ページ 1仮想ページ 2仮想ページ 3ページテーブル仮想 → 物理在不在・アクセス権RAM(主記憶)ページ枠1ページ枠2ページ枠3SSD / スワップ領域RAMにないページを保持ヒット不在なら
模式図。実際にはMMU・TLBがアドレス変換を高速化し、ページフォールト時はOSが必要な読込みを処理します。

アプリは仮想アドレスを用います。ハードウェアのMMU(Memory Management Unit/メモリ管理ユニット)がページテーブルを手がかりに物理アドレスへ変換します。変換結果を記憶するTLB(Translation Lookaside Buffer/変換索引バッファ)があれば変換を高速化できます。

ページテーブルには、そのページが現在使用可能な物理RAM上にあるかどうかを表す情報などが含まれます。TLBミスとページフォールトは別物です。TLBに変換情報がなくても、ページ自体がRAMにあればディスク読込みは不要です。

05|ページフォールトとは何か

ページフォールト(page fault)は、仮想アドレスの参照が現在のページ対応付けでは処理できないときに発生する例外です。必要なページがRAMにない場合、OSがページを読み込んで再実行することがあります。

06|ページ置換:枠が一杯になったら誰を追い出す?

物理RAMの割当て枠が埋まっているとき、新しいページを入れるにはどれかを選んで追い出します。この選択をページ置換(page replacement)と呼びます。書き換え済みページは必要に応じて退避先へ書き戻し、再読込みのコストが発生します。

アルゴリズム考え方得意・注意点
FIFO(First In, First Out/先入れ先出し)最も早く入ったページを追い出す単純だが最近使ったページでも追い出すことがある
LRU(Least Recently Used/最も長く未使用)最後の使用が最も古いページを追い出す時間的局所性を活かしやすい。厳密な実装には管理コスト
OPT(Optimal/最適)将来最も長く使われないページを追い出す理論的な比較基準。未来は通常わからない

07|局所性とワーキングセット

プログラムは通常、同じデータを何度も使う時間的局所性や、近いアドレスを続けて使う空間的局所性を持ちます。ある時間範囲で頻繁に参照するページの集合をワーキングセット(working set)と呼びます。

実行中のプロセス群が必要とするワーキングセットが物理RAMに収まれば、参照の多くはRAMで完結します。合計が収まりきらない状態ではフォールトが頻発しやすくなります。ただしワーキングセットの境界は参照パターンと観測時間によって変わります。

08|スラッシングの悪循環

① RAM不足
使いたいページが入らない
→
② 追い出す
別ページをSSDへ退避
→
③ また必要
直前に追い出したページを再読込
→
④ 待ち時間増
処理より入替えに時間を使う
↺
ページの交換が繰り返され、有用な処理が進まない悪循環を図示しています。

スラッシング(thrashing/スラッシング)とは、ページフォールトやページの置換・転送が過度に発生し、CPUやストレージが本来の仕事に使うよりページの入替えに時間を費やして、システムの処理能力が著しく低下する現象です。

「ページフォールトが1回起こること」と「スラッシング」は違います。後者はフォールトが繰り返され、全体として作業が進まなくなる状態を指します。

09|なぜプロセスを増やすほど遅くなる場合がある?

複数のプログラムを並行実行すると、CPUが空く時間を有効活用できます。しかし同時実行数を増やしすぎると、各プログラムへ割り当てられるRAMが不足し、ページ置換が増えます。結果としてストレージI/O待ちが支配的になり、かえって全体スループットが落ちます。

10|スワップアウトとスラッシングは違う

用語意味スラッシングとの関係
ページフォールトページ参照を現在の対応付けで処理できない例外頻発と高い入替えコストが問題になる
ページアウト/ページインページをRAMから退避/RAMへ読込みページ置換の具体的な操作
スワップアウトメモリ内容などを補助記憶へ退避操作の名称であって異常状態そのものではない
フラグメンテーション使用可能な記憶領域が細かく分断される現象メモリ利用効率の問題。スラッシングとは別

なお「スワップ」はOSによってページ単位の退避を指すことも、プロセス全体の退避を指すこともあります。いずれもページ置換が多発する現象の名前とは区別します。

11|FIFOはメモリ枠を増やしても損をすることがある

FIFOではBelady(ベラディ)の異常と呼ばれる現象があり、ページ枠を増やしたのにページフォールト回数が増えることがあります。典型的な参照列は 1,2,3,4,1,2,5,1,2,3,4,5。ラボでFIFOの枠数を3と4に切り替え、回数を比べてください。

LRUやOPTはスタック性を持つため、同じ参照列で枠数を増やしてフォールト回数が増えることはありません。これは「RAMを増やせば通常は有利」という直感に対し、置換方式も影響することを示しています。

12|スラッシングへの対策

対策何を変えるかなぜ効くか
物理RAMを増やす収容できるページ枠を増加ワーキングセットをRAMに収めやすくする
同時実行数を抑える実行中の仕事を減らす必要ページの合計を下げる
メモリリークの修正不要なのに保持している領域を解放実際の必要メモリを減らす
データアクセスの局所性改善繰り返し参照する範囲を小さくする置換後の再読込みを減らす
ページ置換・メモリ配分の改善ワーキングセットを考慮する頻用ページが追い出されにくくなる

13|SSDを高速化すればスラッシングは解決する?

SSDの性能向上はページの読込み・書戻しの待ち時間を短くできます。しかしRAMに必要なページが収まらないという根本原因は解決しません。SSDへの大量の退避が長く続けば、応答遅延や書込み負荷が問題になります。

14|現実のOSはもっと複雑

実際のOSはプロセスごとに独立した仮想アドレス空間を持ち、ファイルページ・匿名ページ・共有ページ・ページキャッシュを扱います。Linuxなどではページ回収、メモリ圧力の測定、OOM(Out Of Memory/メモリ不足)への対処など、複数の仕組みが働きます。

本記事のラボは教育上の理解を優先し、単一のページ参照列と固定数のページ枠に単純化しています。現実のOSがFIFO・厳密LRU・OPTのいずれかだけで動く、という意味ではありません。

15|例で確認:3枠なのに4ページを繰り返し使う

ページ参照列が 1,2,3,4,1,2,3,4、RAMのページ枠が3つしかない場合を考えます。FIFOでは、新しいページを読み込むたびに以前のページを追い出し、次に必要になったときまた読み直します。

一方、参照が 1,2,3,1,2,1,3 のように同じ3ページへ集中するなら、初回の読込み後はRAMで多くのアクセスを処理できます。これが局所性とワーキングセットの効果です。

16|操作ラボ:ページ枠を変え、入替えを観察する

下の操作ラボは最初に「4ページを3枠で巡回」する設定です。1件ずつ実行し、追い出したページがすぐ必要になる悪循環を観察しましょう。次に枠を4個へ増やし、フォールト数の変化を比べます。

INTERACTIVE MEMORY LAB

ページ置換を1アクセスずつ動かす

CPUが参照する仮想ページを順に読みます。主記憶の空き枠がなくなると、OSがページを入れ替えます。これは教育用の単純化した単一プロセスモデルです。

実行済み
5 回
ページフォールト
5 回
フォールト率
100.0%

現在のRAM(ページ枠)

枠 1
3
枠 2
4
枠 3
1

アクセス 5:ページ 1 / ページフォールト → ページ 2 を追い出して読込み

参照履歴(橙=ページフォールト・緑=ヒット)

全アクセスを実行した場合の比較

FIFO
12回
LRU
12回
OPT(理想)
6回

OPTは将来の参照順を先読みする理論的な下限比較用で、通常のOSは将来を知りません。フォールト率は、置換を伴わない初回読込みも含みます。

17|概念をひとつの図につなぐ

STEP 1
仮想記憶

プログラムに仮想アドレスを見せる

STEP 2
ページテーブル

仮想ページと物理ページ枠を対応付ける

STEP 3
ページフォールト

対応付けだけでは参照できない例外

STEP 4
ページ置換

空き枠不足でページを入れ替える

STEP 5
ワーキングセット

ある期間によく使うページの集合

STEP 6
スラッシング

ページ入替えが多発し処理が停滞する

18|理解度チェック

「要求したページがRAMにないときの例外」「ページを追い出す操作」「入替えが多発してシステムが著しく遅くなる状態」をそれぞれ区別できるでしょうか。順にページフォールト、ページ置換、スラッシングです。

さらに、FIFOをLRUに変えても、必要なワーキングセットがRAM容量を大幅に上回り続けるときは、置換だけでは十分な改善になりません。メモリ配分や同時実行数に立ち返ることが大切です。