3

「Linux Kernel Development」を読んで、次の文を見ました。

伝統的に、fork()では、親が所有するすべてのリソースが複製され、そのコピーが子に与えられます。このアプローチは単純であり、そうでなければ共有される可能性のある多くのデータをコピーするという点で非効率的です。さらに悪いことに、新しいプロセスがすぐに実行される場合新しい画像、コピーはすべて無駄になります

fork()すべての親のリソースをコピーする必要があるのはなぜですか? 新しいプロセスが必要とするすべてのリソースに、新しく新しいスペースのチャンクを単純に割り当てることができないのはなぜですか? コピーに必要性があるのはなぜですか。そして最後の質問 - 新しいプロセスが新しいイメージをすぐに実行する場合、なぜそのコピーが無駄になるのでしょうか?

4

3 に答える 3

4

新しいプロセスが必要とするすべてのリソースに、新しく新しいスペースのチャンクを単純に割り当てることができない理由

sayのセマンティクスは、それを行うと、別のプロセスがその時点からforks(2)実行を開始します。そのため、実行を開始すると、宣言された変数やその値などに関して、当然のことながら何らかの期待が生じます。親がアクセスできるすべて*をコピーする必要があります。

int x = 42;
fork();
if (parent)
    /* x == 42. */
else
    /* I can haz x ? */

新しいプロセスが新しいイメージをすぐに実行する場合、なぜそのコピーが無駄になるのでしょうか

新しいプロセスがその時点から続行する必要がないことが判明した場合、このコピーはまったく役に立ちません。たとえば、新しいプロセスが単に新しいプログラムの実行を開始したい場合、上記の変数は必要ありません。

于 2012-08-19T16:28:08.210 に答える
3

まあ、その非効率はそれほど非効率ではありません。私の知る限り、コピーオンライトをfork()実行します。このメカニズムにより、子プロセスが書き込みを試みた場合にのみメモリがコピーされます。そのため、子プロセスが書き込みを行わない場合はコピーされませんが、読み取りのために変数にアクセスできます。書き込みの試みは、通常、「メモリ管理ユニット」と呼ばれるハードウェアによって検出されます。x

一方、子プロセスからステータス変数を継承すると非常に便利なアプリケーションもあるため、そのような場合、メモリ空間の「クリーニング」は役に立ちません。

于 2012-08-19T17:10:48.953 に答える