記 憶 管 理(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 重ね割付け どちからかというと古典的手法 オ ー バ ー レ イ(2) A,B,C,Dの4つの部 分(モジュール)にプ ログラムを分割 プログラムの実行開 始→Aから AがBを呼び出す Bが終了→Aに戻る (Bは不要になる) AがCを呼び出す Cが終了→Aに戻る (Cは不要になる) AがDを呼び出す Dが終了→Aに戻る Aが終了→プログラム の終了 オ ー バ ー レ イ(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) プログラム中でデータ や命令を参照 データや命令の番地 は 格納されている ページ番号 そのページの先頭 からの相対番地 (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