メモリ管理 4.3, 4.4 章

メモリ管理
4.3, 4.4 章
さだ
4.3 仮想メモリ
• プログラムが大きすぎてメモリに入りきらない問題
• オーバレイ:初期の解決策
–
–
–
–
プログラムを分割してメモリに格納する
プログラムのスワップイン・アウトはOSがやってくれる
プログラムの分割はプログラマの仕事
→大変!
• 仮想メモリ:現代の解決策
– プログラムコード,データ,スタックからなるプログラム全
体が物理メモリサイズを越えてもOK
4.3.1 ページング
• 仮想アドレス
–
–
–
–
例: MOVE REG, 1000
この1000というのが仮想アドレス
仮想アドレスは仮想アドレス空間を持つ
仮想アドレスはMMU (Memory Management Unit) で物
理メモリアドレスへ変換される
• 現代のMMUはたいていCPUに内蔵されています
• ページ
– 仮想アドレス空間を区切る単位
• ページフレーム
– 物理メモリ内の対応する部分
• マッピング
– 図4-10を参照
– 例:仮想アドレス8192→ページフレーム6
• 1ビットの存在/不在ビット
– 例:仮想アドレス32780→ない!
– CPUはOSへトラップ(ページフォールト)
• MMUの動作例
– 仮想アドレス8196 :0010,0000,000,0100
ページテーブル
– ページテーブル2を参照
オフセット
4.3.2 ページテーブル
• 実現のための問題点
– ページテーブルサイズが巨大になってしまう
– マッピングは高速でなければならない
• 例
– 仮想アドレス32bit,ページサイズ4KBだと
• 仮想ページ数=ページテーブルエントリ数は100万
• しかもページテーブルはプロセスごとに必要
• マルチレベルページテーブル
– 例えば,10,10,12 と区切る
– この場合,最大ページテーブ
ル数は1025になるが,実際は
もっと少なくて済む
• 図4-12の例だと4つ
• ページテーブルエントリの構造
– キャッシング不可:主にデバイスレジスタ用
– 参照ビット:ページ置き換えアルゴリズムに使われる
– 修正ビット:ページに書き込みがあるとセットされる,古い
ページフレームを読まない用
– 保護ビット:許可するアクセスの種類
– 存在・不在ビット
– ページフレーム番号
4.3.3 TLB
• ページングによる性能低下という問題
• 実は,多くのアクセスはある一部分のページ群へのアクセス
である
• TLB (Translation Lookaside Buffer)
– ページテーブルの一部分を変換するハードウェア
– TLBになかったらMMUにアクセス
– MMUはTLBにないことを前提に処理できる
4.3.4 逆引きページテーブル
• エントリ数が巨大
– 例:アドレス空間 4GB で,ページサイズが4096倍とだと
エントリ数は100万→ページテーブル当たり4MB必要
• 逆引きページテーブル
– ページフレーム1つにつき1つのエントリを持つ
• 例:物理メモリ256MBでページサイズが4KBであればエントリ数
は65536で良い
– 問題
• 仮想アドレスから物理アドレスへの変換が大変
– 解決策
• TLBを用いる
• ハッシュテーブルを用いて検索を高速化する
4.4 ページ置き換えアルゴリ
ズム
• ページフォールトが発生した場合に,どの
ページを追い出すか
– 頻繁にアクセスするページを追い出すと性能が
落ちる
– あまり使わないページを追い出せば性能が上が
る
4.4.1 最適ページ
置き換えアルゴリズム
• 最も理想的なアルゴリズム
– 最大のラベルを持ったページを追い出す
– 将来生じるページフォールトをなるべく遠い将来
においやる
• しかし,実現不可能
– OSは次に参照されるページを予測できないから
4.4.2 NRUアルゴリズム
• ページテーブルの参照・修正ビットを用いる
• 4つのカテゴリに分類
–
–
–
–
クラス0:参照も修正もされていない
クラス1:参照されていないが,修正されている
クラス2:参照されたが,修正されていない
クラス3:参照も修正もされた
• NRU (Not Recently Used) algorithm は空ではな
い最下位のクラスからランダムにページを消す
• 最適ではないが,容易な実装と十分な性能という特
徴を持つ
4.4.3 先入れ先出しページ置
き換えアルゴリズム
• いわゆる FIFO (First Input First Output)
• 古いページを優先的に消す
• しかし,古いページ=使われないページでは
ない!
• というわけで,このまま使われることはない
4.4.4 セカンドチャンス置き換
えアルゴリズム
• FIFOの改良版
• ページを時系列に並べる
• ページフォールトが起きたら古いページから参照
– もし参照ビットがセットされていれば,参照ビットをクリアし
て一番新しいページとして扱う
– もし参照ビットがなければ消す
4.4.5 クロックページ置き換え
アルゴリズム
• セカンドチャンス置き換えアルゴリズムの改
良
– ページをリスト上でせわしなく移動させているため
効率的でない
– 環状リストにする
– 実現方法が違うだけで本質的には同じ
4.4.6 LRUページ置き換えアルゴリ
ズム
• LRU (Least Recently Use
page)
– 最近使われたページはまたすぐに
使われるだろう,という戦略
– 実現可能であるがコストは小さくな
い
– 実現手法はいくつかある
– 例:図4-18
• ページテーブル数 n とすると,
n×nの行列を用意
• ページフレームkが参照されると
– 行kを全て1に設定
– 列kを全て0に設定
• ページフォールトの場合
– 行を2進法事とみなして値が最小
のもの=最も過去に参照された
4.4.7 LRU のソフトウェアによ
るシミュレーション
• LRUをソフトウェアで実現するのは無理
• ソフトウェアで実現する方法として NFU (Not Frequently
Used) アルゴリズム
– クロック割り込みごとに,ページごとに参照ビットの内容をカウントす
る
– ページフォールト時はそのカウンタが最小のものを消す
– 欠点は初期化しないこと
• 実はNFUでLRUをシミュレートできる(エージング)
– 修正点は2つ
• カウンタに加算する前にカウンタを1ビット右へシフト
• 参照ビットをカウンタ内の最左端に加算する
– 厳密な違いも2つ
• 最後にアクセスされたのが分からない(例:図4-19 (e) の3,5)
• カウンタのビット数は有限であること
4.4.8 ワーキングセットページ
置き換えアルゴリズム
• ワーキングセット
– プロセスが現在使用中のペー
ジのセット
• ワーキングセットモデル
– 各プロセスのワーキングセット
を記録し,プロセス実行前にメ
モリに持ってくるモデル
– 多くのプログラムは一部分の
ページにしかアクセスしない
→単調非減少関数になる
w(k, t)
– Kの値を予め決めておくと,ワー
キングセットが一意に決まる
k:メモリ参照
• アルゴリズムの近似
– k回のメモリ参照の代わりに実行時間を用いる
– カレント仮想時間
• プロセスが開始後に実際に使用したCPU時間
– 年齢
• カレント仮想時間ー最後に使用された時間
4.4.9 WSClockページ置き換
えアルゴリズム
• ワーキングセットアルゴリズムを改善したもの
– Working Set Clock アルゴリズム
– クロックページ置き換えアルゴリズムとワーキン
グセットアルゴリズムを足したようなもの
– 図4-22を参照
4.4.10 ページ置き換えアルゴリ
ズムのまとめ
• 図4-23を参照
• いい感じなのは
– エージング
– WSClock