←講義のツボメニューへ
←OS論シラバスへ メモリ
【2001.11.5,11.9】【第11、12回】ページング
・仮想アドレス空間をページ単位で分割する
・物理メモリをページフレーム単位で分割する
ページ単位でディスクとメモリ間を転送する
メモリ管理ユニット(MMU)
プログラム中の仮想アドレスは、メモリ管理ユニットへ送られる。メモリ管理ユニットは、これを物理アドレスへ変換する。
ページ表の問題
ページ表の目的=「仮想ページをページ・フレームにマッピングする」
1、ページ表の大きさは小さくしたい
32bit仮想アドレス、ページサイズ4KBのときのページ数は?
さらに、プロセスごとにページ表が必要だから・・・
2、高速にマッピングしたい
マッピングは、メモリ参照のたびに必要になる
ページ表の設計
・高速なハードウェア・レジスタの配列からなるページ表を一つ用意する
・プロセス動作時に、OSはメインメモリにあるプロセスのページ表をレジスタにロードする
↓
◎マッピング時にメモリ参照しなくて済む。→速い!
×ページ表が大きくなると高価になる
×コンテクスト切り替えのたびにページ表のロードが必要になる。→遅い!
逆に極端な設計
・ページ表全体をメインメモリに置く。
・ページ表の先頭を指すためのレジスタだけを用意する。
プロセス切り替え時には、ページ先頭だけロードする
↓
◎コンテクスト切り替えが速い
×メモリ参照が多すぎる
ページ表の設計は、性能に大きな影響を与える
例)あるレジスタを別のレジスタへコピーする命令
ページングがなければ、メモリ参照は_回
SPARCのページングなら、メモリ参照は_回
プログラムというのは、数ページしか使わないに違いない。
良く使うページだけ高速にアクセスできれば・・・
逆ページ表
連想メモリとともに使われる
連想メモリヒットすれば、逆ページ表は必要ない。
ミスしたとき、欲しい仮想ページを逆ページ表から探す。ハッシュで管理。
必要なページがメモリ内になければOSが調べる。
→従来のページ表←ディスクアクセスか
ページフォルトが発生したとき、OSはメモリから追い出すページを選択する。
→どうやって決めるか?
最適ページ置換アルゴリズム
次に起こるページフォールトを、できるだけ先のばしにすれば、最適なアルゴリズムとなる。
各ページが次に参照されるのが何時かはわからないので、実現は不可能。
実際のアルゴリズムの評価基準となる。
最前未使用(NRU)ページ置換アルゴリズム
最近使われていないページを追い出す
参照ビット、修正ビットを利用して、ページ使用/未使用の統計情報を得る。
・プロセス開始時に、両方のビットをクリアする。
・メモリアクセスに応じて、各々随時セットされる。
・定期的に(クロック割り込みで)参照ビットをクリアし、最近参照されたものが分かるようにする
最長不使用(LRU)ページ置換アルゴリズム
最適アルゴリズムにかなり近似した方法。
最後の数命令で頻繁に使用されたページは、続く数命令でもきっと頻繁に使われるに違いない。
→ページフォールとが発生したら、最も長期間使われていないページを追い出す。
高速な実装のためには、実現コストは低くない
完全実装するには?
・メモリ内の全ページをリスト管理する
・リスト先頭に最近使用されたページを置く
・メモリ参照のたびにリストを更新する