今日はLinuxプロセスについての講義に出席しました。先生は次のように述べています。
- fork()が戻った後、子プロセスを実行する準備が整います
- コピーオンライトメカニズムにより、fork-execシーケンスは、親のメモリの不要なコピーを防止することが保証されています。
fork-execシーケンスとは、次のような意味です。
if(!fork())
{
exec(...);
}
i = 0;
これは、私が知る限り、これに変換されます(pseudo-asmで記述されています):
call fork
jz next
call exec(...)
next:
load 0
store i
1回の実行で上記のすべての行を実行するのに十分なCPU時間が親に付与されていると仮定します。
- forkは0を返すため、3行目はスキップされます
- 0が「i」に格納されている場合、子はまだ実行されていないため、COWは(不必要に)親のメモリのコピーを開始します。
では、この場合、不要なコピーをどのように防ぐのでしょうか。 そうではないように見えますが、Linux開発者はそれを行うのに十分賢いと思います;)
考えられる答え:子は常に最初に実行されます(親はfork()を呼び出した後に推定されます)1。それは本当ですか?2.はいの場合、それはすべての場合に不要なコピーの防止を保証しますか?