Co to jest „wątek” (naprawdę)?

236

Próbowałem znaleźć dobrą definicję i zrozumieć, czym tak naprawdę jest wątek .

Wygląda na to, że brakuje mi czegoś oczywistego, ale za każdym razem, gdy czytam o tym, czym jest wątek, jest to prawie okrągła definicja, a la „wątek jest wątkiem wykonania” lub „sposobem na podział na uruchomione zadania”. Uh Co?

Z tego, co przeczytałem, wydaje się, że wątek nie jest tak naprawdę czymś konkretnym, jak proces. W rzeczywistości jest to tylko koncepcja. Z tego co rozumiem z drogi to działa, procesor wykonuje jakieś polecenia dla programu (co zostało nazwane wątku wykonania ), a następnie, gdy jest konieczne, aby przełączyć na przetwarzanie przez jakiś inny program do kawałka, to zapamiętuje stan z program, który obecnie gdzieś wykonuje (Thread Local Storage), a następnie zaczyna wykonywać instrukcje innego programu. I tam iz powrotem. Taki wątek jest tak naprawdę tylko koncepcją „jednej ze ścieżek wykonania” aktualnie uruchomionego programu.

W przeciwieństwie do procesu, który tak naprawdę jest czymś - to skupisko zasobów itp.

Jako przykład definicji, która tak naprawdę niewiele mi pomogła. . .

Z Wikipedii :

„Wątek w informatyce jest skrótem od wątku wykonania. Wątki to sposób, w jaki program dzieli się (określany jako„ podział ”) na dwa lub więcej jednocześnie uruchomionych zadań (lub pseudo jednocześnie). Wątki i procesy różnią się od jednego systemu operacyjnego do innego, ale ogólnie wątek jest zawarty w procesie, a różne wątki w tym samym procesie współużytkują te same zasoby, podczas gdy różne procesy w tym samym wielozadaniowym systemie operacyjnym nie. ”

Więc mam rację? Źle? Czym tak naprawdę jest wątek?

Edycja: Najwyraźniej wątek ma również swój własny stos wywołań, więc jest to coś konkretnego .

Richard
źródło
6
„Proces” jest nie mniej abstrakcyjnym terminem.
hobbs
Czy lokalna pamięć wątków to tylko stos wywołań dla wątku?
zaangażowanieandroider
3
Poniższe odpowiedzi są ... abstrakcyjne. Mówiąc prościej (i przeglądając niektóre szczegóły): program komputerowy mógł zrobić tylko jedną rzecz naraz. Tak zrobiło A, potem B, potem C, a potem ... W nowoczesnych systemach nie jest to idealne; na przykład chcesz nadal przeglądać sieć podczas pobierania pliku. Programy mają teraz jeden lub więcej „wątków”. Każdy „wątek” może robić tylko jedną rzecz naraz, ale różne wątki mogą robić rzeczy jednocześnie . Wątek 1 może wykonać A, następnie B, a następnie C; wątek 2 może wykonać X, następnie Y, a następnie Z. B nie może rozpocząć się, dopóki A nie zakończy się, ale A i X mogą wystąpić jednocześnie.
Mohan
@Mohan, to świetnie, ale czym to się różni od procesu?
eric

Odpowiedzi:

152

Wątek to niezależny zestaw wartości rejestrów procesora (dla pojedynczego rdzenia). Ponieważ obejmuje to wskaźnik instrukcji (inaczej Licznik programu), kontroluje to, co wykonuje w jakiej kolejności. Zawiera także wskaźnik stosu, który lepiej wskazywałby unikalny obszar pamięci dla każdego wątku, w przeciwnym razie będą się one wzajemnie zakłócały.

Wątki to jednostka oprogramowania, na którą wpływa przepływ sterowania (wywołanie funkcji, pętla, goto), ponieważ instrukcje te działają na wskaźniku instrukcji i należą do określonego wątku. Wątki są często planowane zgodnie z pewnym schematem ustalania priorytetów (chociaż możliwe jest zaprojektowanie systemu z jednym wątkiem na rdzeń procesora, w którym to przypadku każdy wątek jest zawsze uruchomiony i nie jest wymagane planowanie).

