Czy ktoś może wyjaśnić różnicę między widelcem a nitką?
Czy ktoś może wyjaśnić różnicę między widelcem a nitką?
Odpowiedzi:
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.
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:
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ą:
Więcej szczegółów można znaleźć tutaj .
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.
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.