Jaka jest różnica między widelcem a gwintem?


Odpowiedzi:


99

Rozwidlenie zapewnia zupełnie nowy proces, który jest kopią bieżącego procesu, z tymi samymi segmentami kodu. Gdy zmienia się obraz pamięci (zwykle jest to spowodowane innym zachowaniem dwóch procesów), uzyskuje się rozdzielenie obrazów pamięci (kopiowanie przy zapisie), jednak kod wykonywalny pozostaje ten sam. Zadania nie współużytkują pamięci, chyba że używają jakiegoś prymitywu komunikacji międzyprocesowej (IPC) .

Jeden proces może mieć wiele wątków, z których każdy jest wykonywany równolegle w tym samym kontekście procesu. Pamięć i inne zasoby są współdzielone między wątkami, dlatego dostęp do współdzielonych danych należy uzyskiwać za pośrednictwem niektórych obiektów prymitywnych i synchronizacyjnych (takich jak muteksy , zmienne warunkowe i semafory ), które pozwalają uniknąć uszkodzenia danych.


3
Prawdopodobnie będziesz chciał nazywać „kopię bieżącego procesu” procesem potomnym.

1
Segment tekstu jest jednak często udostępniany (wirtualnie), a nawet segment danych można kopiować przy zapisie.
Jé Queue


80

Widelec

Fork to nic innego jak nowy proces, który wygląda dokładnie tak, jak stary lub nadrzędny proces, ale nadal jest to inny proces z innym identyfikatorem procesu i posiadający własną pamięć. Proces nadrzędny tworzy oddzielną przestrzeń adresową dla dziecka. Zarówno proces nadrzędny, jak i podrzędny mają ten sam segment kodu, ale są wykonywane niezależnie od siebie.

Najprostszym przykładem rozwidlenia jest uruchomienie polecenia w powłoce w systemie Unix / Linux. Za każdym razem, gdy użytkownik wyda polecenie, powłoka rozwidla proces potomny i zadanie jest wykonywane.

Kiedy wywoływane jest wywołanie systemowe rozwidlenia, tworzona jest kopia wszystkich stron odpowiadających procesowi nadrzędnemu, ładowana przez system operacyjny do oddzielnej lokalizacji pamięci dla procesu potomnego, ale w niektórych przypadkach nie jest to potrzebne. Podobnie jak w wywołaniach systemowych „exec”, nie ma potrzeby kopiowania nadrzędnych stron procesu, ponieważ execv zastępuje przestrzeń adresową samego procesu nadrzędnego.

Kilka rzeczy, o których należy pamiętać o rozwidleniu, to:

  • Proces potomny będzie miał swój własny unikalny identyfikator procesu.
  • Proces potomny ma własną kopię deskryptora pliku rodzica.
  • Blokady plików ustawione przez proces nadrzędny nie będą dziedziczone przez proces potomny.
  • Wszystkie semafory, które są otwarte w procesie nadrzędnym, będą również otwarte w procesie potomnym.
  • Proces potomny powinien mieć własną kopię deskryptorów kolejki komunikatów rodzica.
  • Dziecko będzie miało własną przestrzeń adresową i pamięć.

Wątki

Wątki są lekkimi procesami (LWP). Tradycyjnie wątek jest po prostu stanem procesora (i jakimś innym stanem minimalnym), a proces zawiera resztę (dane, stos, I / O, sygnały). Wątki wymagają mniejszego narzutu niż „rozwidlanie” lub tworzenie nowego procesu, ponieważ system nie inicjuje nowej systemowej pamięci wirtualnej i środowiska dla procesu. Chociaż najbardziej efektywny w systemie wieloprocesorowym, w którym przepływ procesu można zaplanować tak, aby uruchamiał się na innym procesorze, uzyskując w ten sposób prędkość poprzez przetwarzanie równoległe lub rozproszone, korzyści można również znaleźć w systemach jednoprocesorowych, które wykorzystują opóźnienia we / wy i inne funkcje systemowe, które mogą wstrzymać proces wykonanie.

Wątki w tym samym procesie współużytkują:

  • instrukcje dotyczące procesu
  • większość danych
  • otwarte pliki (deskryptory)
  • sygnały i ich obsługa
  • aktualny katalog roboczy
  • identyfikator użytkownika i grupy

Więcej szczegółów można znaleźć tutaj .


2
Proces może mieć kilka wątków. Jeśli jeden z wątków w procesie wywołuje rozwidlenie, czy proces rozwidlony ma w pełni zduplikowaną pamięć, ale w nowym procesie znajduje się tylko wątek wywołujący?
Michael


31

Odpowiedź firmy Dacav jest doskonała, chciałem tylko dodać, że nie wszystkie modele wątków zapewniają prawdziwe przetwarzanie wieloprocesowe.

Na przykład, domyślna implementacja wątków Rubiego nie używa prawdziwych wątków systemu operacyjnego / jądra. Zamiast tego naśladuje posiadanie wielu wątków, przełączając się między obiektami Thread w ramach pojedynczego wątku / procesu jądra.

Jest to ważne w systemach wieloprocesorowych / wielordzeniowych, ponieważ te typy lekkich wątków mogą działać tylko na jednym rdzeniu - nie uzyskasz zbytniego wzrostu wydajności z posiadania wielu wątków.

Innym miejscem, w którym ma to znaczenie, jest sytuacja, gdy jeden wątek blokuje (czeka na we / wy lub wywołuje IOCTL sterownika), a cały blok wątków.

W dzisiejszych czasach nie jest to zbyt powszechne - większość implementacji wątków używa wątków jądra, które nie cierpią z powodu tych problemów - ale warto zastanowić się nad kompletnością.

W przeciwieństwie do tego fork udostępnia inny proces, który można uruchomić jednocześnie na innym fizycznym procesorze, podczas gdy oryginalny proces jest wykonywany. Niektórzy uważają, że IPC jest bardziej odpowiedni dla ich aplikacji, inni wolą wątki.

Powodzenia i miłej zabawy! Wielowątkowość jest zarówno trudna, jak i satysfakcjonująca.


8
+1 za trafienie w nerw: „nie wszystkie wątki zapewniają prawdziwą wieloprocesowość”
Dacav

5

Wątki to funkcje działające równolegle, fork to nowy proces z dziedziczeniem po rodzicach. Wątki są dobre do równoległego wykonywania zadania, podczas gdy forki są niezależnymi procesami, które również działają jednocześnie. Wątki mają warunki wyścigu i kontrolują semafory i blokady lub muteksy, rury mogą być używane zarówno w rozwidleniu, jak i wątku.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.