W rzeczywistości wartość wskaźnika instrukcji i instrukcji przechowywanej w tym miejscu jest wystarczająca do ustalenia nowej wartości wskaźnika instrukcji. W przypadku większości instrukcji powoduje to po prostu zwiększenie adresu IP o rozmiar instrukcji, ale instrukcje przepływu sterowania zmieniają adres IP na inne, przewidywalne sposoby. Sekwencja wartości, jaką przyjmuje IP, tworzy ścieżkę wykonania, przeplatając kod programu, dając początek nazwie „wątek”.

Ben Voigt
źródło
10
+1. Wątek nie jest niczym bardziej „konkretnym” niż zestaw wartości rejestrów.
Greg Hewgill
6
Jaki „zestaw wartości”? Czym oni są? Jak definiują wątek ?
Richard
20
@ Richard: Dokładna lista rejestrów procesora zależy od architektury, ale wskaźnik instrukcji i wskaźnik stosu są dość uniwersalne. Definiują wątek, o ile ten wątek (zestaw wartości rejestru) jest ładowany do rdzenia procesora, wątek jest uruchomiony . Procesor pobiera instrukcje wymagane przez wątek i aktualizuje rejestry wątków. Gdy potrzebny jest przełącznik kontekstu, procesor zapisuje ten zestaw wartości rejestru w pamięci i ładuje zestaw należący do innego wątku, zwykle jako część logiki obsługi przerwań.
Ben Voigt,
4
Dzięki Ben. To bardzo pomocne.
Richard
2
Cześć {@} BenVoigt. Kilka wyjaśnień, na które mogą się potknąć noobowie tacy jak ja: co oznaczają „rejestry procesorów”? Co oznaczają „wskaźnik instrukcji” i „wskaźnik stosu”?
BKSpurgeon
214

Wątek jest kontekstem wykonania, czyli wszystkimi informacjami potrzebnymi CPU do wykonania strumienia instrukcji.

Załóżmy, że czytasz książkę i chcesz teraz zrobić sobie przerwę, ale chcesz wrócić i wznowić czytanie od momentu, w którym się zatrzymałeś. Jednym ze sposobów osiągnięcia tego jest zanotowanie numeru strony, numeru wiersza i numeru słowa. Zatem twoim kontekstem wykonania dla czytania książki są te 3 liczby.

Jeśli masz współlokatorkę, a ona używa tej samej techniki, może wziąć książkę, gdy ty jej nie używasz, i wznowić czytanie od miejsca, w którym przestała. Następnie możesz go zabrać z powrotem i wznowić z miejsca, w którym byłeś.

Wątki działają w ten sam sposób. Procesor daje złudzenie, że wykonuje wiele obliczeń jednocześnie. Robi to, poświęcając trochę czasu na każde obliczenie. Może to zrobić, ponieważ ma kontekst wykonania dla każdego obliczenia. Podobnie jak możesz udostępnić książkę znajomemu, wiele zadań może współdzielić procesor.

Na poziomie bardziej technicznym kontekst wykonania (a więc wątek) składa się z wartości rejestrów procesora.

Wreszcie: wątki różnią się od procesów. Wątek jest kontekstem wykonywania, podczas gdy proces to wiązka zasobów powiązanych z obliczeniami. Proces może mieć jeden lub wiele wątków.

Wyjaśnienie: zasoby powiązane z procesem obejmują strony pamięci (wszystkie wątki w procesie mają taki sam widok pamięci), deskryptory plików (np. Otwarte gniazda) i poświadczenia bezpieczeństwa (np. Identyfikator użytkownika, który uruchomił proces).

pwnall
źródło
20
Lepszą analogią byłoby zrównanie osoby z procesorem (oba coś robią ) i zrównanie książki z przestrzenią adresową (obie po prostu istnieją). W ten sposób zakładki w różnych książkach są jak wątki w różnych procesach. Jedna książka z więcej niż jedną zakładką byłaby analogiem do wielowątkowego procesu, co ludzie zwykle mają na myśli, mówiąc „wątki”. Działa na maszynie jednoprocesorowej, ale nieco się psuje, gdy mówimy o przetwarzaniu wieloprocesorowym. Nikt nie dba o to, który procesor wykonuje funkcję f (), ale nie ma znaczenia, która osoba czyta rozdział 11.
Solomon Slow
@pwnall, wielkie dzięki za trawienie trudnych koncepcji dla innych takich jak ja! Czy wielowątkowość jest zaangażowana w wieloprocesowość (lub równoległe uruchamianie procesu na wielu procesorach, na wypadek, gdy używam niewłaściwego terminu)?
aerijman
51

