記憶管理(1)

記 憶 管 理(1)
オペレーティングシステム
第8回
注 意


CPUは一つ
 実行可能状態のプロセスは複数個ありうる
 しかし,実行中のプロセスは一つ
物理的メモリに関係した話なので,プロセスでは
なく,プログラムという言葉を用いることにする
記 憶 管 理 と は(1)

プログラムを実行するには,メモリに格納


メモリのどこに格納するのか?
プログラムが終了したら,格納場所(メモリ)は
どうするのか?
記 憶 管 理 と は(2)



プログラムの実行に必要なメモリを割り当てる
 格納する場所を決める
不要になったメモリを解放する
 終了したら,別のプログラムを格納できるよう
にする ⇒ 別のプログラマを実行できるように
する
というOSの機能(メモリの割当て・解放)を“記憶
管理”
記 憶 管 理 と は(3)


同時に実行するプログラムが一つ
A → B → C の順に実行
記 憶 管 理 と は(4)

同時に複数個のプログラムを実行する
スワッピング(1)


実行中のプログラムは,ある時点では一つ
そのプログラムだけがメモリに格納されていれば
よい
スワッピング(2)
実行中の時だけ,メモリに格納
スワッピング(3)





プログラム A,B
Aを実行する時は,Aをメモリに
Bを実行する時は,Aを外部記憶装置(HDDなど)
に退避し,Bをメモリに
Aを実行する時は,Bを退避し,外部記憶装置に
退避したAをメモリに
…
スワップイン メモリに読み込むこと
スワップアウト メモリから書き出すこと
スワッピング(4)


コンテクストスイッチの時に,入れ替える
 入れ替えに時間がかかる
メモリの容量が増えれば,複数個のプログラムを
同時に格納できるような場合が多くなる
 “記憶管理とは(4)”の左
 どのように複数のプログラムを格納するか?
固定区画方式(1)


メモリをあらかじめ区
切る
各区画にプログラム
を格納し,実行する
固定区画方式(2)



二つのプログラムを格
納
区画に空きが生じる
メモリには余裕があっ
ても,区画の大きさよ
り大きなプログラムは
実行できない
単純な方式(1)



メモリの最初から,順
に格納する
Bが終了(Bが格納さ
れていたメモリを再利
用)
Dを実行
単純な方式(2)



Dを格納できない
メモリの空いている
場所(使える領域)
が,散らばる
 メモリの断片化
Cの格納場所をずら
せば,Dは格納でき
る
大きな問題



プログラムを実行するためには,メモリに格納す
実行するプログラムが複数
る
の場合は,それらの合計
メモリの大きさよりも,大きなプログラムを実行す
ることはできない
メモリを大きくしても,それより大きなプログラム
を実行したくなる
より多くのプログラムを
実行したくなる
よく考えてみると


プログラム全体をメモリに格納する必要はない
プログラムを分割し,実行するのに必要な部分
のみをメモリに格納
 必要ない部分はディスクなどの補助記憶装置
に格納
 実際には,全体をディスクに格納しておき,必
要になった部分だけをメモリに格納する
二つの方法(1)

実際のメモリの大きさよりも,大きなプログラムを
実行できるようにする二つの方法

オーバーレイ

仮想記憶
二つの方法(2)


いずれの方法であっても
 プログラムをどのように分割するのか
 分割した部分のどれを,メモリのどこに格納す
るのか
ということなどを決めなければならない
オーバーレイ
重ね割付け
オ ー バ ー レ イ(1)

プログラムの分割方法や,実行に必要な部分の
指示を利用者(プログラマ)が行う

overlay 重ね割付け

どちからかというと古典的手法
オ ー バ ー レ イ(2)




A,B,C,Dの4つの部
分(モジュール)にプ
ログラムを分割
プログラムの実行開
始→Aから
AがBを呼び出す
Bが終了→Aに戻る
(Bは不要になる)





AがCを呼び出す
Cが終了→Aに戻る
(Cは不要になる)
AがDを呼び出す
Dが終了→Aに戻る
Aが終了→プログラム
の終了
Aが中心的な働きをする
メモリに常駐
このようなモジュールがある
オ ー バ ー レ イ(3)

今の関係を図式化すると
上の
モジュール
が,下の
モジュール
を呼び出す
↓
同時にメモ
リに格納
横に並んでいるモジュールは,
同時にメモリに格納する必要
はない
オ ー バ ー レ イ(4)


