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

メモリ

【2001.10.29,11.02】【第9、10回】
 メモリ・マネージャ
  メモリを管理するOSの部分
   ・メモリの使用中/未使用中 の部分を記録する
   ・プロセスが必要となったメモリを割り当てる
    不要となったら開放する
   ・ディスクとメモリ間のスワッピングを管理する
    ←メインメモリの容量不足で、プログラムを一括して保持できない場合に備えて

 多重プログラミングのモデル化
  あるプロセスにつ、時間比率がPで入力待ちになるとする。
  入力待ちでCPUがアイドル→P
  計算にCPUを使う→1−P


  このプロセスが、アイドルになる確率はP
           ↓
  n個のプロセスがメモリ上にあるとき、
 n個のプロセス全部が入出力待ちになる確率はP

  メモリに複数プロセスを同時に配置するためのメモリ構成は?
  →最も簡単な方法「起動時にメモリをn個に分割しておく」

 固定パーティション
          ユーザプログラムは、
   どのパーティションで実行されるかわからない。
              ↓
  多重プログラミングで解決しなければならない問題

 再配置←ロード先パーティションが変わると、メモリの絶対アドレスが変わってしまう。
 保護←別パーティションの内容を破壊してはいけない。別パーティションにジャンプしてはいけない。

  再配置の単純な解決案
  →プログラムをメモリにロードするたびに、命令を修正する。
  ・実装するために
   ←「修正すべき命令はどれか、修正してはならない命令はどれか」
    をバイナリ・プログラム内に明記しておく。
    ※ただし、これでは保護については解決できない

 再配置と保護の両方の解決策
  2つの特別なレジスタ:ベース(base)、リミット(limit)
  ・命令本体の変更はしない
   プロセスをスケジュールするときに、ベースとリミットが設定される。
  ・アクセスするメモリアドレスに、ベースレジスタの値が自動加算される
  ・リミットについてもチェックされ、パーティション外のアクセスを禁止する

 スワッピング(swapping)
  タイムシェアリングではすべてのユーザプロセスをメモリに保持しきれないとき、
  入りきらないプロセスは、ディスクへ置く必要がある。

固定パーティションでスワッピングすると

・プログラムがパーティションより大きいと、メモリにロードできない。
・プログラムがパーティションより小さいと、パーティションの残りが無駄になる

そこで可変パ−ティションを使う。

  ・可変パーティションは、パーティションの個数、位置、大きさがプロセスの出入りに応じて変化する。

 プロセスに対して、メモリはどれだけ割り当てるべきか?
  ・プロセスが必要なメモリ量が、実行時に増えないならば、
   あらかじめ固定サイズを割り当てれば済むので簡単
  ・実行中にメモリが成長することが予測されるなら、
   あらかじめ余分なメモリを割り当てておく

 連結リストによるメモリ管理
  リストのエントリは、次で構成される。
  1、空きまたはプロセスが使っている
  2、開始するアドレス
  3、長さ
  4、次のエントリへのポインタ
 バディ・システムによるメモリ管理

  バディ・システム:プロセスが終了したり、スワップアウトするときに解放する領域と、
              その隣接する空き領域との統合を高速化するアルゴリズム。
              アドレス指定に2進数を使用することを利用する
  バディ・システムの利点:大きさ2kバイトのブロックが解放されるとき、統合が可能かどうか調べるために、
                 2kバイトのリストだけ探せばよい。←高速
                 →任意長のブロックで分割できるようにすると、空きリスト全体を検索しなければならない。

  バディ・システムの欠点:欲しいサイズが35Kバイトだったとしても、64Kバイト割り当てられる。
                 つまり、メモリ利用率の観点からは、効率が悪い。
                (上の例では、64−35=29Kバイト無駄になる)