7

Linux では、fork() して fork された (子) プロセスが終了した場合、すべての仮想メモリ ページは親でコピー オン ライトとしてマークされたままになりますか?

おそらく、ページごとの参照カウントやその他の高価な簿記が必要であり、実装に法外な費用がかかるため、ページは COW としてマークされたままになると思います。しかし、先日、現在のプロセスの「安定したスナップショット」でコードを実行するプロセスをフォークするかどうか疑問に思っていました。子プロセスが終了するとどうなりますか? 親のすべてのメモリ ページはコピー オン ライトとしてマークされたままですか? つまり、大量の仮想メモリ (たとえば 128GB+) を持つプロセスを fork して、コードを数分間だけ実行すると、親プロセスのパフォーマンスが数時間または数日後 (fork 呼び出し自体は言うまでもありません) にわたって長引くことになります。安くはありません。)

Linux での実際の動作がどうなっているのか興味があります (どうやってテストできるのかわかりません)。

4

2 に答える 2

9

コピー オン ライト ビットとは別に、ページ テーブルには参照カウントもあります。そのため、子がフォークすると、親の非プライベート ページはすべて COW とマークされ、参照カウントがインクリメントされます。

次に、子プロセスの実行中に親がページを書き込んでいる間に、ページ フォールトが発生し、期待どおりにページがコピーされ、参照カウントが減少します。子プロセスが終了すると、すべてのページ参照が 1 減り、参照カウントが 0 のページは破棄されます。

現在、COW ビットが設定され、参照カウントが 1 のページを親が書き込むと、COW ビットは単純に無視されます。

于 2013-03-23T16:11:47.447 に答える
0

カーネルはすべての共有ページを書き込み保護としてマークするため、いずれかが変更しようとすると例外が発生します。複製が作成され、書き込み可能としてマークされます (したがって、これ以上の例外はありません)。一方、オリジナルは書き込み保護されたままです。

オリジナルが書き込まれると、別の例外が発生しますが、カーネルはページが他のプロセスによって共有されていないことを認識し、そのページも書き込み可能としてマークします。プロセスが終了すると、そのすべてのページが解放されるため、カーネルは、変更時に親のすべてのページから COW ステータスを効果的に削除します。

于 2013-03-23T16:51:36.347 に答える