W ą t e k (lekki proces) thread
Co to jest wątek? To wydzielony fragment wykonywanego programu To jednostka wykonawcza w obrębie jednego procesu, będąca kolejnym ciągiem instrukcji wykonywanym w obrębie tych samych danych (w tej samej przestrzeni adresowej).
W ą t k i Wątki tego samego procesu korzystają ze wspólnego kodu i danych, mają jednak oddzielne stosy. W systemach wieloprocesorowych, a także w systemach z wywłaszczaniem, wątki mogą być wykonywane równocześnie (współbieżnie). Równoczesny dostęp do wspólnych danych grozi jednak utratą spójności danych i w konsekwencji błędem działania programu.
W ą t e k Stan wątku jest zdefiniowany małą ilością odrębnych danych. Grupa równoprawnych wątków dzieli kod, przestrzeń adresową i zasoby systemu operacyjnego. Środowisko w którym działa wątek nazywa się zadaniem lub procesem.
Tradycyjny proces Tradycyjny (ciężki) proces jest równoważny zadaniu z tylko jednym wątkiem. Zadanie nic nie robi, jeśli nie ma w nim ani jednego wątku, z kolei wątek może przebiegać w dokładnie jednym zadaniu.
Pojedynczy wątek Pojedynczy wątek ma przynajmniej własny stan rejestrów i na ogół własny stos. Daleko posunięty podział powoduje, że przełączanie procesora między równoprawnymi wątkami, jak również tworzenie wątków jest tanie w porównaniu z przełączaniem kontekstu między tradycyjnymi procesami.
W ą t k i Wstrzymanie jednego wątku i włączenie innego wątku jest względnie dobrym rozwiązaniem zagadnienia – w jaki sposób jeden system obsługi może efektywnie wykonać wiele zamówień. Wiele wątków sterowania jest powiązanych z kilkoma zasobami dzielonymi.
Sposoby traktowania wątków Wątki mogą być obsługiwane przez jądro. (Jest tak w przypadku systemów operacyjnych Mach i OS/2). W tym przypadku systemy zawierają zbiór funkcji podobnych do tych, które obsługują procesy.
Sposoby traktowania wątków Inne podejście polega na tworzeniu wątków powyżej jądra systemu za pomocą zbioru funkcji bibliotecznych wykonywanych na poziomie użytkownika (takie rozwiązanie przyjęto w systemie Andrew).
Systemy wielowątkowe Przykładem takiego systemu jest system Mach. Jego jadro może obsługiwać wiele zamówień naraz. W tym przypadku wątki synchronizują się same – nowy wątek z tej samej grupy zadziała dopiero wtedy, gdy bieżący wątek odda sterowanie.
Systemy wielowątkowe Wielowątkowość to cecha systemu operacyjnego, dzięki której w ramach jednego procesu może wykonywać kilka wątków lub jednostek wykonawczych. Nowe wątki to kolejne ciągi instrukcji wykonywane oddzielnie. Wszystkie wątki tego samego procesu współdzielą kod programu i dane. W systemach nie obsługujących wielowątkowości pojęcia procesu i wątku utożsamiają się. Systemy wielowątkowe to m.in. BeOS, Microsoft Windows 95, Windows NT, Unix.
Systemy wielowątkowe Wątek bieżący powinien oddawać sterowanie tylko w takiej chwili, w której nie zmienia on wspólnych danych. W systemach z asynchronicznymi wątkami musi istnieć jawny mechanizm zajmowania danych, taki jak w systemach, w których wiele procesów dzieli wspólne dane.
Systemy wielowątkowe Jeśli zadanie składa się z wielu wątków, to w czasie gdy jeden z wątków jest zablokowany, może wykonywać się inny wątek tego samego zadania. Współpraca wielu wątków w jednym zadaniu pozwala zwiększać przepustowość poprawić wydajność.
Podręcznikowy przykład: ciąg instrukcji odczyt-zmiana-zapis. Załóżmy że program ma dane do przetwarzania, umieszczone w N pierwszych komórkach tablicy X. Liczba N zapisana jest w odpowiedniej zmiennej. Algorytm przetwarzania mógłby wyglądać następująco: 1. odczytaj zmienną N i sprawdź, czy jest równa 0 2. jeśli tak (nie ma danych w X), przejdź do kroku 7. 3. (tu wchodzimy, gdy N równe 1 lub więcej) odczytaj wartość X[N] 4. zmniejsz wartość N o 1 (zaznacz, że N-ta dana została już zabrana) 5. zrób coś z tą odczytaną daną (tu następuje właściwe przetwarzanie) 6. (dana obsłużona - zajmij się następną) przejdź do kroku 1. 7. (koniec pracy)
Podręcznikowy przykład: ciąg instrukcji odczyt-zmiana-zapis. Jest to najprostsza pętla opróżniająca stos X. W środowisku jednowątkowym działa zgodnie z oczekiwaniami, przetwarzając kolejno dane X[N], X[N-1], itd. aż do X[1], po czym zatrzymuje się z zerową wartością zmiennej N.
W środowisku wielowątkowym Jednak w środowisku wielowątkowym dwa równoczesne wątki mogą wykonać się w taki sposób (załóżmy N=2): Jak widać, oba wątki pobrały do przetwarzania tę samą daną X[2]. Jeśli nasz program jest systemem księgowym, a w X[2] było zapisane "dokonaj przelewu kwoty xxxx z rachunku nnnn na rachunek mmmm", to przelew zostanie zaksięgowany dwukrotnie
W środowisku wielowątkowym W dalszym ciągu wykonania tego samego programu możliwy jest również inny przypadek. Przypuśćmy, że wątek nr 1 wolniej przetwarzał X[2] i teraz wątek nr 2 zaczyna kolejny cykl: Pomimo posłużenia się licznikiem N, wątek nr 1 usiłuje pobrać nieistniejący element danych spod nielegalnego indeksu - X[0]. W zależności od różnych czynników spowoduje to albo natychmiastowe awaryjne przerwanie działania programu, albo dowolne, nieprzewidywalne zaburzenia (błędy) w dalszym jego działaniu.
Mechanizmy synchronizacji wątków Do zapobiegania takim sytuacjom wykorzystuje się mechanizmy synchronizacji wątków: semafory, (jeden ze sposobów komunikacji międzyprocesowej ) muteksy, (wzajemne wykluczanie) sekcje krytyczne (fragment kodu programu, który w danej chwili powinien być wykonywany przez nie więcej niż jeden proces).