fork() および exec() 以降の COW 動作

fork() および exec() 以降の COW 動作

私たちはCOWのポストフォークの振る舞いを理解しています(例:説明したように)。ここ)次のように:フォークは子プロセスの親プロセスのページテーブルのコピーを作成し、物理ページを読み取り専用としてマークするため、どちらのプロセスでも書き込みを試みるとページエラーが発生し、ページがコピーされます。

子プロセスが実行された後はどうなりますか?私たちは、親プロセスがページの不在を引き起こすことなくそのページに書き換えることができると仮定しましたが、これを達成する方法に関する正確な情報を見つけることは困難でした。

コードを含むすべてのアドバイスを歓迎します!

ベストアンサー1

子プロセスが実行されると、現在のページはすべて新しい実行可能イメージ(ヒープ、スタックなどを含む)に対応するまったく新しいページセットに置き換えられます。

最新のオペレーティングシステムは、親プロセスと子プロセスとの間で共有される物理ページの参照数を維持することによってCoWを実装しています。ページが親プロセスと子プロセス間で共有される場合、参照数は2になります。子プロセスがexecを実行すると、共有ページの参照数が減少するため(たとえば、1に戻ります)、親プロセスのすべての書き込みはCoWなしで成功します。

楽しみのためにフォークを実行し、サブプロセスが数秒間休止状態を維持し、実行して実行する簡単なプログラムを作成します。これで/proc/PID/smaps、分岐前(もちろん上位プロセスのみ)、分岐後exec前、exec後の2つのプロセスの内容が観察されます。 Shared_XXXページとその住所の範囲を確認してください。

コードの側面には、書き込み中のコピーをサポートするいくつかの単純なXV6拡張があります。簡単なGoogle検索で十分です。見る価値がある別の場所は次のとおりです。https://github.com/torvalds/linux/blob/master/kernel/fork.c。フォークの入り口から追跡を開始し、楽しく過ごしてください。

Forkは一度慣れれば非常に簡単ですが、メモリ管理は面倒です。 "mm/memory.c": "copy_page_range()" をご覧ください。

おすすめ記事