記 憶 管 理(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がメモリに格納する
© Copyright 2025 ExpyDoc