創傷歷史與集體記憶── 作為交流型記憶和文化記憶的文學 摘要創傷歷史與集體記憶──作為交流型記憶和文化記憶的文學 287 誤,5 結果造成「好心辦了壞事」。6
記 憶 管 理(1)
description
Transcript of 記 憶 管 理(1)
記 憶 管 理(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 )
前提ページの大きさを
4096としている
ページ 1 の先頭からの相対番地
仮 想 記 憶(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 がメモリに格納す
る