AがBを呼び出すときに,Bをメモリに格納する
 Aはメモリに残しておく
メモリを読み込む単位をオーバーレイセグメント
と呼ぶ
 先の例では,モジュール=オーバーレイセグメ
ント
 いくつかのモジュールをひとつのオーバーレイ
セグメントとする場合もある
問題
BがCを呼び出す場合は,
どうなるか?
この大きさのメモリが
あれば,実行できる
オ ー バ ー レ イ(5)
B,CとDは同時にメモリに格納されない
“BがCを呼び出す”というようなことは不可
オ ー バ ー レ イ(6)

プログラムの分割と必要な部分の指示はプログ
ラマが行わなければならない


プログラムのことは,プログラムを作った者が
よく知っているはず
しかし,易しいことではない
仮想記憶
仮 想 記 憶(1)


プログラムの分割,メモリへの読み込みを自動的
に行う
 OSが行う
プログラム全体がメモリに格納されているものと
する
 ただし,そのメモリは実際のメモリではなく,仮
想メモリ(仮想記憶)
仮 想 記 憶(2)

プログラムが格納され
ている仮想記憶を一
定の大きさのページに
分割
 ここでは,ページの
大きさを4096バイト
とする
 プログラムの内容
ではなく,大きさで
分割
仮 想 記 憶(3)

実際のメモリ(実記
憶)も,ページと同じ
大きさのページ枠(ブ
ロック)に分割
仮 想 記 憶(4)


仮想記憶はディスクな
どの補助記憶装置
プログラムの実行に
伴い,必要なページ
のみを実記憶のペー
ジ枠に格納
仮 想 記 憶(5)



以上のことを,OSが行う
仮想記憶の大きさ > 実記憶の大きさ
であってもかまわない
プログラマにメモリの大きさを意識させない
仮 想 記 憶(6)


各ページには,ページ
番号
各ページ枠(ブロック)
には,ページ枠番号(
ブロック番号)
仮 想 記 憶(7)


ページ表
仮想記憶の各ページに対して
 実記憶に格納されている
 ページ枠の番号又はページ枠の先頭番地
 実記憶に格納されていない
 そのことが分かるような印
仮 想 記 憶(8)

ページ表の例
ページ枠の
最初の番地の
場合もある
1ならば,実記憶にあり
0ならば,なし
仮 想 記 憶(9)


プログラム中でデータ
や命令を参照
データや命令の番地
は
 格納されている
ページ番号
 そのページの先頭
からの相対番地
(0~4095)
ページ1の先頭
からの相対番地
前提
ページの大きさを
4096としている
仮 想 記 憶(10)

仮想記憶の4098番地
 ページ番号が1で,相対番地が2である
(相対番地は0~4095:12ビット)
仮 想 記 憶(11)


仮想記憶のページ1
が,65536番地から始
まるページ枠に格納
仮想記憶の4098番地
の実記憶での番地
4098番地は
ページ1の
2番地
仮 想 記 憶(12)



ページ番号1のページ
ページ表を調べると65536番地から始まるページ
枠
実記憶での番地は65536 + 2 = 65538番地
 ページ枠の先頭からの番地は,ページの先頭
からの番地と同じ(相対番地)
仮 想 記 憶(13)




プログラムの実行中にある番地を参照
その番地のページ番号
ページ番号をページ表で調べる
該当ページが実記憶にない
 ページフォールトという割込み
 該当ページの実記憶への読み込みと
ページ表更新
仮 想 記 憶(14)

空いているページ枠がない

使用中のページ枠を空けて,そこに読み込む

空けるページ枠の決め方
 ページ置換えアルゴリズム
 次回
仮 想 記 憶(15)


あるページがいつも,同じページ枠に格納され
るとは限らない

格納されるたびに変わると考えるべき
番地を参照するたびに,番地の計算を行う

動的番地変換
仮 想 記 憶(16)


仮想記憶や実記憶を同じ大きさに分割する方
式をページ方式
セグメント方式と呼ばれるものもある
まとめ




実際のメモリよりも,大きなプログラムを実行した
い
実行に伴い,その時,その時で必要な部分だけ
がメモリにあれば良い
オーバレイ
 どこが必要なのかの指示をプログラムが行う
仮想記憶
 必要になった部分をOSがメモリに格納する