←OS論シラバスへ
←講義のツボメニューへ

メモリ

【2001.11.5,11.9】【第11、12回】
 ページング
 ・仮想アドレス空間をページ単位で分割する
 ・物理メモリをページフレーム単位で分割する
ページ単位でディスクとメモリ間を転送する

 メモリ管理ユニット(MMU)
 プログラム中の仮想アドレスは、メモリ管理ユニットへ送られる。メモリ管理ユニットは、これを物理アドレスへ変換する。

 ページ表の問題
 ページ表の目的=「仮想ページをページ・フレームにマッピングする」
 1、ページ表の大きさは小さくしたい
  32bit仮想アドレス、ページサイズ4KBのときのページ数は?
  さらに、プロセスごとにページ表が必要だから・・・
 2、高速にマッピングしたい
  マッピングは、メモリ参照のたびに必要になる

ページ表の設計
 ・高速なハードウェア・レジスタの配列からなるページ表を一つ用意する
 ・プロセス動作時に、OSはメインメモリにあるプロセスのページ表をレジスタにロードする
             
 ◎マッピング時にメモリ参照しなくて済む。→速い!
 ×ページ表が大きくなると高価になる
 ×コンテクスト切り替えのたびにページ表のロードが必要になる。→遅い!

逆に極端な設計
 ・ページ表全体をメインメモリに置く。
 ・ページ表の先頭を指すためのレジスタだけを用意する。
  プロセス切り替え時には、ページ先頭だけロードする
            
 ◎コンテクスト切り替えが速い
 ×メモリ参照が多すぎる

ページ表の設計は、性能に大きな影響を与える
例)あるレジスタを別のレジスタへコピーする命令
  ページングがなければ、メモリ参照は_回
  SPARCのページングなら、メモリ参照は_回

プログラムというのは、数ページしか使わないに違いない。
良く使うページだけ高速にアクセスできれば・・・

 逆ページ表
 連想メモリとともに使われる
  連想メモリヒットすれば、逆ページ表は必要ない。
 ミスしたとき、欲しい仮想ページを逆ページ表から探す。ハッシュで管理。
 必要なページがメモリ内になければOSが調べる。
  →従来のページ表←ディスクアクセスか

ページフォルトが発生したとき、OSはメモリから追い出すページを選択する。
 →どうやって決めるか?

最適ページ置換アルゴリズム
 次に起こるページフォールトを、できるだけ先のばしにすれば、最適なアルゴリズムとなる。
 各ページが次に参照されるのが何時かはわからないので、実現は不可能。
 実際のアルゴリズムの評価基準となる。

最前未使用(NRU)ページ置換アルゴリズム
 最近使われていないページを追い出す
 参照ビット、修正ビットを利用して、ページ使用/未使用の統計情報を得る。
 ・プロセス開始時に、両方のビットをクリアする。
 ・メモリアクセスに応じて、各々随時セットされる。
 ・定期的に(クロック割り込みで)参照ビットをクリアし、最近参照されたものが分かるようにする

最長不使用(LRU)ページ置換アルゴリズム
 最適アルゴリズムにかなり近似した方法。

 最後の数命令で頻繁に使用されたページは、続く数命令でもきっと頻繁に使われるに違いない。
 →ページフォールとが発生したら、最も長期間使われていないページを追い出す。

 高速な実装のためには、実現コストは低くない

  完全実装するには?
  ・メモリ内の全ページをリスト管理する
  ・リスト先頭に最近使用されたページを置く
  ・メモリ参照のたびにリストを更新する