メモリはいくらあっても足りないものだが、そのメモリはいつも使われている わけではない。一方、メモリと磁気ディスクのような大容量外部記憶を比較すると、 常に外部記憶の方が安価である。そこで、paging されたメモリの一部を 磁気ディスクに移すという方法が考えられる。これは、メモリ上にはない メモリ空間を作ることになる。これを仮想記憶(Virtual Memory)という。 必要に応じて、ディスクの内容をメモリにコピーしたり、メモリの内容を ディスクに書き出すことにより、仮想的にメモリを実現する。
もちろん、これをファイル操作などによりアプリケーションレベルで実現する こともできる。これは、overlay などと呼ばれ、MSDOS 2.x, 3.x などでは良 く使われていた。また、Intel 8086 のようなアドレス空間よりも大きなメモ リを実装するシステムの場合、Window と呼ばれる部分に、他のメモリをマッ プすることも行われていた。これは、Extendene Memory Management (EMM) と 呼ばれ、MSDOS のもっとも汚いAPIの一つとなった。このようなことをすると、 OSで共通に実装するべき部分をアプリケーションで繰り返し実装する必要があ り、しかも、この部分はかなり複雑なので、バグを呼びやすい。32bit CPUで は、将来的にこのようなWindowサポートが必要になる可能性はあるが、64bit CPUでは、その心配はないと思われる。64bit OSは既に実用レベルにあるが、 広く広まるには、まだ数年は時間がかかると思われる。
ディスク上には、 仮想メモリの内容をとって置く場所を確保する
必要がある。これをSwap領域という。Swap 領域は、特別なDisk
領域を取る場合もあるし、普通のファイルとして実現する場合もある。
ファイルシステム上の空き領域をSwapに用いる場合もある。
さらに、Network を経由してSwapしてもよい。この場合も、NFS経由で
Swapする方式と、直接、ネットワーク経由でディスクにアクセスする
方法(remote disk)の2種類が存在する。
技術的には、Page Entry Table に、そこが実際にメモリが割り当 てられているかどうかを示すbitを付けるだけでよい。もし、CPUが メモリの割り当てられていないPage Entry Tableをアクセスすると、 CPUは割り込みを発生する。これを page fault という。 その割り込みにより、OS がそのPageを 実際のメモリに割り当て、ディスクから内容を複写する。 これをPage in, Swap in という。この時に、 CPU は割り込みを起こした命令を正確に再実行する必要がある。 メモリで使う確率が少ないものをディスクに追い出すことをSwap out またはPage outという。
実際のpage fault では、命令の再実行を正確に行う必要がある。
これはCPUがサポートする必要がある。(意外に複雑なことになる)
例えば、68000 は再実行を正確に行うことができず、68010という
別なCPUを開発するはめになった。
page fault の処理の最中に、もう一度 page fault が起こると、
これは致命的なことになる。これを double page fault という。
平均page-falut処理時間が25m sec, memory access 100n sec の時に、 page fault rate が、1% の時の effective access time を求めよ。 page fault rate が、0.001% の時の effective access time を求めよ。 性能低下を 20%以下にするためには、page fault rate はいくらで なければならないか。
effective access time = (1-p) x (memory access time) + p x (page fault time)
page-replacement する時に、どのpageを書きだせば良いのだろうか? これを決めるアルゴリズムはいくつか知られている。
仮想記憶はメモリとSwap領域を接続する。つまり、メモリとディスク上の ファイルに対応があることになる。 メモリをアクセスすることと ファイルにアクセスすることは、ここでは同一になる。
Unixでは、mmap ( memory map )というシステムコールによって、 仮想記憶を制御することができる。この機構は、共有メモリを 実現したり、ファイルとメモリの対応を実現したりすることが できる。これらの機能は、Mach OS により最初に実現されて、 Sun OS そして、BSD/OS などにも使われるようになった。
メモリに書き込みがない場合には、そのSwap領域は 書きだす必要がない。mmap の場合は、 書き込みを行った時にはメモリ の内容をファイルに書きだすことになる。 これをcopy-on-writeという。
リアルタイム処理などでは、プログラムやデータが仮想記憶に追い出されてし まうと、致命的な処理時間の遅延が生じる。そこで、メモリの特定領域を実メ モリに固定する方法が使われる。これは、メモリのpin down (ピン止め)と呼 ばれる。Sun OSやBSD/OS では、mlock/munlock によりpin downすることが可 能である。
以下の問題は再度、考察すること。
time cp a bなどとすることにより、時間を測定することができる。一回目ののコピー と二回目のコピーの時間差についても考察せよ。また、コピー先を削除 した場合はどうか? (時間差がはっきり分かるように、大きめのファイルを コピーする必要がある。
今日できなかった残りの問題を以下のサブジェクトでE-Mailで、 kono@ie.u-ryukyu.ac.jp まで来週までに提出すること。
Subject: Report on Operating System Lecture 7/3