2015-08-21 15 views
5

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?

+1

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

Odpowiedz

7

fork() duplikuje cały proces. Jedyna różnica polega na zwracaniu wartości samego wywołania fork() - w obiekcie macierzystym zwraca on identyfikator PID dziecka, w potomstwie zwraca on wartość 0.

Większość systemów operacyjnych optymalizuje to, stosując technikę o nazwie , przy zapisie. Zamiast kopiować całą pamięć, dziecko dzieli się pamięcią rodzica. Jednak wszystkie strony pamięci są oznaczone jako "kopiuj przy zapisie", co oznacza, że ​​jeśli któryś z procesów modyfikuje coś na stronie, zostanie skopiowany w tym czasie, a proces, który je zmodyfikował, zostanie zmieniony tak, aby używał kopii (i KOWU flaga będzie również wyłączona dla strony oryginalnej).

Aby uzyskać więcej informacji na ten temat, patrz Wikipedia.

+1

IIRC, fork/exec działa bardzo wolno na Cygwin, ponieważ system Windows nie obsługuje szybkiej obsługi części 'fork()'. Zapomniałem o szczegółach tego, co robi cygwin, aby emulować semantykę Unix. Jest szybki na wszystkich poprawnych systemach uniksowych, oczywiście. –

+0

"Aby zaprojektować idealny anty-Unix, spraw, by proces powstawania tarła był bardzo drogi, spraw, aby sterowanie procesem było trudne i nieelastyczne, i pozostaw IPC jako nieobsługiwaną lub półobsługową myśl", z [The Art of Unix Programming] (http: // www.catb.org/esr/writings/taoup/html/ch03s01.html#id2892171). – nebuch

Powiązane problemy