Załóżmy, że skompilowałem i uruchomiłem podręcznikowy przykład fork().Czy fork() powiela całą pamięć rodzica?
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
pid_t pid;
pid = fork();
if (pid == -1)
return 1;
if (pid == 0)
puts("From child process.");
else
puts("From parent process.");
return 0;
}
Czy kod z obu gałęziach rachunku if (pid == 0)
dotrzeć fork()
? Innymi słowy, czy proces potomny zawiera kod przeznaczony dla rodzica, który nigdy nie zostanie przez niego wykonany i na odwrót? Czy może/może to zoptymalizować kompilator?
Tak jest. Ale to nie ma znaczenia. Optymalizacja odbywa się w systemie operacyjnym, a nie w kompilatorze. Segment tekstowy będzie dzielony przez wszystkie rozwidlone procesy. Oznacza to, że system operacyjny zmapuje tę samą pamięć fizyczną dla segmentu tekstu na każdy z rozwidlonych procesów. W rzeczywistości nawet dane są udostępniane, dopóki nie nastąpi zapis na określonej stronie danych (np. Kopiuj przy zapisie). – kaylum