Aby formalnie zdefiniować wątek, musimy najpierw zrozumieć granice, w których działa wątek.

Program komputerowy staje się procesem, gdy jest ładowany z jakiegoś sklepu do pamięci komputera i rozpoczyna wykonywanie. Proces może być wykonywany przez procesor lub zestaw procesorów. Opis procesu w pamięci zawiera istotne informacje, takie jak licznik programu, który śledzi bieżącą pozycję w programie (tj. Która instrukcja jest aktualnie wykonywana), rejestry, zapasy zmiennych, uchwyty plików, sygnały i tak dalej.

Gwint jest sekwencją takich instrukcji w programu, które mogą być wykonane niezależnie od innych kodów. Rysunek pokazuje koncepcję: wprowadź opis zdjęcia tutaj

Wątki znajdują się w tej samej przestrzeni adresowej procesu , dlatego wiele informacji obecnych w opisie pamięci procesu może być dzielonych między wątkami.

Niektórych informacji nie można powielić, takich jak stos (wskaźnik stosu do innego obszaru pamięci na wątek), rejestry i dane specyficzne dla wątku. Informacje te wystarczają, aby umożliwić planowanie wątków niezależnie od głównego wątku programu i ewentualnie jednego lub więcej innych wątków w programie.

Do uruchomienia programów wielowątkowych wymagana jest wyraźna obsługa systemu operacyjnego. Na szczęście większość nowoczesnych systemów operacyjnych obsługuje wątki, takie jak Linux (przez NPTL), warianty BSD, Mac OS X, Windows, Solaris, AIX, HP-UX itp. Systemy operacyjne mogą wykorzystywać różne mechanizmy do obsługi wielowątkowości.

Tutaj graficznie koncepcja jest reprezentowana.

Tutaj możesz znaleźć więcej informacji na ten temat. To było także moje źródło informacji.

Pozwólcie, że dodam zdanie z Wprowadzenie do systemu osadzonego autorstwa Edwarda Lee i Seshii :

Wątki są niezbędnymi programami, które działają jednocześnie i współużytkują przestrzeń pamięci. Mogą uzyskiwać wzajemny dostęp do zmiennych. Wielu praktyków w tej dziedzinie posługuje się terminem „wątki” węższym terminem, aby odnieść się do konkretnych sposobów konstruowania programów, które współużytkują pamięć, [inni] w szerokim znaczeniu do dowolnego mechanizmu, w którym programy imperatywne działają jednocześnie i dzielą pamięć. W tym szerokim znaczeniu wątki występują w postaci przerwań na prawie wszystkich mikroprocesorach, nawet bez żadnego systemu operacyjnego (gołe żelazo).

Leos313
źródło
45

Procesy są jak dwie osoby korzystające z dwóch różnych komputerów, które używają sieci do udostępniania danych w razie potrzeby. Wątki są jak dwie osoby korzystające z tego samego komputera, które nie muszą jawnie udostępniać danych, ale muszą ostrożnie zmieniać się.

Koncepcyjnie wątki to po prostu pszczoły wielu robotników, które brzęczą w tej samej przestrzeni adresowej. Każdy wątek ma swój własny stos, swój licznik programów itp., Ale wszystkie wątki w procesie mają tę samą pamięć. Wyobraź sobie, że dwa programy działają jednocześnie, ale oba mają dostęp do tych samych obiektów.

Porównaj to z procesami. Każdy proces ma swoją własną przestrzeń adresową, co oznacza, że ​​wskaźnik w jednym procesie nie może być używany do odwoływania się do obiektu w innym (chyba że używasz pamięci współdzielonej).

