アクセスしたいページが主記憶になく、補助記憶から読み込む必要がある状態。
ページフォールトとは、アクセスしたいページ(=主記憶を一定サイズに区切ったかたまり)が主記憶上になく、補助記憶(=ディスクなど)から読み込む必要がある状態のことです。これはエラーではなく、仮想記憶の仕組みのなかで日常的に起こる一種の割込み(=処理を一時中断して別の処理に切り替えるしくみ)です。
身近な例で考えると、図書館で本を借りる場面に似ています。読みたい本が手元の机(主記憶)になければ、書庫(補助記憶)まで取りにいかなければなりません。取りにいく間は読書を中断して待つことになります。
上のツールで▶ボタンを押すと、CPUがページ7を要求し、主記憶に見つからずページフォールトが起き、補助記憶から読み込んで解決するまでの流れを順に確認できます。
ページフォールトが起きると、OS(=基本ソフトウェア)が次の手順でページを主記憶に呼び込みます。
・① 割込み発生:CPUが処理を中断し、OSに「ページが無い」と知らせる
・② ページを探す:OSが補助記憶から該当ページを探し出す
・③ 主記憶へ読込:空きフレームへ読み込む(空きが無ければページ置換で1つ追い出す)
・④ ページテーブル更新:「このページは主記憶のここにある」と対応表を書き換える
・⑤ 命令を再実行:中断していた命令をもう一度実行し、今度はヒットする
ここで出てきたページテーブルとは、どの仮想ページが主記憶のどのフレームに載っているかをまとめた対応表のことです。CPUはこの表を見て、必要なページがすぐ読めるかどうかを判断します。表に載っていなければフォールトになります。
③で空きフレームが無いときに、どのページを追い出すかを決めるのがページ置換アルゴリズムです。代表例にLRUやFIFOがあります。上のツールの「発生時の処理の流れ」で①〜⑤を一覧できます。
補助記憶(ディスクやSSD)へのアクセスは、主記憶へのアクセスより桁違いに遅いという特徴があります。そのため、ページフォールトが起きるたびにプログラムは読込が終わるまで待たされ、その分だけ処理が遅くなります。
たまに起きる程度なら問題ありませんが、ページフォールトが多発すると性能が大きく低下します。最悪の場合、ページの読込と追い出しばかりが繰り返されて、本来の処理がほとんど進まなくなります。この状態をスラッシングと呼びます。
工場で考えると、必要な部品が手元になく、毎回遠い倉庫まで取りにいっているような状態です。取りにいく回数を減らすには、主記憶を増やしたり、どのページを追い出すかを賢く選ぶページ置換アルゴリズムを使ったりして、フォールトの回数を抑えることが大切になります。
ページ置換アルゴリズムとは、主記憶に空きがないときに「どのページを補助記憶に追い出すか」を決めるルールです。追い出すページを間違えると、すぐまたフォールトが起きてしまいます。代表的なアルゴリズムは2つです。
FIFO(First In First Out=先入れ先出し)は、主記憶に一番早く入ってきたページから追い出す方式です。
・仕組みがシンプルで実装しやすい
・ただし「古くから入っている=よく使われている」かどうかは関係なく、直前まで使っていたページが追い出されることもある
LRU(Least Recently Used=最近最も使われていない)は、直近の使用履歴を見て、最後に使われた時点が一番古いページを追い出す方式です。
・「最近よく使っているページは今後も使うはず」という考え方にもとづいている
・フォールトが起きにくくなる傾向があり、FIFOよりも効率が良いとされる
・ただし使用履歴を記録する分、実装が少し複雑になる
身近な例で考えると、本棚のスペースが3冊分しかない場面をイメージしてください。FIFOは「一番最初に棚に入れた本を捨てる」。LRUは「一番長く読んでいない本を捨てる」。どちらも4冊目を入れるために1冊をどかすルールですが、LRUのほうが「まだよく読んでいる本」を残しやすいわけです。
スラッシングとは、ページの追い出しと読込が繰り返されて、本来の計算処理がほとんど進まなくなる状態のことです。主記憶のフレームが足りないときに、あるページを追い出した直後にそのページが再び必要になるという悪循環から起きます。
なぜスラッシングが起きるのか。プログラムが必要とするページの数(ワーキングセット=そのとき頻繁に使うページのまとまり)が、主記憶のフレーム数を大きく上回ると、どのページを追い出してもすぐ必要になるため、際限なくフォールトが続きます。
スラッシングを防ぐ主な方法は次のとおりです。
・主記憶を増やす:フレームの数が増えれば、追い出す必要が減る
・同時に動かすプログラムの数を減らす:各プログラムが使えるフレームが増え、フォールトが起きにくくなる
・賢い置換アルゴリズム(LRUなど)を使う:すぐ必要になるページをできるだけ残すようにする
身近な例で考えると、狭い机に本を広げすぎた状態に似ています。机(主記憶)が小さいのに、同時に5冊の本を開いて読もうとすると、1冊広げるたびに別の1冊を床(補助記憶)に下ろして、すぐまた取り出す…という繰り返しになります。机を広くするか、開く冊数を減らすしかありません。