fork()のコピーオンライトは複数のフォークをどのように処理しますか?


23

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

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

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

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

私の質問はfork()、プロセスが共有ページへの書き込みを試みる前に複数回呼び出された場合はどうなりますか?


この場合、ウィキペディアはまさに高レベルです。
ディディコーヘン

1
はい、copy-on-writeは遅延コピーで、子プロセスはページを書き込もうとするとコピーします。したがって、基本的には、分岐後、ほとんどの子供の記憶は親と共有されます。ただし、プロセスを実行する前は、すべての子プロセスに、親または新しい割り当てから変更されたプライベートメモリが残っています。つまり、アクションがなくても、フォークされた子プロセスにはプライベートメモリがあります。pmap -XX PIDまたはで確認できcat /proc/PID/smapます。
どこ

に関して-「元のページは後で書き込み可能とマークされます。」、誰がそれを所有しますか?ここでそれを書いていない他のプロセス?
アディル

これは素敵です。幼稚園でこれを教え始めましょう
ed22

回答:


18

特に何も起こりません。すべてのプロセスは同じページセットを共有しており、ページを変更する場合、各プロセスは独自のプライベートコピーを取得します。


右。重要なのは、特別な子プロセスであり、共有ページに書き込もうとするとコピーするジョブがあるということです。親も他の子も、正しく行われれば変更について知る必要はありません。
チャールズスチュワート

9
子プロセスはそれほど特別ではありません。子プロセスと親プロセスの両方が、フォーク後に読み取り専用の同じページセットを持ちます。これらのページに関する限り、ページ処理は対称的です。
jlliagre

3

fork()の動作は、* nixシステムにMMUがあるかどうかによって異なります。非MMUシステム(初期のPDP-11など)では、fork()システムコールは各子の親のメモリをすべてコピーしました。MMUベースの* nixシステムでは、カーネルはすべての非スタックページをR / Oとしてマークし、それらを親と子の間で共有します。その後、いずれかのプロセスが任意のページに書き込みを行うと、MMUは試行をトラップし、カーネルは書き込み可能なページを割り当て、書き込み可能なページを指すようにMMUページテーブルを更新します。このコピーオンライト動作により、最初は各子プロセスにプライベートスタックのみを割り当ててクローン化する必要があるため、速度が向上します。

各fork()呼び出しの間に親コードを実行すると、結果の子プロセスは、親によって変更されたページによって異なります。一方、親が単にループなどで複数のfork()呼び出しを発行する場合、子プロセスはほぼ同一になります。ローカルループ変数が使用される場合、それは各子のスタック内で異なります。


0

システムがフォークを実行するとき、通常(これは実装に依存する可能性があります)、ページを読み取り専用としてマークし、親プロセスをこれらのページのマスターとしてマークします。
これらのページに書き込もうとすると、ページフォールトが発生し、OSが処理を引き継ぎ、ページのリスト全体または変更されたものだけをコピーします(これも実装に依存します)。したがって、書き込みプロセスには書き込み可能なコピーがあります。
同じプロセスから分岐された複数のプロセスがある場合、「マスター」プロセスがメモリに書き込むと、他のプロセスは同等のページをコピーします。


これはどのシステムですか?Linuxはコピーオンライトの実装を使用します
brauliobo 14年

どのようにコピー・オン・ライト作品です...
ディディKohen

3
@DavidKohenそれは、私が今まで聞いたどのバージョンでもコピーオンライトがどのように機能するかではありません。「マスター」プロセスはありません。場合はいずれかの 1つのプロセスが共有ページを書き込み、他のすべてのプロセスがそれを共有していきながら、そのコピーは、プライベート1にぶつけます。
セラダ

1
デビッド・コーエンはある意味正しいと思います。これは、コピーオンライトを実装する1つの方法です。要点は、このマーキングにより、そのページへの書き込みが適切なアクション、つまりコピーオンライトを実行するページフォールトハンドラーをトリガーすることです。残念ながら、この詳細(システム固有)は、この質問にはほとんど関係ありません。CoWには2つの次元があることに注意してください。1つはプロセスに表示され、もう1つはカーネルがそれを実装する方法です。
0xC0000022L
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.