Chyba najważniejsze rzeczy do zrozumienia to:

  • Zarówno procesy, jak i wątki mogą „działać w tym samym czasie”.
  • Procesy nie współużytkują pamięci (domyślnie), ale wątki współużytkują całą swoją pamięć z innymi wątkami w tym samym procesie.
  • Każdy wątek w procesie ma własny stos i własny wskaźnik instrukcji.
Joey Adams
źródło
Mówisz, że „procesy nie współużytkują (domyślnie)”, ale w swojej analogii stwierdzasz, że „procesy są jak dwie osoby korzystające z dwóch różnych komputerów, które używają sieci do udostępniania danych, gdy jest to konieczne”. Czy oni coś dzielą?
zaangażowanieandroider
@committedandroider: Good call. Zredagowałem swoją odpowiedź, aby powiedzieć, że procesy nie współużytkują pamięci (domyślnie), ale wątki współużytkują całą pamięć.
Joey Adams,
36

Mam zamiar użyć dużo tekstu z książki Systemy operacyjne koncepcje ABRAHAMA SILBERSCHATZA, PETERA BAERA GALVINA i GREG GAGNE, a także mojego własnego rozumienia rzeczy.

Proces

Każda aplikacja znajduje się w komputerze w postaci tekstu (lub kodu).

Podkreślamy, że sam program nie jest procesem. Program jest jednostką pasywną, taką jak plik zawierający listę instrukcji przechowywanych na dysku (często nazywany plikiem wykonywalnym).

Kiedy uruchamiamy aplikację, tworzymy instancję wykonania. To wystąpienie wykonania nazywa się procesem. EDYCJA: (Zgodnie z moją interpretacją, analogicznie do klasy i instancji klasy, instancja klasy jest procesem).

Przykładem procesów jest Google Chrome. Kiedy uruchamiamy Google Chrome, odradzają się 3 procesy:

• Proces przeglądarki odpowiada za zarządzanie interfejsem użytkownika oraz dyskowymi i sieciowymi I / O. Nowy proces przeglądarki jest tworzony po uruchomieniu Chrome. Tworzony jest tylko jeden proces przeglądarki.

Renderer procesy zawierać logikę do renderowania stron internetowych. Dlatego zawierają logikę do obsługi HTML, Javascript, obrazów i tak dalej. Zgodnie z ogólną zasadą dla każdej strony internetowej otwartej w nowej karcie tworzony jest nowy proces renderowania, dlatego kilka procesów renderujących może być jednocześnie aktywnych.

• A wtykowe powstaje procesu dla każdego rodzaju wtykowe (taką jak pamięć flash lub QuickTime) w trakcie używania. Procesy wtyczek zawierają kod wtyczki, a także dodatkowy kod, który umożliwia wtyczce komunikowanie się z powiązanymi procesami renderowania i procesem przeglądarki.

Wątek

Aby odpowiedzieć na to pytanie, najpierw powinieneś wiedzieć, czym jest procesor. Procesor to sprzęt, który faktycznie wykonuje obliczenia. EDYCJA: (Obliczenia takie jak dodawanie dwóch liczb, sortowanie tablicy, w zasadzie wykonywanie napisanego kodu)

Teraz przejdźmy do definicji wątku.

Wątek jest podstawową jednostką wykorzystania procesora ; zawiera identyfikator wątku, licznik programu, zestaw rejestrów i stos.

EDYCJA: Definicja wątku ze strony internetowej wywiadu:

Wątek lub wątek wykonania jest terminem programowym na podstawową uporządkowaną sekwencję instrukcji, które mogą być przekazywane lub przetwarzane przez pojedynczy rdzeń procesora.

Tak więc, jeśli proces renderowania z aplikacji Chrome posortuje tablicę liczb, sortowanie odbędzie się według wątku / wątku wykonania. (Gramatyka dotycząca wątków wydaje mi się myląca)

Moja interpretacja rzeczy

Proces jest instancją wykonania. Wątki to faktyczni pracownicy, którzy wykonują obliczenia poprzez dostęp do procesora. Gdy dla procesu działa wiele wątków, proces zapewnia wspólną pamięć.

EDYCJA: Inne informacje, które uznałem za przydatne, aby dać więcej kontekstu

