Operating System Lecture 12/18
Menu Menu来週 1/15 は、お休みです。
先週の復習 -- 仮想記憶
問1
平均page-falut処理時間が25m sec, memory access 100n sec の時に、性能低下を20%以下にするためには、page fault rate はいくらでなければならないか。
effective access time = (1-p) x (memory access time) + p x (page fault time)
Page Replacement
page-replacement する時に、どのpageを書きだせば良いのだろうか? これを決めるアルゴリズムはいくつか知られている。
- FIFO
- Optimal
- LRU (Counters, Stack)
Unix では、pageout あるいは、swapper と呼ばれるプロセスが、使われていないメモリをディスクに追い出している。
問2
メモリを大量に消費するプログラムを C または、Perl で記述し、実際に swap が起きる様子を観察せよ。
仮想記憶の制御
ページアウトする場合は、非常に多くの時間がかかる。これは、実時間プログラムにとっては、致命的である。Unix では、特定のページを実メモリに固定することができる。
mlock, munlock - lock (unlock) physical pages in memory
#include <sys/types.h>
#include <sys/mman.h>
int
mlock(void *addr, size_t len);
int
munlock(void *addr, size_t len);
問3
このシステムコールを呼び出す例題を作成し、前問のプログラムと一緒に動作させて、その様子を観察せよ。
mmap
仮想記憶はメモリとSwap領域を接続する。つまり、メモリとディスク上のファイルに対応があることになる。メモリをアクセスすることとファイルにアクセスすることは、ここでは同一になる。
Unixでは、mmap ( memory map )というシステムコールによって、仮想記憶を制御することができる。この機構は、共有メモリを実現したり、ファイルとメモリの対応を実現したりすることができる。これらの機能は、Mach OS により最初に実現されて、Sun OS そして、BSD/OS などにも使われるようになった。
SYSV IPC にも共有メモリがある。これと、mmap のAPI (Application Program Interface) を比較して見よう。特に、名前空間の取り扱いに注目しよう。
メモリに書き込みがない場合には、そのSwap領域は書きだす必要がない。mmap の場合は、書き込みを行った時にはメモリの内容をファイルに書きだすことになる。これをcopy-on-writeという。
リアルタイム処理などでは、プログラムやデータが仮想記憶に追い出されてしまうと、致命的な処理時間の遅延が生じる。そこで、メモリの特定領域を実メモリに固定する方法が使われる。これは、メモリのpin down (ピン止め)と呼ばれる。Sun OSやBSD/OS では、mlock/munlock によりpin downすることが可能である。
madvice
共有メモリのアクセスパターンをシステムに教える。
問4 : 共有メモリを実現するmmap
mmap_test.c は、共有 メモリを使用するmmapの例である。man mmap を参考にしながら、このプログラムの動作を説明せよ。プログラムを変更し、リアルタイムで、共有された情報が変化することを確認せよ。
問5 : mmap によるコピー
mmap_copy.c は、mmap を使ったファイルコピーである。 通常のread/write とどのように動作が異なるかを説明せよ。また、実際に動作させて、cp との時間を測定してみよ。
time cp a b
などとすることにより、時間を測定することができる。一回目ののコピーと二回目のコピーの時間差についても考察せよ。また、コピー先を削除した場合はどうか? (時間差がはっきり分かるように、大きめのファイルをコピーする必要がある。
問6 : mmap の改良
このプログラムをfjに公開したところ、以下のようなコメントをもらった。コメントにしたがってプログラムを改良し、時間を測定して見よ。
In article <199809030356.MAA10105@srapc459.sra.co.jp>, Makoto Ishisone writes:
> mmap だけを使うのではなくて、mmap と write の組合せで使わないと意味が
> ないと思います。書き出しも mmap を使っちゃうと、せっかく read を使わな
> いことでメモリコピーを節約したのに、結局自分で memcpy することになっちゃ
> いますから。
>
> mmap+write だと、極端な話 /dev/null にコピーする場合、ほとんど何もしな
> いに等しいのですごく速くなります。それに意味があるかどうかは別として。
>
> 添削してみたバージョンをつけておきます。mmap+write に変えた以外に、
> ・open() の結果のチェックが間違っていたので修正
> ・mmap() の結果のチェックに MAP_FAILED を使うように修正
> ・exit() の値が逆 (正常終了なら 0、異常終了なら 1 にすべき)
> だったので修正
> ・その他エラーメッセージの表示方法を好みにあわせて変更
> してあります。FreeBSD で確かめましたが、BSD/OS だと修正が必要かも。
> -- ishisone@sra.co.jp
In article <snm4suo6psa.fsf@ludwig.spp.hpc.fujitsu.co.jp>, HASHIMOTO, Tsuyoshi writes:
> copy 元のファイルを mmap した領域を,単純に copy 先ファイルに write(2)
> (以下,この方法を (A) として言及)する方が,速いと思います.i.e.
> write(to,from_mmap,size);
> 正確なところは,profiler など(時刻表示 option つきの system call trace
> コマンドとかもあれば使えそう)で所要時間を測定したり,OS の system
> call の実装/仕様を確認しないと分かりませんが,BSD/OS は使っていないし,
> 実装も知らないので,他の UNIX のいくつかからの類推で考えて見た限りでは,
> > http://rananim.ie.u-ryukyu.ac.jp/~kono/os/98-06-26/mmap_copy.c
> のコードは,例えば次のような原因で,read/write を使っている cp や前述
> の方法 (A) よりも,遅くなると思います.
>
> (1) mmap(2) + write(2) などの方が OS 内で disk I/O を最適化しやすそう.
> - OS からみて,memcpy(to_mmap,from_mmap,size) での pagefault のたび
> に通知されるより,system call で一度に教えてもらえる点でも有利かも.
>
> (2) ファイルの大きさによっては page out が起こりやすくなるかも知れない.
> - user 空間に copy 元と copy 先の2つの buffer があることになるので.
>
> (3) memcpy の CPU 時間消費で,実行優先度が下がってしまうかも知れない.
> - read(2) や write(2) の発行で sleep 状態になると実行優先度が上がる
> かも知れない.
>
> (4) msync(to_mmap,size) が disk に書き終るまで待つなら,書き込み処理は,
> write(2) + fsync(2) (ないし,O_SYNC 指定で open した場合の write(2))
> 相当の動作をすると考えられるため,単なる write(2) より所要時間が大き
> くなるのでは.
> --
> 橋本 剛 (HASHIMOTO, Tsuyoshi)
> Replied: Thu, 03 Sep 1998 13:05:43 +0900
> Replied: Makoto Ishisone <ishisone@sra.co.jp>
宿題
今日できなかった残りの問題を以下のサブジェクトでE-Mailで、kono@ie.u-ryukyu.ac.jp まで来週までに提出すること。
Subject: Report on Operating System Lecture 1/9
課題
TCP/IPに関する課題 を1月中に行うこと。 レポートはメールで
Subject: Practice Operating System Lecture 1/9
というように、課題を出した日付をサブジェクトに入れたメールで提出して下さい。