9

ウィキペディアによると(間違っている可能性があります)

fork() システム コールが発行されると、親プロセスに対応するすべてのページのコピーが作成され、OS によって子プロセス用の別のメモリ ロケーションにロードされます。ただし、これは場合によっては必要ありません。子が「exec」システム コール (C プログラム内から実行可能ファイルを実行するために使用される) を実行する場合、または fork() の直後に終了する場合を考えてみましょう。親プロセスのコマンドを実行するためだけに子プロセスが必要な場合、親プロセスのページをコピーする必要はありません。これは、exec がそれを呼び出したプロセスのアドレス空間を実行するコマンドに置き換えるためです。

このような場合、コピーオンライト (COW) と呼ばれる手法が使用されます。この手法では、フォークが発生したときに、親プロセスのページは子プロセスにコピーされません。代わりに、ページは子プロセスと親プロセスの間で共有されます。プロセス (親または子) がページを変更するたびに、変更を実行したそのプロセス (親または子) に対して、その特定のページだけの別のコピーが作成されます。このプロセスでは、今後のすべての参照で共有ページではなく、新しくコピーされたページが使用されます。もう一方のプロセス (共有ページを変更しなかったプロセス) は、ページの元のコピー (現在は共有されていません) を引き続き使用します。この手法は、何らかのプロセスがページに書き込むときにページがコピーされるため、コピーオンライトと呼ばれます。

いずれかのプロセスがページに書き込もうとしたときのようです。ページの新しいコピーが割り当てられ、ページ フォールトを生成したプロセスに割り当てられます。元のページは後で書き込み可能としてマークされます。

私の質問は次のとおりです。プロセスのいずれかが共有ページへの書き込みを試みる前に、フォークが複数回呼び出された場合はどうなりますか?

4

2 に答える 2

12

fork元の親プロセスから複数回呼び出されると、それぞれの子と親のページが読み取り専用としてマークされます。子プロセスがデータを書き込もうとすると、親プロセスのページがそのアドレス空間にコピーされ、コピーされたページは子では書き込み可能としてマークされますが、親ではマークされません。

が子プロセスから呼び出されfork、孫が書き込みを試みると、元の親のページが最初の子にコピーされ、次に孫にコピーされ、すべてが書き込み可能としてマークされます。

于 2012-12-11T04:47:49.977 に答える
2

元のページは、単一のプロセスに属している場合にのみ書き込み可能とマークされます。これは、複数のフォークがあった場合には当てはまらない可能性があります。新しいページは、書き込みを試みたプロセスにのみ属しているため、常に書き込み可能としてマークされます。

于 2012-12-11T04:42:07.583 に答える