ウィキペディアによると(これは間違っている可能性があります)
fork()システムコールが発行されると、親プロセスに対応するすべてのページのコピーが作成され、子プロセスのOSによって別のメモリ位置にロードされます。しかし、これは特定の場合には必要ありません。子が
exec
システムコール(Cプログラム内から実行可能ファイルを実行するために使用されます)を実行するか、fork()
。親プロセスのコマンドを実行するためだけに子が必要な場合、親プロセスのページをコピーする必要はありません。exec
これは、子プロセスを呼び出したプロセスのアドレス空間を実行するコマンドで置き換えるためです。このような場合、コピーオンライト(COW)と呼ばれる手法が使用されます。この手法では、分岐が発生したときに、親プロセスのページは子プロセス用にコピーされません。代わりに、ページは子プロセスと親プロセスの間で共有されます。プロセス(親または子)がページを変更するたびに、その特定のページのみの個別のコピーが、変更を実行したプロセス(親または子)に対して作成されます。このプロセスは、今後のすべての参照で共有ページではなく、新しくコピーされたページを使用します。他のプロセス(共有ページを変更しなかったプロセス)は、ページの元のコピー(共有されなくなった)を引き続き使用します。この手法は、何らかのプロセスがページを書き込むときにページがコピーされるため、コピーオンライトと呼ばれます。
いずれかのプロセスがページに書き込もうとすると、ページの新しいコピーが割り当てられ、ページフォールトを生成したプロセスに割り当てられるようです。元のページは、後で書き込み可能とマークされます。
私の質問はfork()
、プロセスが共有ページへの書き込みを試みる前に複数回呼び出された場合はどうなりますか?
pmap -XX PID
またはで確認できcat /proc/PID/smap
ます。