Fork() дублира ли цялата памет на родителя?

Да предположим, че компилирам и стартирам примера от учебника на fork().

#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;
}

Кодът от двата клона на оператора if (pid == 0) стига ли до fork()? С други думи, дъщерният процес съдържа ли код, предназначен за родителя, който никога няма да бъде изпълнен от него и обратно? Или може/може ли компилаторът да оптимизира това?


person nebuch    schedule 21.08.2015    source източник
comment
Да, така е. Но няма значение. Оптимизацията е в ОС, а не в компилатора. Текстовият сегмент ще бъде споделен от всички разклонени процеси. Това означава, че операционната система ще картографира една и съща физическа памет за текстовия сегмент във всеки от разклонените процеси. Всъщност дори данните се споделят, докато има запис в определена страница с данни (т.е. копиране при запис).   -  person kaylum    schedule 21.08.2015


Отговори (1)


fork() дублира целия процес. Единствената разлика е в върнатата стойност на самото извикване fork() -- в родителя той връща PID на детето, в детето връща 0.

Повечето операционни системи оптимизират това, като използват техника, наречена копиране при запис. Вместо да копира цялата памет, детето споделя паметта на родителя. Въпреки това, всички страници с памет са маркирани като копиране при запис, което означава, че ако някой от процесите промени нещо в страница, то ще бъде копирано в този момент и процесът, който го е модифицирал, ще бъде променен, за да използва копието (и COW флагът ще бъде изключен и за оригиналната страница).

Вижте статиите в Уикипедия за fork и copy-on-write за повече информация.

person Barmar    schedule 21.08.2015
comment
IIRC, fork/exec е много бавен на cygwin, защото Windows няма бърза поддръжка за частта fork(). Забравих подробностите какво трябва да направи cygwin, за да емулира семантиката на Unix. Бързо е на всички правилни Unix OS, разбира се. - person Peter Cordes; 21.08.2015