Wszystkie współczesne komputery mają więcej niż jeden wątek. Liczba wątków w komputerze zależy od liczby rdzeni w komputerze.

Przetwarzanie równoległe :

Z Wikipedii:

Obliczenia współbieżne to forma obliczeń, w której kilka obliczeń jest wykonywanych w nakładających się okresach - równocześnie - zamiast sekwencyjnych (jedno kończy się przed kolejnym uruchomieniem). Jest to właściwość systemu - może to być pojedynczy program, komputer lub sieć - i dla każdego obliczenia („proces”) istnieje osobny punkt wykonania lub „wątek kontroli”.

Mógłbym napisać program, który oblicza sumę 4 liczb:

(1 + 3) + (4 + 5)

W programie do obliczenia tej sumy (która będzie jednym procesem uruchomionym na wątku wykonania) mogę rozwidlić inny proces, który może działać na innym wątku do obliczenia (4 + 5) i zwrócić wynik do pierwotnego procesu, podczas gdy oryginalny proces oblicza sumę (1 + 3).

chatuur
źródło
5
to jest prawdziwa odpowiedź
Suhail Mumtaz Awan
1
Bardzo mi pomógł. Tak wygląda wyjaśnienie.
Dinesh Kumar
Ogromną wartością tej odpowiedzi jest to, że stanowi ona podręcznik, w którym można znaleźć więcej szczegółów, jeśli jest to potrzebne. Dziękuję @chatuur!
desa
7

Niestety wątki istnieją. Wątek jest czymś namacalnym. Możesz zabić jednego, a pozostałe będą nadal działać. Możesz odradzać nowe wątki .... chociaż każdy wątek nie jest własnym procesem, działają one osobno w tym procesie. Na maszynach wielordzeniowych jednocześnie mogą działać 2 wątki.

http://en.wikipedia.org/wiki/Simultaneous_multithreading

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf

Orbita
źródło
1
Co sprawia, że ​​jest to „coś namacalnego”? Czy to tylko te dane przechowywane w TLS i stosie wywołań?
Richard
Że to nie jest tylko abstrakcja do zrozumienia ... Gdyby to naprawdę był tylko jeden wątek, który biegał tam iz powrotem podszywając się pod wiele wątków, PO byłby słuszny, ale tak, powiedziałbym, że te dane uczynią go namacalnym .
Orbit
Oświeć mnie . . . więc jaka jest odpowiedź?
Richard
@Richard nie chce wdawać się w debatę na temat semantyki, po prostu sformułował moją odpowiedź, aby spróbować wyjaśnić koncepcyjnie OP.
Orbit
@richard co to jest TLS?
zaangażowanieandroider
6

Wątek jest niczym innym jak kontekstem pamięci (lub, jak lepiej ujął to Tanenbaum, grupowaniem zasobów) z regułami wykonywania. To konstrukcja oprogramowania. Procesor nie ma pojęcia, czym jest wątek (niektóre wyjątki tutaj, niektóre procesory mają wątki sprzętowe), po prostu wykonuje instrukcje.

Jądro wprowadza koncepcję wątków i procesów w celu znaczącego zarządzania pamięcią i kolejnością instrukcji.

Valentin Radu
źródło
5

To zostało zaczerpnięte z odpowiedzi Yahoo:

Wątek jest konstrukcją kodującą, na którą nie ma wpływu architektura aplikacji. Jeden proces często może zawierać wiele wątków. Wątki mogą również komunikować się ze sobą bezpośrednio, ponieważ mają te same zmienne.

Procesy to niezależne jednostki wykonawcze z własnymi informacjami o stanie. Używają również własnych przestrzeni adresowych i mogą wchodzić w interakcje z innymi procesami tylko za pośrednictwem mechanizmów komunikacji międzyprocesowej.

Mówiąc prościej, wątki są jednak jak różne „zadania”. Pomyśl więc, kiedy coś robisz, na przykład zapisujesz formułę na jednym papierze. Można to uznać za jeden wątek. Kolejnym wątkiem jest pisanie czegoś innego na innej kartce papieru. Właśnie tutaj pojawia się wielozadaniowość.

