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