FE EXAM

ページフォールト(ページ不在)

アクセスしたいページが主記憶になく、補助記憶から読み込む必要がある状態。

INTERACTIVE VISUALIZATION
CPU/プログラム
主記憶
補助記憶
フェーズ
idle
要求ページ
ページ 7
判定
シナリオ
ステップ1 / 8
STEP 1/8プログラムが動いている状態プログラムはメモリ上のページ(=主記憶を一定サイズに区切ったかたまり)を読み書きしながら動きます。いまフレーム(=ページを置く主記憶の枠)には 1・2・5 番のページが載っています。プログラムはこれから 7 番のページにアクセスしようとしています。
CPUプログラム要求: ページ7主記憶(フレーム)0ページ11ページ22ページ5補助記憶(ディスク)…ページ7アクセス
発生時の処理の流れ
① ページフォールト割込みが発生
② OSが補助記憶から該当ページを探す
③ 空きフレームへ読込(無ければページ置換)
④ ページテーブルを更新
⑤ 中断した命令を再実行 → ヒット
解説

📌
ページフォールトとは

CPUページ2空き主記憶要求7不在

ページフォールトとは、アクセスしたいページ(=主記憶を一定サイズに区切ったかたまり)が主記憶上になく、補助記憶(=ディスクなど)から読み込む必要がある状態のことです。これはエラーではなく、仮想記憶の仕組みのなかで日常的に起こる一種の割込み(=処理を一時中断して別の処理に切り替えるしくみ)です。

身近な例で考えると、図書館で本を借りる場面に似ています。読みたい本が手元の机(主記憶)になければ、書庫(補助記憶)まで取りにいかなければなりません。取りにいく間は読書を中断して待つことになります。

上のツールで▶ボタンを押すと、CPUがページ7を要求し、主記憶に見つからずページフォールトが起き、補助記憶から読み込んで解決するまでの流れを順に確認できます。

⚙️
発生時の処理

補助記憶主記憶読込

ページフォールトが起きると、OS(=基本ソフトウェア)が次の手順でページを主記憶に呼び込みます。
① 割込み発生:CPUが処理を中断し、OSに「ページが無い」と知らせる
② ページを探す:OSが補助記憶から該当ページを探し出す
③ 主記憶へ読込:空きフレームへ読み込む(空きが無ければページ置換で1つ追い出す)
④ ページテーブル更新:「このページは主記憶のここにある」と対応表を書き換える
⑤ 命令を再実行:中断していた命令をもう一度実行し、今度はヒットする

ここで出てきたページテーブルとは、どの仮想ページが主記憶のどのフレームに載っているかをまとめた対応表のことです。CPUはこの表を見て、必要なページがすぐ読めるかどうかを判断します。表に載っていなければフォールトになります。

③で空きフレームが無いときに、どのページを追い出すかを決めるのがページ置換アルゴリズムです。代表例にLRUやFIFOがあります。上のツールの「発生時の処理の流れ」で①〜⑤を一覧できます。

📉
性能への影響

速い補助記憶(とても遅い)桁違いに時間がかかる

補助記憶(ディスクやSSD)へのアクセスは、主記憶へのアクセスより桁違いに遅いという特徴があります。そのため、ページフォールトが起きるたびにプログラムは読込が終わるまで待たされ、その分だけ処理が遅くなります。

たまに起きる程度なら問題ありませんが、ページフォールトが多発すると性能が大きく低下します。最悪の場合、ページの読込と追い出しばかりが繰り返されて、本来の処理がほとんど進まなくなります。この状態をスラッシングと呼びます。

工場で考えると、必要な部品が手元になく、毎回遠い倉庫まで取りにいっているような状態です。取りにいく回数を減らすには、主記憶を増やしたり、どのページを追い出すかを賢く選ぶページ置換アルゴリズムを使ったりして、フォールトの回数を抑えることが大切になります。

🔁
ページ置換アルゴリズム(LRU・FIFO)

