1

今日はLinuxプロセスについての講義に出席しました。先生は次のように述べています。

  1. fork()が戻った後、子プロセスを実行する準備が整います
  2. コピーオンライトメカニズムにより、fork-execシーケンスは、親のメモリの不要なコピーを防止することが保証されています。

fork-execシーケンスとは、次のような意味です。

if(!fork())
{
    exec(...);
}
i = 0;

これは、私が知る限り、これに変換されます(pseudo-asmで記述されています):

call fork
jz next
call exec(...)
next:
load 0
store i

1回の実行で上記のすべての行を実行するのに十分なCPU時間が親に付与されていると仮定します。

  1. forkは0を返すため、3行目はスキップされます
  2. 0が「i」に格納されている場合、子はまだ実行されていないため、COWは(不必要に)親のメモリのコピーを開始します。

では、この場合、不要なコピーをどのように防ぐのでしょうか。 そうではないように見えますが、Linux開発者はそれを行うのに十分賢いと思います;)

考えられる答え:子は常に最初に実行されます(親はfork()を呼び出した後に推定されます)1。それは本当ですか?2.はいの場合、それはすべての場合に不要なコピーの防止を保証しますか?

4

2 に答える 2

1

基本的に2人で同じ本を読むことができます。しかし、余白にメモを書き始めると、その前にそのページのコピーが必要になります。ページの余白に書き込んでいない人は、本の他の人のメモを見たくありません。

于 2012-12-17T21:26:26.777 に答える
0

答えは基本的に、必要なコピー (変更されたデータをホストするページ) は発生しますが、不必要なコピー (フォーク以降、どちらのプロセスでも変更されていないページ) は発生しないということです。

後者には通常、変更されていないデータだけでなく、プログラム自体とそれがロードした共有ライブラリを保持するものも含まれます。通常、共有できる多くのページと、複製する必要がある少数のページです。

子が exec 関数を呼び出すと、共有 (および将来のコピー オン ライトの必要性) が終了します。

于 2012-12-17T21:18:58.870 に答える