fork()の書き込み中のコピーは複数のブランチをどのように処理しますか?

fork()の書き込み中のコピーは複数のブランチをどのように処理しますか?

Wikipediaによると(間違っている可能性があります)

fork()システムコールが実行されると、親プロセスに対応するすべてのページのコピーが作成され、オペレーティングシステムによって子プロセスの別々のメモリ位置にロードされます。しかし、場合によってはこれは必要ありません。子プロセスは " exec"システムコール(Cプログラムで実行可能ファイルを実行するために使用されます)を実行するか、またはfork()execこれは、実行されるコマンドがそれを呼び出したプロセスのアドレス空間を置き換えるためです。

この場合、COW(記録中のコピー)という技術が使用されます。この手法では、フォークが発生したときに親プロセスのページが子プロセスにコピーされません。代わりに、子プロセスと親プロセスの間でページが共有されます。プロセス(親または子)がページを変更するたびに、変更を実行したプロセス(親または子)に対して、特定のページの別々のコピーが別々に作成されます。その後、このプロセスは将来のすべての参照で共有ページの代わりに新しくコピーされたページを使用します。他のプロセス(共有ページを変更していないプロセス)は、ページの元のコピー(これ以上共有されていない)を引き続き使用します。プロセスがページに書き込まれるとページがコピーされるため、この手法は記録中のコピーと呼ばれます。

いずれかのプロセスがページに書き込もうとすると、ページの新しいコピーが割り当てられ、ページエラーを生成したプロセスに提供されるように見えます。これにより、元のページが書き込み可能としてマークされます。

私の質問は:fork()プロセスが共有ページに書き込もうとする前に何度も呼び出されるとどうなりますか?

ベストアンサー1

特別なことは起こりません。すべてのプロセスは同じページセットを共有し、各プロセスはページを変更しようとすると独自のプライベートコピーを取得します。

おすすめ記事