FIFO(先入れ先出し)1番目に入ったページA2番目に入ったページB3番目に入ったページC← 1番古い = 追い出すLRU(最近最も使われていない)最後に使ったのが一番古いページA最近使ったページB一番最近使ったページC← 最近使っていない = 追い出す

ページ置換アルゴリズムとは、主記憶に空きがないときに「どのページを補助記憶に追い出すか」を決めるルールです。追い出すページを間違えると、すぐまたフォールトが起きてしまいます。代表的なアルゴリズムは2つです。

FIFO(First In First Out=先入れ先出し)は、主記憶に一番早く入ってきたページから追い出す方式です。
・仕組みがシンプルで実装しやすい
・ただし「古くから入っている=よく使われている」かどうかは関係なく、直前まで使っていたページが追い出されることもある

LRU(Least Recently Used=最近最も使われていない)は、直近の使用履歴を見て、最後に使われた時点が一番古いページを追い出す方式です。
・「最近よく使っているページは今後も使うはず」という考え方にもとづいている
・フォールトが起きにくくなる傾向があり、FIFOよりも効率が良いとされる
・ただし使用履歴を記録する分、実装が少し複雑になる

身近な例で考えると、本棚のスペースが3冊分しかない場面をイメージしてください。FIFOは「一番最初に棚に入れた本を捨てる」。LRUは「一番長く読んでいない本を捨てる」。どちらも4冊目を入れるために1冊をどかすルールですが、LRUのほうが「まだよく読んでいる本」を残しやすいわけです。

⚠️
スラッシングとその防ぎ方

CPU主記憶(フレーム不足)補助記憶追い出し → 読込 → フォールト → 追い出し…本来の処理がほとんど進まない状態

スラッシングとは、ページの追い出しと読込が繰り返されて、本来の計算処理がほとんど進まなくなる状態のことです。主記憶のフレームが足りないときに、あるページを追い出した直後にそのページが再び必要になるという悪循環から起きます。

なぜスラッシングが起きるのか。プログラムが必要とするページの数(ワーキングセット=そのとき頻繁に使うページのまとまり)が、主記憶のフレーム数を大きく上回ると、どのページを追い出してもすぐ必要になるため、際限なくフォールトが続きます。

スラッシングを防ぐ主な方法は次のとおりです。
主記憶を増やす:フレームの数が増えれば、追い出す必要が減る
同時に動かすプログラムの数を減らす:各プログラムが使えるフレームが増え、フォールトが起きにくくなる
賢い置換アルゴリズム(LRUなど)を使う:すぐ必要になるページをできるだけ残すようにする

身近な例で考えると、狭い机に本を広げすぎた状態に似ています。机(主記憶)が小さいのに、同時に5冊の本を開いて読もうとすると、1冊広げるたびに別の1冊を床(補助記憶)に下ろして、すぐまた取り出す…という繰り返しになります。机を広くするか、開く冊数を減らすしかありません。

練習問題

🎯
基本情報技術者 練習問題

Q1.ページフォールトの説明として最も適切なものはどれか。
A.アクセスしたいページが主記憶になく、補助記憶から読み込む必要がある状態
B.CPUが計算を間違えてプログラムが停止した状態
C.主記憶がすべて空きフレームになっている状態
D.補助記憶の容量が不足してデータを保存できない状態
Q2.ページフォールトが発生したときのOSの処理として正しい順序はどれか。
A.補助記憶へ書き出す → 表を消す → 命令を破棄する
B.割込み発生 → 補助記憶から該当ページを主記憶へ読込 → ページテーブル更新 → 命令を再実行
C.プログラムを強制終了し、利用者にエラーを表示する
D.主記憶を初期化してから全ページを読み直す
Q3.ページフォールトが性能に与える影響として正しいものはどれか。
A.補助記憶は主記憶より速いので性能が向上する
B.性能には一切影響しない
C.補助記憶アクセスは遅いため、多発すると性能が大きく低下しスラッシングにつながる
D.ページフォールトが多いほどCPUの使用率が上がり高速になる

関連コンテンツ