←講義のツボメニューへ
←OS論シラバスへ メモリ
【2001.10.29,11.02】【第9、10回】メモリ・マネージャ
メモリを管理するOSの部分
・メモリの使用中/未使用中 の部分を記録する
・プロセスが必要となったメモリを割り当てる
不要となったら開放する
・ディスクとメモリ間のスワッピングを管理する
←メインメモリの容量不足で、プログラムを一括して保持できない場合に備えて
多重プログラミングのモデル化
あるプロセスにつ、時間比率がPで入力待ちになるとする。
入力待ちでCPUがアイドル→P
計算にCPUを使う→1−P
このプロセスが、アイドルになる確率はP
↓
n個のプロセスがメモリ上にあるとき、
n個のプロセス全部が入出力待ちになる確率はPn
メモリに複数プロセスを同時に配置するためのメモリ構成は?
→最も簡単な方法「起動時にメモリをn個に分割しておく」
固定パーティション
ユーザプログラムは、
どのパーティションで実行されるかわからない。
↓
多重プログラミングで解決しなければならない問題
再配置←ロード先パーティションが変わると、メモリの絶対アドレスが変わってしまう。
保護←別パーティションの内容を破壊してはいけない。別パーティションにジャンプしてはいけない。
再配置の単純な解決案
→プログラムをメモリにロードするたびに、命令を修正する。
・実装するために
←「修正すべき命令はどれか、修正してはならない命令はどれか」
をバイナリ・プログラム内に明記しておく。
※ただし、これでは保護については解決できない
再配置と保護の両方の解決策
2つの特別なレジスタ:ベース(base)、リミット(limit)
・命令本体の変更はしない
プロセスをスケジュールするときに、ベースとリミットが設定される。
・アクセスするメモリアドレスに、ベースレジスタの値が自動加算される
・リミットについてもチェックされ、パーティション外のアクセスを禁止する
スワッピング(swapping)
タイムシェアリングでは、すべてのユーザプロセスをメモリに保持しきれないとき、
入りきらないプロセスは、ディスクへ置く必要がある。
固定パーティションでスワッピングすると ・可変パーティションは、パーティションの個数、位置、大きさがプロセスの出入りに応じて変化する。
↓
・プログラムがパーティションより大きいと、メモリにロードできない。
・プログラムがパーティションより小さいと、パーティションの残りが無駄になる
↓
そこで可変パ−ティションを使う。
プロセスに対して、メモリはどれだけ割り当てるべきか?
・プロセスが必要なメモリ量が、実行時に増えないならば、
あらかじめ固定サイズを割り当てれば済むので簡単
・実行中にメモリが成長することが予測されるなら、
あらかじめ余分なメモリを割り当てておく
連結リストによるメモリ管理
リストのエントリは、次で構成される。
1、空きまたはプロセスが使っている
2、開始するアドレス
3、長さ
4、次のエントリへのポインタ
バディ・システムによるメモリ管理
バディ・システム:プロセスが終了したり、スワップアウトするときに解放する領域と、
その隣接する空き領域との統合を高速化するアルゴリズム。
アドレス指定に2進数を使用することを利用する
バディ・システムの利点:大きさ2kバイトのブロックが解放されるとき、統合が可能かどうか調べるために、
2kバイトのリストだけ探せばよい。←高速
→任意長のブロックで分割できるようにすると、空きリスト全体を検索しなければならない。
バディ・システムの欠点:欲しいサイズが35Kバイトだったとしても、64Kバイト割り当てられる。
つまり、メモリ利用率の観点からは、効率が悪い。
(上の例では、64−35=29Kバイト無駄になる)