ページフォールトの概要
ページフォールト(page fault)とは、プログラムが物理メモリにマップされていない仮想アドレスにアクセスしようとした際に、ハードウェアが発生させる割り込みのことを指します。この現象は、
オペレーティングシステム(OS)が主に扱うもので、ページフォールトを発生させるハードウェアコンポーネントは
メモリ管理ユニットと呼ばれています。
ページフォールトの処理
OSは、ページフォールトを処理して仮想アドレスにアクセスを可能にするか、無効なアクセスがあった場合にはそのプログラムを強制終了することによって、システム全体の安定性を保っています。ページフォールトは必ずしも深刻なエラーではなく、例えばWindowsや
Unix系のOSでは頻繁に発生する機能の一環です。マイクロソフトが提供するリソースモニタでは、ページフォールトのことを「ハードフォールト」と呼ぶこともあります。
ページフォールトの種類
ページフォールトには、大きく分けて以下の三つの種類があります。
1. マイナー(ソフト)ページフォールト
マイナーなページフォールトは、必要とされる物理ページがメモリ内に存在するが、
メモリ管理ユニットがそのページを認識していない場合に発生します。この状況では、OSのページフォールト・ハンドラは単にその物理ページを適切な
ページテーブルエントリに登録することで処理が完了します。このため、ディスクへのアクセスが不要であり、高速に処理されます。例として、
共有メモリを使用する際に他のプログラムが事前にその内容にアクセスしていた場合などが挙げられます。
2. メジャー(ハード)ページフォールト
メジャーなページフォールトは、物理ページがメモリ内に存在しない場合に発生します。この時、OSは利用可能な物理ページを探し、再利用を行う必要があります。もし選ばれたページがディスクに書き戻されていなければ、その内容をまず書き戻してから必要なページをディスクからメモリに読み込む必要があります。このため、メジャーなページフォールトは処理完了まで時間がかかるため、プログラムの実行は一時的に停止します。
3. 無効ページフォールト
無効ページフォールトは、仮想
アドレス空間でマッピングされていないアドレスに対するアクセスが行われた場合に発生します。この際、OSは無効な参照が行われたことを報告し、通常は問題を引き起こしたプログラムを終了させます。多くのOSでは、0アドレスを含む仮想ページは決してマッピングされないため、ヌルポインタを利用した場合が無効ページフォールトとなります。
エラー処理と無効ページフォールト
不正アクセスや無効ページフォールトは
セグメンテーション違反や
バスエラーを引き起こし、OSの環境によってはプログラムをクラッシュさせることがあります。これらのエラーは主にソフトウェアの
バグ等に起因しますが、ハードウェアの誤動作が原因となるケースもあります。Windowsや
Unix系OSでは、各々独自の機構を用いてページフォールトに起因するエラーを報告します。
性能への影響
ページフォールトはプログラムやOSの性能に悪影響を及ぼす可能性があります。最も悪化した状態はスラッシングと呼ばれ、多くのページフォールトが短期間で起こることにより、システムが正常に機能しなくなる状態です。これを防ぐために、プログラムやOSの最適化を行い、メモリ使用量を減少させたり、メモリアクセスの局所性を改善することが重要となります。総じて、ページフォールトはプログラムのパフォーマンスを低下させる要因と見なされますが、適切な
ページ置換アルゴリズムを実装することによって、その回数を減少させることが可能です。
以上がページフォールトの概要とその影響についての解説です。