アドレス空間の複製
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参照)。
[関連ページ]
vmmap
VM Object
この時、アドレス空間は複製するが物理ページは複製されず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