Daj nam znaleźć pewne różnice między fork () i vfork () z pomocą tabeli porównawczej pokazanej poniżej.
Wykres porównania
Podstawa do porównania | widelec() | vfork () |
---|---|---|
Podstawowy | Proces potomny i proces nadrzędny mają osobne przestrzenie adresowe. | Proces potomny i proces nadrzędny współużytkują tę samą przestrzeń adresową. |
Wykonanie | Proces macierzysty i potomny są wykonywane jednocześnie. | Proces nadrzędny pozostaje zawieszony, dopóki proces potomny nie zakończy jego wykonywania. |
Modyfikacja | Jeśli proces potomny zmienia dowolną stronę w przestrzeni adresowej, jest niewidoczny dla procesu nadrzędnego, ponieważ przestrzeń adresowa jest oddzielna. | Jeśli proces potomny zmienia dowolną stronę w przestrzeni adresowej, jest widoczny dla procesu nadrzędnego, ponieważ współużytkują tę samą przestrzeń adresową. |
Kopiuj przy zapisie | fork () używa opcji kopiowania przy zapisie jako alternatywy, w której rodzic i dziecko współużytkują te same strony, dopóki żadna z nich nie zmieni strony udostępnionej. | vfork () nie używa kopiowania przy zapisie. |
Definicja fork ()
Widelec () to wywołanie systemowe używane do utworzenia nowego procesu . Nowy proces utworzony przez wywołanie fork () jest procesem podrzędnym procesu, który wywołał wywołanie systemowe fork (). Kod procesu potomnego jest identyczny z kodem jego procesu nadrzędnego. Po utworzeniu procesu potomnego proces, tj. Proces nadrzędny i podrzędny, rozpoczynają wykonywanie od następnej instrukcji po fork () i oba procesy są wykonywane jednocześnie .
Proces macierzysty i proces potomny mają oddzielną przestrzeń adresową . Stąd, gdy dowolny z procesów modyfikuje dowolną instrukcję lub zmienną w kodzie. Nie znalazłoby to odzwierciedlenia w innych kodach procesu. Załóżmy, że jeśli proces potomny modyfikuje kod, nie wpłynie to na proces nadrzędny.
Niektóre procesy potomne po ich utworzeniu natychmiastowo wywołują exec () . Wywołanie systemowe exec () zastępuje proces programem określonym w jego parametrze. Wtedy oddzielna przestrzeń adresowa procesu potomnego jest bezużyteczna. Jedyną alternatywą jest tutaj kopiowanie przy zapisie.
Funkcja kopiowania przy zapisie umożliwia procesowi nadrzędnemu i potomnemu udostępnianie tej samej przestrzeni adresowej. Jeśli którykolwiek z procesów zapisuje na stronach w przestrzeni adresowej, tworzona jest kopia przestrzeni adresowej, aby oba procesy mogły działać niezależnie.
Definicja vfork ()
Zmodyfikowana wersja fork () to vfork (). Wywołanie systemowe vfork () jest również używane do tworzenia nowego procesu. Podobnie do fork (), tutaj również nowo utworzony proces jest procesem potomnym procesu, który wywołał vfork (). Kod procesu potomnego jest również identyczny z nadrzędnym kodem procesu. W tym przypadku proces potomny zawiesza wykonywanie procesu nadrzędnego aż do zakończenia jego wykonywania, ponieważ zarówno proces udostępnia tę samą przestrzeń adresową do użycia.
Ponieważ proces potomny i nadrzędny mają tę samą przestrzeń adresową . Jeśli którykolwiek z procesów modyfikuje kod, jest widoczny dla drugiego procesu współużytkującego te same strony. Załóżmy, że proces macierzysty zmienia kod; odzwierciedli się w kodzie procesu potomnego.
Ponieważ używanie vfork () nie tworzy oddzielnych przestrzeni adresowych dla procesów potomnych i nadrzędnych. Dlatego musi zostać zaimplementowany, gdy dziecko przetwarza wywołania exec () zaraz po jego utworzeniu. Tak więc nie będzie marnotrawienia przestrzeni adresowej i jest to skuteczny sposób na stworzenie procesu. vfork nie używa kopiowania przy zapisie .
Kluczowe różnice między fork () i vfork ()
- Podstawową różnicą między fork i vfork jest to, że proces potomny utworzony przez fork ma oddzielną przestrzeń pamięci od procesu nadrzędnego. Jednak proces potomny utworzony przez wywołanie systemowe vfork ma tę samą przestrzeń adresową co proces nadrzędny.
- Proces potomny utworzony za pomocą fork działa jednocześnie z procesem nadrzędnym. Z drugiej strony proces potomny utworzony za pomocą vfork zawiesza wykonywanie procesu nadrzędnego aż do zakończenia jego wykonywania.
- Ponieważ przestrzeń pamięci procesu nadrzędnego i podrzędnego jest oddzielną modyfikacją, która jest wykonywana przez dowolny z procesów, nie ma ona wpływu na strony innych. Jednak w procesie współużytkowania procesu nadrzędnego i potomnego ta sama modyfikacja adresu pamięci wykonana przez dowolny proces odzwierciedla w przestrzeni adresowej.
- System fork () używa metody copy-on-write jako alternatywy, która pozwala procesowi dziecko i proces nadrzędny współużytkować tę samą przestrzeń adresową, dopóki któraś z nich nie zmodyfikuje stron. Z drugiej strony vfork nie używa kopiowania przy zapisie.
Wniosek:
Wywołanie systemowe vfork () musi zostać zaimplementowane, gdy child proces wywoła exec () natychmiast po jego utworzeniu za pomocą fork (). Jako oddzielne miejsce na proces potomny i nadrzędny nie będzie tu przydatny.