Jaka jest różnica techniczna między procesem a wątkiem?
Mam wrażenie, że słowo „proces” jest nadużywane, a są też wątki sprzętowe i programowe. A co z lekkimi procesami w językach takich jak Erlang ? Czy istnieje definitywny powód, aby używać jednego terminu nad drugim?
multithreading
process
operating-system
James Fassett
źródło
źródło
Odpowiedzi:
Zarówno procesy, jak i wątki są niezależnymi sekwencjami wykonania. Typowa różnica polega na tym, że wątki (tego samego procesu) działają w przestrzeni pamięci współużytkowanej, podczas gdy procesy działają w osobnych przestrzeniach pamięci.
Nie jestem pewien, do jakich wątków „sprzętowych” a „programowych” możesz się odnosić. Wątki to funkcja środowiska operacyjnego, a nie funkcja procesora (chociaż procesor zazwyczaj wykonuje operacje, dzięki którym wątki są wydajne).
Erlang używa terminu „proces”, ponieważ nie ujawnia modelu wieloprogramowania z pamięcią współużytkowaną. Nazwanie ich „wątkami” oznaczałoby, że mają wspólną pamięć.
źródło
Proces
Każdy proces zapewnia zasoby potrzebne do uruchomienia programu. Proces ma wirtualną przestrzeń adresową, kod wykonywalny, otwarte uchwyty do obiektów systemowych, kontekst bezpieczeństwa, unikalny identyfikator procesu, zmienne środowiskowe, klasę priorytetu, minimalne i maksymalne rozmiary zestawu roboczego oraz co najmniej jeden wątek wykonania. Każdy proces rozpoczyna się od jednego wątku, często nazywanego wątkiem podstawowym, ale może tworzyć dodatkowe wątki z dowolnego z jego wątków.
Wątek
Wątek to jednostka w procesie, którą można zaplanować do wykonania. Wszystkie wątki procesu współużytkują swoją wirtualną przestrzeń adresową i zasoby systemowe. Ponadto każdy wątek obsługuje procedury obsługi wyjątków, priorytet planowania, lokalną pamięć wątków, unikalny identyfikator wątku i zestaw struktur, których system będzie używał do zapisywania kontekstu wątków, dopóki nie zostanie zaplanowane. Kontekst wątku obejmuje zestaw rejestrów maszynowych wątku, stos jądra, blok środowiska wątku i stos użytkownika w przestrzeni adresowej procesu wątku. Wątki mogą mieć również własny kontekst zabezpieczeń, który może być wykorzystywany do podszywania się pod klientów.
Informacje te znaleziono w Dokumentach Microsoft tutaj: O procesach i wątkach
źródło
Proces:
Wątek:
Pożyczyłem powyższe informacje z zadania Quest wiedzy! blog .
źródło
Najpierw spójrzmy na aspekt teoretyczny. Musisz zrozumieć, czym jest proces, aby zrozumieć różnicę między procesem a wątkiem i co jest między nimi wspólne.
W sekcji 2.2.2 Klasyczny model wątku w nowoczesnych systemach operacyjnych 3e autorstwa Tanenbaum:
On kontynuuje:
Dalej znajduje się następująca tabela:
Zajmijmy się kwestią wielowątkowości sprzętowej . Klasycznie procesor obsługiwałby pojedynczy wątek wykonania, utrzymując stan wątku za pomocą jednego licznika programu i zestawu rejestrów. Ale co się stanie, jeśli wystąpi błąd w pamięci podręcznej? Pobieranie danych z pamięci głównej zajmuje dużo czasu, a procesor po prostu siedzi bezczynnie. Więc ktoś wpadł na pomysł, aby w zasadzie mieć dwa zestawy stanu wątku (PC + rejestry), aby inny wątek (może w tym samym procesie, może w innym procesie) mógł wykonać pracę, podczas gdy drugi wątek czeka na głównej pamięci. Istnieje wiele nazw i implementacji tej koncepcji, takich jak HyperThreading i Simultaneous Multithreading (w skrócie SMT).
Teraz spójrzmy na stronę oprogramowania. Istnieją zasadniczo trzy sposoby implementacji wątków po stronie oprogramowania.
Wszystko, czego potrzebujesz do wdrożenia wątków, to możliwość zapisania stanu procesora i utrzymania wielu stosów, co w wielu przypadkach można zrobić w przestrzeni użytkownika. Zaletą wątków przestrzeni użytkownika jest super szybkie przełączanie wątków, ponieważ nie trzeba pułapkować do jądra i możliwość planowania wątków w dowolny sposób. Największą wadą jest niemożność blokowania operacji we / wy (która blokowałaby cały proces i wszystkie jego wątki użytkownika), co jest jednym z głównych powodów, dla których używamy wątków w pierwszej kolejności. Blokowanie We / Wy za pomocą wątków znacznie upraszcza projektowanie programów w wielu przypadkach.
Wątki jądra mają tę zaletę, że mogą korzystać z blokowania we / wy, pozostawiając wszystkie problemy z planowaniem systemowi operacyjnemu. Ale każdy przełącznik wątku wymaga pułapkowania w jądrze, co jest potencjalnie względnie wolne. Jeśli jednak przełączasz wątki z powodu zablokowanych operacji we / wy, nie jest to tak naprawdę problemem, ponieważ operacja we / wy prawdopodobnie uwięziła cię już w jądrze.
Innym podejściem jest połączenie tych dwóch, z wieloma wątkami jądra, z których każdy ma wiele wątków użytkownika.
Wracając do pytania o terminologię, możesz zobaczyć, że proces i wątek wykonania to dwie różne koncepcje, a wybór tego terminu zależy od tego, o czym mówisz. Jeśli chodzi o termin „lekki proces”, nie widzę w tym sensu, ponieważ tak naprawdę nie oddaje tego, co się dzieje, ani terminu „wątek wykonania”.
źródło
Aby wyjaśnić więcej na temat programowania współbieżnego
Proces ma niezależne środowisko wykonawcze. Proces na ogół ma pełny, prywatny zestaw podstawowych zasobów w czasie wykonywania; w szczególności każdy proces ma własną przestrzeń pamięci.
Wątki istnieją w ramach procesu - każdy proces ma co najmniej jeden. Wątki współużytkują zasoby procesu, w tym pamięć i otwarte pliki. To sprawia, że komunikacja jest wydajna, ale potencjalnie problematyczna.
Pamiętając o przeciętnej osobie,
Na komputerze otwórz program Microsoft Word i przeglądarkę internetową. Te dwa procesy nazywamy .
W Microsoft Word wpiszesz coś, co zostanie automatycznie zapisane. Teraz zauważyłeś, że edycja i zapisywanie odbywa się równolegle - edycja w jednym wątku i zapisywanie w drugim wątku.
źródło
Skradziony stąd .
źródło
Proces to zbiór kodu, pamięci, danych i innych zasobów. Wątek to sekwencja kodu wykonywana w ramach procesu. Możesz (zwykle) mieć wiele wątków działających jednocześnie w ramach tego samego procesu.
źródło
Przykład procesu i wątku w świecie rzeczywistym To daje podstawowe pojęcie o wątku i procesie
Pożyczyłem powyższe informacje od odpowiedzi Scotta Langhama - dzięki
źródło
Proces:
Przykład:
powiedzmy, otwierając dowolną przeglądarkę (mozilla, Chrome, IE). W tym momencie rozpocznie się nowy proces.
Wątki:
Przykład:
otwieranie wielu kart w przeglądarce.
źródło
źródło
Zarówno wątki, jak i procesy są atomowymi jednostkami alokacji zasobów systemu operacyjnego (tzn. Istnieje model współbieżności opisujący podział czasu procesora między nimi oraz model posiadania innych zasobów systemu operacyjnego). Istnieje różnica w:
Greg Hewgill powyżej miał rację co do znaczenia słowa „proces” w języku Erlang, a tutaj jest dyskusja na temat tego, dlaczego Erlang mógł wykonywać procesy lekkie.
źródło
Zarówno procesy, jak i wątki są niezależnymi sekwencjami wykonania. Typowa różnica polega na tym, że wątki (tego samego procesu) działają w przestrzeni pamięci współużytkowanej, podczas gdy procesy działają w osobnych przestrzeniach pamięci.
Proces
Jest programem w trakcie wykonywania. ma sekcję tekstową, tj. kod programu, bieżącą aktywność reprezentowaną przez wartość licznika programu i zawartość rejestru procesorów. Zawiera także stos procesów, który zawiera dane tymczasowe (takie jak parametry funkcji, zmienne adresowane i lokalne) oraz sekcję danych, która zawiera zmienne globalne. Proces może również zawierać stertę, która jest pamięcią dynamicznie przydzielaną w czasie wykonywania procesu.
Wątek
Wątek jest podstawową jednostką wykorzystania procesora; zawiera identyfikator wątku, licznik programu, zestaw rejestrów i stos. dzielił się z innymi wątkami należącymi do tego samego procesu, jego sekcję kodu, sekcję danych i inne zasoby systemu operacyjnego, takie jak otwarte pliki i sygnały.
- Zaczerpnięte z systemu operacyjnego przez Galvina
źródło
http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html
źródło
Próbuję odpowiedzieć na to pytanie z widoku systemu operacyjnego jądra Linux
Program staje się procesem po uruchomieniu w pamięci. Proces ma własną przestrzeń adresową, co oznacza, że ma różne segmenty w pamięci, takie jak segmentacja
.text
do przechowywania skompilowanego kodu,.bss
do przechowywania niezainicjowanych zmiennych statycznych lub globalnych itp.Każdy proces miałby swój własny licznik programów i stos przestrzeni użytkownika .
Wewnątrz jądra każdy proces miałby swój własny stos jądra (który jest oddzielony od stosu przestrzeni użytkownika ze względów bezpieczeństwa) i nazwaną strukturę,
task_struct
która jest na ogół abstrakcyjna jako blok sterowania procesem, przechowujący wszystkie informacje dotyczące procesu, takie jak jego priorytet, stan , (i wiele innych części).Proces może mieć wiele wątków wykonania.
Przechodząc do wątków, znajdują się w procesie i współużytkują przestrzeń adresową procesu nadrzędnego wraz z innymi zasobami, które można przekazać podczas tworzenia wątku, takimi jak zasoby systemu plików, współdzielenie oczekujących sygnałów, udostępnianie danych (zmiennych i instrukcji), dzięki czemu wątki są lekkie i co pozwala na szybsze przełączanie kontekstu.
Wewnątrz jądra każdy wątek ma własny stos jądra wraz ze
task_struct
strukturą, która definiuje wątek. Dlatego jądro wyświetla wątki tego samego procesu co różne podmioty i same w sobie są planowalne. Wątki w tym samym procesie mają wspólny identyfikator o nazwie id grupy wątków (tgid
), mają także unikalny identyfikator o nazwie id procesu (pid
).źródło
Próbuję odpowiedzieć na to pytanie dotyczące świata Java.
Proces jest wykonaniem programu, ale wątek jest pojedynczą sekwencją wykonania w ramach procesu. Proces może zawierać wiele wątków. Wątek jest czasem nazywany lekkim procesem .
Na przykład:
Przykład 1: JVM działa w jednym procesie, a wątki w JVM współużytkują stertę należącą do tego procesu. Dlatego kilka wątków może uzyskać dostęp do tego samego obiektu. Wątki współużytkują stertę i mają własne miejsce na stosie. W ten sposób wywołanie metody przez jeden wątek i jego lokalne zmienne są zabezpieczone przed innymi wątkami. Ale stos nie jest bezpieczny dla wątków i musi być zsynchronizowany dla bezpieczeństwa wątków.
Przykład 2: Program może nie być w stanie rysować obrazów po odczytaniu naciśnięć klawiszy. Program musi zwracać pełną uwagę na klawiaturę, a brak możliwości obsługi więcej niż jednego zdarzenia naraz spowoduje problemy. Idealnym rozwiązaniem tego problemu jest płynne wykonanie dwóch lub więcej sekcji programu w tym samym czasie. Wątki pozwalają nam to zrobić. Tutaj Rysowanie obrazu jest procesem, a odczytanie klawisza jest procesem podrzędnym (wątkiem).
źródło
Różnica między wątkiem a procesem?
Proces jest instancją wykonawczą aplikacji, a Wątek jest ścieżką wykonania w ramach procesu. Ponadto proces może zawierać wiele wątków. Ważne jest, aby pamiętać, że wątek może zrobić wszystko, co może zrobić proces. Ponieważ jednak proces może składać się z wielu wątków, wątek można uznać za „lekki”. Tak więc zasadniczą różnicą między wątkiem a procesem jest praca, którą każdy z nich wykorzystuje. Wątki są używane do małych zadań, podczas gdy procesy są wykorzystywane do zadań o większej wadze - w zasadzie do wykonywania aplikacji.
Inną różnicą między wątkiem a procesem jest to, że wątki w tym samym procesie dzielą tę samą przestrzeń adresową, podczas gdy różne procesy nie. Umożliwia to wątkom odczytywanie i zapisywanie tych samych struktur danych i zmiennych, a także ułatwia komunikację między wątkami. Komunikacja między procesami - zwana także IPC lub komunikacja między procesami - jest dość trudna i wymaga dużych zasobów.
Wątki są łatwiejsze do utworzenia niż procesy, ponieważ nie wymagają osobnej przestrzeni adresowej.
Wielowątkowość wymaga starannego programowania, ponieważ wątki współużytkują struktury danych, które powinny być modyfikowane tylko przez jeden wątek na raz. W przeciwieństwie do wątków procesy nie współużytkują tej samej przestrzeni adresowej.
Wątki są uważane za lekkie, ponieważ zużywają znacznie mniej zasobów niż procesy.
Procesy są od siebie niezależne. Wątki, ponieważ współużytkują tę samą przestrzeń adresową, są od siebie zależne, dlatego należy zachować ostrożność, aby różne wątki nie stawały na sobie.
To naprawdę inny sposób stwierdzenia nr 2 powyżej.
Proces może składać się z wielu wątków.
źródło
Oto, co otrzymałem z jednego z artykułów na temat The Code Project . Myślę, że to wyjaśnia wszystko, co potrzebne.
źródło
Proces:
Proces jest w zasadzie programem w trakcie wykonywania. To jest aktywny byt. Niektóre systemy operacyjne używają terminu „zadanie” w odniesieniu do wykonywanego programu. Proces jest zawsze przechowywany w pamięci głównej, zwanej również pamięcią podstawową lub pamięcią o dostępie swobodnym. Dlatego proces jest określany jako aktywny podmiot. Znika, jeśli komputer zostanie ponownie uruchomiony. Kilka procesów może być powiązanych z tym samym programem. W systemie wieloprocesorowym wiele procesów może być wykonywanych równolegle. W systemie jednoprocesorowym, chociaż nie osiągnięto prawdziwej równoległości, stosuje się algorytm szeregowania procesów, a procesor zaplanuje wykonywanie każdego procesu pojedynczo, co daje złudzenie współbieżności. Przykład: Wykonywanie wielu wystąpień programu „Kalkulator”. Każda z instancji jest określana jako proces.
Wątek:
Wątek jest podzbiorem procesu. Jest określany jako „lekki proces”, ponieważ jest podobny do rzeczywistego procesu, ale wykonuje się go w kontekście procesu i dzieli te same zasoby, które zostały przydzielone procesowi przez jądro. Zwykle proces ma tylko jeden wątek kontroli - jeden zestaw instrukcji maszyny wykonywanych jednocześnie. Proces może również składać się z wielu wątków wykonania, które wykonują instrukcje jednocześnie. Wiele wątków kontroli może wykorzystać prawdziwą równoległość możliwą w systemach wieloprocesorowych. W systemie jednoprocesorowym stosowany jest algorytm szeregowania wątków, a procesor ma uruchamiać każdy wątek jeden po drugim. Wszystkie wątki uruchomione w procesie mają tę samą przestrzeń adresową, deskryptory plików, stos i inne atrybuty związane z procesem. Ponieważ wątki procesu mają tę samą pamięć,
ref- https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread
źródło
Z punktu widzenia ankietera, są w zasadzie tylko 3 główne rzeczy, które chcę usłyszeć, poza oczywistymi rzeczami, takimi jak proces może mieć wiele wątków:
Jeśli chcesz więcej, odpowiedź Scotta Langhama obejmuje prawie wszystko. Wszystko to z perspektywy systemu operacyjnego. Różne języki mogą implementować różne koncepcje, takie jak zadania, wątki lekkie i tak dalej, ale są to tylko sposoby używania wątków (włókien w systemie Windows). Brak wątków dotyczących sprzętu i oprogramowania. Istnieją wyjątki i przerwania dotyczące sprzętu i oprogramowania oraz wątki trybu użytkownika i jądra .
źródło
źródło
Dla tych, którzy czują się bardziej komfortowo w nauce poprzez wizualizację, oto przydatny schemat, który stworzyłem w celu wyjaśnienia procesu i wątków.
Użyłem informacji z MSDN - O procesach i wątkach
źródło
Pochodząc z wbudowanego świata, chciałbym dodać, że koncepcja procesów istnieje tylko w „dużych” procesorach (procesory stacjonarne, ARM Cortex A-9 ), które mają MMU (jednostka zarządzania pamięcią) oraz systemy operacyjne, które obsługują używanie MMU ( takich jak Linux ). W przypadku małych / starych procesorów i mikrokontrolerów oraz małego systemu operacyjnego RTOS (system operacyjny w czasie rzeczywistym ), takiego jak freeRTOS, nie ma obsługi MMU, a zatem nie ma procesów, a jedynie wątki.
Wątki mogą uzyskiwać dostęp do pamięci i są one planowane przez system operacyjny w sposób przeplatany, więc wydają się działać równolegle (lub z wielordzeniowymi naprawdę działają równolegle).
Procesy z kolei żyją w prywatnej piaskownicy pamięci wirtualnej, udostępnianej i strzeżonej przez MMU. Jest to przydatne, ponieważ umożliwia:
źródło
źródło
Proces : program w trakcie wykonywania jest znany jako proces
Wątek : Wątek jest funkcją, która jest wykonywana z drugą częścią programu w oparciu o koncepcję „jeden z drugim”, więc wątek jest częścią procesu.
źródło
Przeczytałem tam prawie wszystkie odpowiedzi, niestety, jako student pierwszego stopnia biorący udział w kursie OS nie mogę obecnie dokładnie zrozumieć tych dwóch pojęć. Mam na myśli, że większość facetów czyta z niektórych książek na temat systemu operacyjnego różnice, tzn. Wątki mają dostęp do zmiennych globalnych w jednostce transakcyjnej, ponieważ wykorzystują przestrzeń adresową swojego procesu. Jednak powstaje nowe pytanie, dlaczego istnieją procesy, o czym wiemy, że już wątki są lżejsze w stosunku do procesów. Rzućmy okiem na poniższy przykład, wykorzystując obraz fragmentu jednej z wcześniejszych odpowiedzi ,
Mamy 3 wątki pracujące jednocześnie na dokumencie Word, np. Libre Office . Pierwszy wykonuje sprawdzanie pisowni, podkreślając, czy słowo jest źle napisane. Drugi bierze i drukuje litery z klawiatury. A ostatni zapisuje dokument w każdym krótkim czasie, aby nie stracić dokumentu, w którym pracował, jeśli coś pójdzie nie tak. W tym przypadku 3 wątki nie mogą być 3 procesami, ponieważ dzielą wspólną pamięć, która jest przestrzenią adresową ich procesu, a zatem wszystkie mają dostęp do edytowanego dokumentu. Tak więc droga jest dokumentem słownym wraz z dwoma buldożerami, które są wątkami, chociaż jednym z nich jest brak obrazu.
źródło
Podczas budowania algorytmu w języku Python (język interpretowany), który obejmował wielowątkowość, zdziwiłem się, widząc, że czas wykonania nie był lepszy w porównaniu z algorytmem sekwencyjnym, który wcześniej zbudowałem. Aby zrozumieć przyczynę tego wyniku, przeczytałem trochę i wierzę, że to, czego się nauczyłem, oferuje interesujący kontekst, z którego można lepiej zrozumieć różnice między wielowątkowością a wieloprocesowością.
Systemy wielordzeniowe mogą wykonywać wiele wątków wykonania, dlatego Python powinien obsługiwać wiele wątków. Ale Python nie jest językiem skompilowanym, a zamiast tego jest językiem interpretowanym 1 . Oznacza to, że program musi zostać zinterpretowany w celu uruchomienia, a tłumacz nie jest świadomy programu przed rozpoczęciem jego wykonywania. Wie jednak, jakie są reguły Pythona, a następnie dynamicznie je stosuje. Optymalizacje w Pythonie muszą zatem być głównie optymalizacjami samego interpretera, a nie kodu, który ma zostać uruchomiony. Jest to w przeciwieństwie do skompilowanych języków, takich jak C ++, i ma konsekwencje dla wielowątkowości w Pythonie. W szczególności Python używa globalnej blokady interpretera do zarządzania wielowątkowością.
Z drugiej strony skompilowany język jest dobrze skompilowany. Program jest przetwarzany „całkowicie”, gdzie najpierw jest interpretowany zgodnie ze swoimi składniowymi definicjami, a następnie odwzorowywany na pośrednią reprezentację języka niezależną od języka, a na końcu łączony z kodem wykonywalnym. Ten proces pozwala wysoce zoptymalizować kod, ponieważ jest on dostępny w momencie kompilacji. Różne interakcje i relacje programu są definiowane w momencie tworzenia pliku wykonywalnego i można podejmować solidne decyzje dotyczące optymalizacji.
W nowoczesnych środowiskach interpreter Pythona musi umożliwiać wielowątkowość, a to musi być zarówno bezpieczne, jak i wydajne. Tutaj pojawia się różnica między byciem językiem interpretowanym a językiem skompilowanym. Tłumacz nie może zakłócać wewnętrznego udostępniania danych z różnych wątków, jednocześnie optymalizując wykorzystanie procesorów do obliczeń.
Jak zauważono w poprzednich postach, zarówno proces, jak i wątek są niezależnymi sekwencjalnymi wykonaniami, przy czym podstawową różnicą jest to, że pamięć jest dzielona na wiele wątków procesu, podczas gdy procesy izolują ich przestrzenie pamięci.
W Pythonie dane są chronione przed jednoczesnym dostępem przez różne wątki przez Globalną Blokadę Tłumacza. Wymaga to, aby w dowolnym programie Python w danym momencie można wykonać tylko jeden wątek. Z drugiej strony możliwe jest uruchamianie wielu procesów, ponieważ pamięć dla każdego procesu jest izolowana od dowolnego innego procesu, a procesy mogą działać na wielu rdzeniach.
1 Donald Knuth ma dobre wyjaśnienie procedur interpretacyjnych w sztuce programowania komputerowego: podstawowe algorytmy.
źródło
Wątki w tym samym procesie współużytkują pamięć, ale każdy wątek ma swój własny stos i rejestry, a wątki przechowują dane specyficzne dla wątku w stercie. Wątki nigdy nie są wykonywane niezależnie, więc komunikacja między wątkami jest znacznie szybsza w porównaniu do komunikacji między procesami.
Procesy nigdy nie współużytkują tej samej pamięci. Kiedy proces potomny tworzy, duplikuje lokalizację pamięci procesu macierzystego. Komunikacja procesowa odbywa się za pomocą potoku, pamięci współużytkowanej i parsowania wiadomości. Przełączanie kontekstu między wątkami jest bardzo wolne.
źródło
Najlepsza odpowiedź, jaką do tej pory znalazłem, to „Interfejs programowania Linuksa” Michaela Kerriska :
Ta książka jest źródłem wielkiej przejrzystości; W tym artykule Julia Evans wspomniała o swojej pomocy w wyjaśnieniu, jak naprawdę działają grupy Linux .
źródło
Przykład 1: JVM działa w jednym procesie, a wątki w JVM współużytkują stertę należącą do tego procesu. Dlatego kilka wątków może uzyskać dostęp do tego samego obiektu. Wątki współużytkują stertę i mają własne miejsce na stosie. W ten sposób wywołanie metody przez jeden wątek i jego lokalne zmienne są zabezpieczone przed innymi wątkami. Ale stos nie jest bezpieczny dla wątków i musi być zsynchronizowany dla bezpieczeństwa wątków.
źródło
Są prawie takie same ... Ale kluczową różnicą jest to, że wątek jest lekki, a proces jest ciężki pod względem przełączania kontekstu, obciążenia roboczego i tak dalej.
źródło