Mówi się, że procesory Intel mają „hiperwątkowość” (AMD też to ma) i ma znacznie lepiej wykonywać wiele „wątków” lub wielozadaniowość.

Nie jestem pewien logistyki, w jaki sposób obsługiwany jest wątek. Pamiętam, że procesor chodził między nimi, ale nie jestem tego w 100% pewien i mam nadzieję, że ktoś inny może na to odpowiedzieć.

Płetwa
źródło
Jak procesory Intel lepiej radzą sobie z wieloma wątkami? W przypadku jednego rdzenia tylko jeden wątek powinien być wykonywany jednocześnie. Zgadzam się z przetwarzaniem procesora w tę iz powrotem. Naprawdę nie możesz tego zrobić lepiej, prawda?
zaangażowanieandroider
Jest to optymalizacja zapewniająca lepszą wydajność w niektórych przypadkach użycia. Możesz przeczytać o hiperwątkowości tutaj: en.wikipedia.org/wiki/Hyper-threading
Jeremy Friesner
5

Odpowiedź różni się znacznie w zależności od systemu i implementacji, ale najważniejsze są:

  1. Wątek ma niezależny wątek wykonania (tzn. Możesz od niego przełączać kontekstowo, a następnie wrócić, a wznowi działanie w miejscu, w którym był).
  2. Wątek ma żywotność (może być utworzony przez inny wątek, a inny wątek może czekać na jego zakończenie).
  3. Prawdopodobnie ma mniej bagażu niż „proces”.

Poza tym: wątki mogą być implementowane w jednym procesie przez środowisko wykonawcze języka, wątki mogą być coroutines, wątki mogą być implementowane w jednym procesie przez bibliotekę wątków lub wątki mogą być konstrukcją jądra.

W kilku współczesnych systemach uniksowych, w tym w Linuksie, z którym jestem najbardziej zaznajomiony, wszystko jest wątkami - proces jest jedynie rodzajem wątku, który dzieli stosunkowo niewiele rzeczy z rodzicem (tzn. Otrzymuje własne odwzorowania pamięci, własną tabelę plików i uprawnienia itp.) Czytanie man 2 clone, szczególnie lista flag, jest tutaj bardzo pouczające.

Hobbs
źródło
Czy przełączanie kontekstu odbywa się tylko wtedy, gdy procesor przechodzi z jednego wątku do drugiego (w tym samym lub innym procesie)?
zaangażowanieandroider
-1

Naprawdę nie jestem zadowolony z żadnej z tych odpowiedzi, więc dodam tutaj swoją własną :) Wątek to abstrakcja jądra do planowania pracy nad procesorem, wątek to to, co jądro daje do zarządzania czasem procesora i dzielić się pracą z innymi

Jon Todirel
źródło
1
-1 Wątek nie musi być tworzony przez jądro. Wątki z obsługą na poziomie jądra są rzeczywiście planowane przez jądro (w którym wydawane jest jakieś wywołanie systemowe). Ale są też wątki z obsługą na poziomie biblioteki użytkownika, w której tabela wątków znajduje się w przestrzeni użytkownika.
AleksandrH
-1

Pozwól mi najpierw wyjaśnić różnicę między procesem a wątkami.

Proces może mieć {1..N} liczbę wątków. Małe wyjaśnienie dotyczące pamięci wirtualnej i procesora wirtualnego.

Pamięć wirtualna

Używany jako przestrzeń wymiany, dzięki czemu proces myśli, że siedzi w pamięci podstawowej w celu wykonania.

Procesor wirtualny

Ta sama koncepcja, co pamięć wirtualna, z wyjątkiem tego, że dotyczy procesora. Procesowi będzie wyglądało, że to jedyna rzecz, która korzysta z procesora.

System operacyjny zajmie się przydzieleniem pamięci wirtualnej i procesora wirtualnego do procesu oraz przeprowadzeniem zamiany między procesami i wykonaniem.

Wszystkie wątki w procesie będą miały tę samą pamięć wirtualną. Ale do każdego wątku zostanie przypisany indywidualny procesor wirtualny, dzięki czemu można je wykonać osobno.

W ten sposób oszczędza się pamięć, a także wykorzystuje procesor do jego potencjału.

Balaji Radhakrishnan
źródło