Współbieżność w Pythonie - wątki
Ogólnie rzecz biorąc, jak wiemy, nić to bardzo cienki skręcony sznurek, zwykle z bawełny lub jedwabiu, używany do szycia odzieży i tym podobnych. Ten sam termin wątek jest również używany w świecie programowania komputerowego. A teraz, jak odnosimy się do nici używanej do szycia ubrań i nici używanej do programowania komputerowego? Role pełnione przez te dwa wątki są tutaj podobne. W ubraniach nić trzyma materiał razem, a po drugiej stronie, w programowaniu komputerowym, nić trzyma program komputerowy i pozwala programowi wykonywać sekwencyjne akcje lub wiele działań jednocześnie.
Threadto najmniejsza jednostka wykonania w systemie operacyjnym. Sam w sobie nie jest programem, ale działa w programie. Innymi słowy, wątki nie są od siebie niezależne i współużytkują sekcję kodu, sekcję danych itp. Z innymi wątkami. Te wątki są również znane jako lekkie procesy.
Stany wątku
Aby dogłębnie zrozumieć funkcjonalność wątków, musimy poznać cykl życia wątków lub różne stany wątków. Zazwyczaj wątek może istnieć w pięciu różnych stanach. Poniżej przedstawiono różne stany -
Nowy wątek
Nowy wątek rozpoczyna swój cykl życia w nowym stanie. Jednak na tym etapie jeszcze się nie rozpoczął i nie przydzielono mu żadnych środków. Można powiedzieć, że jest to tylko instancja obiektu.
Runnable
Gdy nowo narodzony wątek jest uruchamiany, wątek staje się gotowy do uruchomienia, tj. Czeka na uruchomienie. W tym stanie ma wszystkie zasoby, ale nadal harmonogram zadań nie zaplanował jego uruchomienia.
Bieganie
W tym stanie wątek wykonuje postęp i wykonuje zadanie, które zostało wybrane do uruchomienia przez harmonogram zadań. Teraz wątek może przejść do stanu martwego lub niedziałającego / oczekującego.
Nie działa / czeka
W tym stanie wątek jest wstrzymywany, ponieważ czeka na odpowiedź jakiegoś żądania we / wy lub na zakończenie wykonywania innego wątku.
Nie żyje
Uruchomiony wątek przechodzi w stan zakończony po zakończeniu zadania lub w inny sposób.
Poniższy diagram przedstawia pełny cykl życia wątku -
Rodzaje wątków
W tej sekcji zobaczymy różne rodzaje nici. Rodzaje opisano poniżej -
Wątki na poziomie użytkownika
To są wątki zarządzane przez użytkowników.
W tym przypadku jądro zarządzania wątkami nie jest świadome istnienia wątków. Biblioteka wątków zawiera kod do tworzenia i niszczenia wątków, do przekazywania wiadomości i danych między wątkami, do planowania wykonywania wątków oraz do zapisywania i przywracania kontekstów wątków. Aplikacja rozpoczyna się od pojedynczego wątku.
Przykłady wątków na poziomie użytkownika to -
- Wątki Java
- Wątki POSIX
Zalety wątków na poziomie użytkownika
Poniżej przedstawiono różne zalety wątków na poziomie użytkownika -
- Przełączanie wątków nie wymaga uprawnień trybu jądra.
- Wątek na poziomie użytkownika może działać w dowolnym systemie operacyjnym.
- Planowanie może być specyficzne dla aplikacji w wątku na poziomie użytkownika.
- Wątki na poziomie użytkownika są szybkie w tworzeniu i zarządzaniu.
Wady wątków na poziomie użytkownika
Poniżej przedstawiono różne wady wątków na poziomie użytkownika -
- W typowym systemie operacyjnym większość wywołań systemowych jest blokowana.
- Aplikacja wielowątkowa nie może korzystać z wieloprocesowości.
Wątki na poziomie jądra
Wątki zarządzane przez system operacyjny działają na jądro, które jest rdzeniem systemu operacyjnego.
W tym przypadku jądro zarządza wątkami. W obszarze aplikacji nie ma kodu zarządzania wątkami. Wątki jądra są obsługiwane bezpośrednio przez system operacyjny. Każda aplikacja może zostać zaprogramowana jako wielowątkowa. Wszystkie wątki w aplikacji są obsługiwane w ramach jednego procesu.
Jądro przechowuje informacje kontekstowe dla całego procesu i dla poszczególnych wątków w procesie. Planowanie przez jądro odbywa się na zasadzie wątku. Kernel wykonuje tworzenie wątków, planowanie i zarządzanie w przestrzeni jądra. Wątki jądra są generalnie wolniejsze w tworzeniu i zarządzaniu niż wątki użytkownika. Przykładami wątków na poziomie jądra są Windows, Solaris.
Zalety wątków na poziomie jądra
Poniżej przedstawiono różne zalety wątków na poziomie jądra -
Kernel może jednocześnie zaplanować wiele wątków z tego samego procesu w wielu procesach.
Jeśli jeden wątek procesu jest zablokowany, jądro może zaplanować inny wątek tego samego procesu.
Same procedury jądra mogą być wielowątkowe.
Wady wątków na poziomie jądra
Wątki jądra są generalnie wolniejsze w tworzeniu i zarządzaniu niż wątki użytkownika.
Przeniesienie kontroli z jednego wątku do drugiego w ramach tego samego procesu wymaga przełączenia trybu na jądro.
Blok kontroli wątku - TCB
Blok kontroli wątków (TCB) można zdefiniować jako strukturę danych w jądrze systemu operacyjnego, która zawiera głównie informacje o wątku. Informacje specyficzne dla wątku przechowywane w TCB mogą uwydatnić kilka ważnych informacji o każdym procesie.
Rozważ następujące punkty związane z wątkami zawartymi w TCB -
Thread identification - Jest to unikalny identyfikator wątku (tid) przypisany do każdego nowego wątku.
Thread state - Zawiera informacje związane ze stanem (uruchomiony, działający, niedziałający, martwy) wątku.
Program Counter (PC) - Wskazuje na aktualną instrukcję programu wątku.
Register set - Zawiera wartości rejestrów wątku przypisane im do obliczeń.
Stack Pointer- Wskazuje na stos wątków w procesie. Zawiera zmienne lokalne w zakresie wątku.
Pointer to PCB - Zawiera wskaźnik do procesu, który utworzył ten wątek.
Relacja między procesem a wątkiem
W wielowątkowości proces i wątek to dwa bardzo ściśle powiązane terminy, których celem jest umożliwienie komputerowi wykonywania więcej niż jednej rzeczy naraz. Proces może zawierać jeden lub więcej wątków, ale wręcz przeciwnie, wątek nie może zawierać procesu. Jednak obie pozostają dwiema podstawowymi jednostkami egzekucyjnymi. Program wykonujący serię instrukcji inicjuje proces i wątkuje oba.
Poniższa tabela przedstawia porównanie procesu i wątku -
Proces | Wątek |
---|---|
Proces jest ciężki lub wymaga dużej ilości zasobów. | Wątek jest lekki, co wymaga mniej zasobów niż proces. |
Przełączanie procesów wymaga interakcji z systemem operacyjnym. | Przełączanie wątków nie wymaga interakcji z systemem operacyjnym. |
W wielu środowiskach przetwarzania każdy proces wykonuje ten sam kod, ale ma własną pamięć i zasoby plików. | Wszystkie wątki mogą współdzielić ten sam zestaw otwartych plików, procesów potomnych. |
Jeśli jeden proces jest zablokowany, żaden inny proces nie może zostać wykonany, dopóki pierwszy proces nie zostanie odblokowany. | Podczas gdy jeden wątek jest zablokowany i czeka, można uruchomić drugi wątek w tym samym zadaniu. |
Wiele procesów bez użycia wątków zużywa więcej zasobów. | Wiele procesów wielowątkowych zużywa mniej zasobów. |
W przypadku wielu procesów każdy proces działa niezależnie od innych. | Jeden wątek może czytać, zapisywać lub zmieniać dane innego wątku. |
Jeśli nastąpiłaby jakakolwiek zmiana w procesie nadrzędnym, nie ma to wpływu na procesy potomne. | Jeśli nastąpiłaby jakakolwiek zmiana w głównym wątku, może to wpłynąć na zachowanie innych wątków tego procesu. |
Aby komunikować się z procesami rodzeństwa, procesy muszą wykorzystywać komunikację międzyprocesową. | Wątki mogą bezpośrednio komunikować się z innymi wątkami tego procesu. |
Koncepcja wielowątkowości
Jak omówiliśmy wcześniej, wielowątkowość to zdolność procesora do zarządzania wykorzystaniem systemu operacyjnego poprzez jednoczesne wykonywanie wielu wątków. Główną ideą wielowątkowości jest osiągnięcie równoległości poprzez podzielenie procesu na wiele wątków. Mówiąc prościej, możemy powiedzieć, że wielowątkowość to sposób na osiągnięcie wielozadaniowości przy użyciu pojęcia wątków.
Pojęcie wielowątkowości można zrozumieć na poniższym przykładzie.
Przykład
Załóżmy, że uruchamiamy proces. Proces może polegać na otwarciu słowa MS na napisanie czegoś. W takim procesie jeden wątek zostanie przypisany do otwartego słowa MS, a inny wątek będzie musiał pisać. Teraz załóżmy, że jeśli chcemy coś edytować, to do wykonania zadania edycji będzie potrzebny inny wątek i tak dalej.
Poniższy diagram pomaga nam zrozumieć, jak wiele wątków istnieje w pamięci -
Na powyższym diagramie widać, że w jednym procesie może istnieć więcej niż jeden wątek, w którym każdy wątek zawiera własny zestaw rejestrów i zmienne lokalne. Poza tym wszystkie wątki w procesie mają wspólne zmienne globalne.
Zalety wielowątkowości
Przyjrzyjmy się teraz kilku zaletom wielowątkowości. Zalety są następujące -
Speed of communication - Wielowątkowość poprawia szybkość obliczeń, ponieważ każdy rdzeń lub procesor obsługuje jednocześnie oddzielne wątki.
Program remains responsive - Umożliwia programowi pozostanie responsywnym, ponieważ jeden wątek czeka na dane wejściowe, a inny jednocześnie uruchamia GUI.
Access to global variables - W przypadku wielowątkowości wszystkie wątki danego procesu mają dostęp do zmiennych globalnych, a jeśli nastąpi jakakolwiek zmiana w zmiennej globalnej, będzie ona widoczna również dla innych wątków.
Utilization of resources - Uruchomienie kilku wątków w każdym programie powoduje lepsze wykorzystanie procesora i skraca czas bezczynności procesora.
Sharing of data - Nie jest wymagane dodatkowe miejsce na każdy wątek, ponieważ wątki w programie mogą współużytkować te same dane.
Wady wielowątkowości
Przyjrzyjmy się teraz kilku wadom wielowątkowości. Wady są następujące -
Not suitable for single processor system - Wielowątkowość ma trudności z osiągnięciem wydajności pod względem szybkości obliczeń w systemie jednoprocesorowym w porównaniu z wydajnością w systemie wieloprocesorowym.
Issue of security - Ponieważ wiemy, że wszystkie wątki w programie współużytkują te same dane, dlatego zawsze istnieje kwestia bezpieczeństwa, ponieważ każdy nieznany wątek może zmienić dane.
Increase in complexity - Wielowątkowość może zwiększyć złożoność programu, a debugowanie staje się trudne.
Lead to deadlock state - Wielowątkowość może prowadzić do potencjalnego ryzyka osiągnięcia stanu zakleszczenia przez program.
Synchronization required- Synchronizacja jest wymagana, aby uniknąć wzajemnego wykluczenia. Prowadzi to do większego wykorzystania pamięci i procesora.