ページ置換アルゴリズム
ページ置換アルゴリズム(ページちかんアルゴリズム)とは、仮想記憶管理としてページング方式を使用するコンピュータのオペレーティングシステムにおいて、空き物理ページが少ない状態で新たなページを割り当てなければならないときにどのページを「ページアウト(スワップアウト)」するかを決定する方法を意味する。これはページフォールトが発生したときに使用可能なフリーなページが存在しないときに発生する。厳密には発生条件はシステムの種類や設定によって異なるが、フリーなページが全く無い場合か、あらかじめ設定したしきい値よりもフリーなページ数が少ないときに発生する。
以前にページアウトすべきページとして選択され置換されたページに再度アクセスが発生したら、そのページをページインする必要がある。そして、これにはI/Oの完了を待たなければならない。この、ページインを待つ時間の累計が小さいほどページ置換アルゴリズムが優秀であると言える。ページ置換アルゴリズムはページへのアクセスに関するハードウェアからの限られた情報を見て、アルゴリズム自身にかかる時間とページインにかかる時間のバランスをとりつつ、ページミスのなるべく起きない置換をしなければならない。
ページ置換アルゴリズムはオンラインアルゴリズムの一種である。
これまで解説してきた技法の多くは、各ページに対応した参照ビットが存在することを前提としている。中にはそのようなビットを持たないハードウェアもあり、その場合に効率的にページ置換を行うにはテクニックを要する。
よく知られた例として、VMSの動作するVAXがある。その手法は Secondary Page Caching と呼ばれている。ワーキングセットから除かれたページはすぐには削除されず、一時的に2つのリストのいずれかに置かれる。二次記憶装置の対応する内容が有効なページ(書き換えられていないページ)は Free Page List の最後尾に置かれ、書き換えられているページは Modified Page List に置かれる。
ARMアーキテクチャでのLinuxカーネル実装でも参照ビットのない状況に対処している。
NRU(最近使われていない)ページ置換アルゴリズムは、最近使われたページを残すことを主眼としたアルゴリズムである。このアルゴリズムは以下のように働く。ページが参照されたとき、そのページの参照ビットを立てて参照があったことを示す。同様にページが変更(書き込み)された場合、変更ビットを立てる。これらビットのセットは通常ハードウェア(MMU)が行うが、ソフトウェアレベルで行うことも可能である。
そして、ある一定の時間間隔でクロック割り込みをトリガーとして全ページの参照ビットをクリアする。そうすると、その時間間隔内で参照されたページだけが参照ビットが立った状態になる。ページを置換する必要が生じたとき、オペレーティングシステムはページを4種類に分類する。
カテゴリ 0: 参照なし、変更なし
カテゴリ 1: 参照なし、変更あり
カテゴリ 2: 参照あり、変更なし
カテゴリ 3: 参照あり、変更あり
参照されていないのに変更されているページというのは矛盾しているように思われるが、これはカテゴリ3のページの参照ビットをクロック割り込みの際にクリアした場合に生じる。NRU アルゴリズムでは、単純にカテゴリ番号の小さい方のページを選択する。つまり、変更があるかどうかよりも参照があるかどうかを重視することに注意されたい。
LRU アルゴリズムの重要な利点は、完全な統計分析を修正できる余地がある点である。たとえば、OPT アルゴリズムに比較して N回以上ページフォールトが多くなることはない、ということが証明されている。ここで、N は管理対象のページ数に比例した値である。
実装コストがかかるため、LRUに似ているがより実装コストの低いアルゴリズムを考慮することもある。
一方 LRU の欠点は、一般的な参照パターンで性能を低下させてしまう傾向があることである。たとえば、LRU 対象のページが N 個あったとして、あるアプリケーションが N + 1 ページにまたがる配列にアクセスしながらループしているとき、インデックスの進みと共にページフォールトが発生してしまう(つまり、配列が大きすぎるので必ずページ置換は必要だが、LRUを使うと次にアクセスするページが必ずページアウトされてしまう)。大きなループを使うのは一般的なので、このような場合に対応できるようにLRUを改善する試みは多く行われてきた。最も多い手法はループしてアクセスしているパターンを検出して、適した置換アルゴリズム(たとえば、MRU(Most Recently Used)に切り替えるのである。
ページ置換アルゴリズムは1960年代から1970年代にかけて研究の重要テーマであり、議論が戦わされた。結果として洗練されたLRU推測手法とワーキングセットアルゴリズムが開発されたのである。以来、伝統的なアルゴリズムが前提としていた事柄の一部が否定され、ふたたび研究が行われるようになった。とりわけ、以下のようなハードウェアの動作の変化とユーザーレベルのソフトウェアの動作の変化がアルゴリズムを変えさせてきた。
一次記憶装置の容量はどんどん大きくなっている。主記憶が数ギガバイトということも珍しくない状態では、全メモリページを定期的にチェックするアルゴリズムはどんどん現実味を失いつつある。
メモリ階層が高くなってきた。CPUのキャッシュミスは非常に性能にインパクトがあるため、上記の問題はさらに悪化する。
ユーザーのソフトウェアでの参照の局所性は薄れてきた。オブジェクト指向プログラミングが多く使われるようになったことが原因のひとつである。この場合、小さな関数を数多く使用し、ツリー構造やハッシュテーブルなどの洗練されたデータ構造を使用する。