Mac OS Xのカーネル Xnuのメモ書き

アドレス空間の複製


fork()でプロセスを生成する場合、vm_map_fork()でアドレス空間をコピーする。

この時、アドレス空間は複製するが物理ページは複製されずfork()元のプロセスと共有し、ページへ書込みを行なった時点で複製される(Copy On Write)。

物理ページはCopy On Writeで共有するが、vm_map_fork()ですぐにはShadow Objectを作成はしない。vm_map_fork()直後ではvm_map_entryのみ複製させてvm_objectは直接共有している(図1)。ただし、Shadow Objectを作成すべきvm_map_entryにはneeds_copyにTRUEが設定される。

needs_copy == TRUEだとvm_map_wire_nested(),vm_map_lookup_locked()などで適宜Shadow Objectが作成される。Shadow Objectが作成されると図2、3のようになる。

共有しているページを書き換えようとするとページフォルトが発生して、Copy On Write処理が行なわれる。コピーされたページはShadow Objectにつながれる(VM Object参照)。



図1 vm_map_fork()直後



図2 プロセスAのShadow Objectが作成された状態


図3 プロセスBのShadow Objectが作成された状態


[関連ページ]
vmmap
VM Object


最終更新 2006/06/12 00:11:52 - kztomita
(2006/06/11 17:50:38 作成)
添付ファイル
vmmapfork1.png - kztomita
vmmapfork2.png - kztomita
vmmapfork3.png - kztomita


最近更新したページ