Operating System Lecture 6/19

先週の復習 -- 16進の計算練習



アドレス変換

メモリは、OS下の複数のプロセス、ユーザから要求されている。この時に、 個々のプロセスでは、あたかも自分一人がCPUとmemoryを専用している下のように 見えた方が良い。これは仮想プロセッサと呼ばれるものであった。仮想プロセッサの メモリと実際のメモリを結びつけるには、アドレス変換(Address Translation) という技術を用いる。


この時に、flagmentation を防ぐために、実際のメモリ(Physical memory) は、前もって細分化されて、それの不連続(non-contiguous)な集合が、 プロセスのメモリ(Virtual Memory)上での連続なメモリに対応するように なっている。

論理メモり空間(Logical Address) を物理メモり空間(Physical Address)に 変換するメカニズムがアドレス変換である。これにより、メモリの割り当て、 返却によるメモリ使用の細分化(fragmentation)を防ぐことができるだけでなく、 複数のプロセスに対して、一つの物理メモリを、あたかも自分の固有のアドレス 空間(Memory Spcace)であるかのように割り当てることができる。 変換の単位は、frame (or page ) と呼ばれる。普通は、512byte - 4096byte 程度である。32bit CPU の場合、メモリのアドレスは、0x00000000 から 0xffffffff の16進数で表すことができる。Page size ごとに frame 番号 が振られていて、メモリのアドレスは、frame 番号と、frame の中の offset で表される。例えば、Page size = 0x10000 ならば、0x80000500 のアドレスのframe番号は 0x8000 で、offset は 0x0500 となる。 (0x80000500 = 0x8000 x page size + offset )





問1

Page size = 4096 の時に、メモリアドレス 0x01234321 の frame 番号と、 offset を16進数で計算せよ。0xfffffecc はどうか?

問2

0x01234321 と 0xfffffecc に対応するアドレス変換テーブル(page entry table)の offset はいくつか? それぞれに対応するoffset のアドレス変換テーブルの内容は、それぞれ0x1344と、0x1233 で あった。それぞれのアドレスはどのように物理アドレスに変換され るか。



アドレス変換用のメモリ

ただし、この表も、64bit/32bit のメモリ空間に対しては、かなり大きくなって しまう。

問3

frame size を4kbyte とした時に、32bit memory spaceで必要なpage table の大きさを求めよ。 64bit ではどうか? 7Gbyte (Enterprise 3000のメモリのフル実装)ではどうか? 一つのpage table entry の大きさは32bitの時に16byte、64bitの時に32byteとする。



Multi level page-table scheme

そこで、この変換を2重3重にしておこなう。この多重変換により、ページテーブル 自身を仮想記憶上に置くことができるので、変換テーブルが大きくなっても 実メモリを圧迫しなくなる。


問4

32bit address に対して、 2重の変換を行った時に、frame size 2kbyte, p1 のbit幅8とする時に、 p2 のbit 幅はいくつか? この時に必要な page table entry の大きさは いくつか?

この変換はhardware にとっても重いので、このpage entry を cache するという技術が使われる。これを、TLB (Traslation lookup buffer) という。最近では、プロセスごとにTLBを持つTagged TLBという 機能も使われている。




Segmentation

もし、CPUが16bitデータしか扱う能力がない時に、32bitアドレスを扱いたい 時にはどうすればよいだろうか? 80x86 architecture などでは、segmentation という技術が使われている。これは、CPUから出力されるアドレスをCPUの アドレスレジスタだけでなく、Segment Register との組で表すものである。 通常は単なるshift + 加算で処理が行われる。

Paging を行う場合は、Segment RegisterにはPage Entry Table そのものを 使っても良い。この場合は、Segment Register の数値にはさまざまな意味が 与えられる。

8086 では、Segment register は4つ(CS,DS,ES,SS)あり、アドレス を指示できるアドレスレジスタは6つである(BX,SI,DI,BP,SP,IP)。 それぞれ16bit幅であり、Segment register は 4bit shiftされて アドレスレジスタに加算される。CS:IP で CS segemnet を使って、 segment の中で IP のoffset を持つアドレスを指示することになる。


問5

8086 で表すことのできる最大のメモリ空間の大きさはいくつか? CS の内容は、0x1234, IP の内容は、0x0ffe であった。CS:IP で 表される論理アドレスはいくつか?

問6

Segmentation に対して、一つのレジスタでアドレスを指示する方法を Linear address (線形アドレス)という。Paging をおこなうシステム において、Segmentation と Linear address の優劣を比較して論ぜよ。 (ヒント: アドレス空間が大きい時、小さい時を比較しよう。プログラム のしやすはどうか? システムプログラムはどちらが書きやすいか? 効率は? )

仮想記憶 Virtual Memory

メモリはいくらあっても足りないものだが、そのメモリはいつも使われている わけではない。一方、メモリと磁気ディスクのような大容量外部記憶を比較すると、 常に外部記憶の方が安価である。そこで、paging されたメモリの一部を 磁気ディスクに移すという方法が考えられる。これは、メモリ上にはない メモリ空間を作ることになる。これを仮想記憶(Virtual Memory)という。

技術的には、Page Entry Table に、そこが実際にメモリが割り当 てられているかどうかを示すbitを付けるだけでよい。もし、CPUが メモリの割り当てられていないPage Entry Tableをアクセスすると、 CPUは割り込みを発生する。その割り込みにより、OS がそのPageを 実際のメモリに割り当て、ディスクから内容を複写する。 これをPage in, Swap in という。この時に、 CPU は割り込みを起こした命令を正確に再実行する必要がある。 メモリで使う確率が少ないものをディスクに追い出すことをSwap out またはPage outという。

ディスク上には、 仮想メモリの内容をとって置く場所を確保する 必要がある。これをSwap領域という。Swap 領域は、特別なDisk 領域を取る場合もあるし、普通のファイルとして実現する場合もある。 さらに、Network を経由してSwapしてもよい。


仮想記憶の制御

Unixでは、mmap ( memory map )というシステムコールによって、 仮想記憶を制御することができる。この機構は、共有メモリを 実現したり、ファイルとメモリの対応を実現したりすることが できる。これらの機能は、Mach OS により最初に実現されて、 Sun OS そして、BSD/OS などにも使われるようになった。

問7 : 共有メモリを実現するmmap

mmap_test.c は、共有メモリを使用するmmapの例である。 man mmap を参考にしながら、このプログラムの動作を説明せよ。

問8 : mmap によるコピー

mmap_copy.c は、mmap を使ったファイルコピーである。 通常のread/write とどのように動作が異なるかを説明せよ。また、 実際に動作させて、cp との時間を測定してみよ。
time cp a b
などとすることにより、時間を測定することができる。I/Oなどの数字にも 注目すること。また、1回目のcopyと2回目のcopyでは動作が異なる。それは 何故か?

宿題

今日できなかった残りの問題を以下のサブジェクトでE-Mailで、 kono@ie.u-ryukyu.ac.jp まで来週までに提出すること。

    Subject: Report on Operating System Lecture 6/26