Wątki a asynchroniczne

82

Czytałem o wątkowym modelu programowania w porównaniu z modelem asynchronicznym z tego naprawdę dobrego artykułu. http://krondo.com/blog/?p=1209

Jednak artykuł wspomina o następujących kwestiach.

  1. Program asynchroniczny po prostu przewyższa program do synchronizacji, przełączając się między zadaniami, gdy występuje we / wy.
  2. Wątki są zarządzane przez system operacyjny.

Pamiętam, jak czytałem, że wątki są zarządzane przez system operacyjny poprzez przemieszczanie się między TCB między Ready-Queue a Waiting-Queue (wśród innych kolejek). W takim przypadku wątki nie tracą czasu na czekanie, prawda?

W świetle powyższego, jakie są zalety programów asynchronicznych nad programami wielowątkowymi?


źródło
5
Nie, miałem na myśli Threaded vs. Async. Wspomniałem o punkcie pierwszym tylko dlatego, że zrozumiałem to z artykułu.

Odpowiedzi:

78
  1. Bardzo trudno jest napisać kod, który jest bezpieczny dla wątków. Dzięki kodowi asynchronicznemu wiesz dokładnie, gdzie kod przesunie się z jednego zadania do drugiego, a zatem warunki wyścigu są znacznie trudniejsze do uzyskania.
  2. Wątki zużywają sporą ilość danych, ponieważ każdy wątek musi mieć własny stos. W przypadku kodu asynchronicznego cały kod korzysta z tego samego stosu, a stos jest niewielki dzięki ciągłemu rozwijaniu stosu między zadaniami.
  3. Wątki są strukturami systemu operacyjnego i dlatego mają więcej pamięci do obsługi przez platformę. Nie ma takiego problemu z zadaniami asynchronicznymi.
doron
źródło
12
Aby trochę rozwinąć: 1. Część I / O kodu z wątkami jest stosunkowo łatwa, ale zarządzanie stanem współdzielonym między wątkami (za pomocą blokad / kolejek / itp.) Bez warunków wyścigu jest tym, co utrudnia. Korzystanie z modelu asynchronicznego oznacza, że ​​w tym samym czasie mniej się dzieje, więc wyścigów można łatwo uniknąć. 2/3. każdy wątek zajmie co najmniej jedną stronę pamięci stosu (zazwyczaj 4KB lub 8KB) oraz pewną nieznaną ilość pamięci dla innych struktur danych związanych ze stanem tego wątku.
Dobes Vandermeer
12

Istnieją dwa sposoby tworzenia wątków:

synchroniczne wątki - rodzic tworzy jeden (lub więcej) wątków potomnych, a następnie musi czekać, aż każde dziecko się zakończy. Synchroniczne gwintowanie jest często określane jako model łączenia widełkowego .

asynchroniczne wątki - rodzic i dziecko działają jednocześnie / niezależnie od siebie. Serwery wielowątkowe zazwyczaj stosują ten model.

zasób - http://www.amazon.com/Operating-System-Concepts-Abraham-Silberschatz/dp/0470128720

Aidan Melen
źródło
7
  1. Załóżmy, że masz 2 zadania, które nie wymagają żadnych operacji we / wy (na komputerze wieloprocesorowym). W tym przypadku wątki przewyższają Async. Ponieważ Async, podobnie jak program jednowątkowy, wykonuje zadania w kolejności. Ale wątki mogą wykonywać oba zadania jednocześnie.

  2. Załóżmy, że masz 2 zadania, które obejmują IO (na komputerze wieloprocesorowym). W tym przypadku zarówno Async, jak i Threads działają mniej więcej tak samo (wydajność może się różnić w zależności od liczby rdzeni, harmonogramu, intensywności przetwarzania itp.). Również Async zajmuje mniej zasobów, niskie narzuty i mniej skomplikowane do programowania w programie wielowątkowym.

Jak to działa? Wątek 1 wykonuje zadanie 1, ponieważ oczekuje na we / wy, jest przenoszony do kolejki oczekiwania we / wy. Podobnie Wątek 2 wykonuje Zadanie 2, ponieważ obejmuje również operacje we / wy, jest przenoszony do kolejki oczekiwania we / wy. Gdy tylko żądanie IO zostanie rozwiązane, jest przenoszone do kolejki gotowości, aby harmonogram mógł zaplanować wykonanie wątku.

Async wykonuje zadanie 1 i bez czekania na zakończenie operacji we / wy kontynuuje zadanie 2, a następnie czeka na zakończenie operacji we / wy obu zadań. Wykonuje zadania w kolejności zakończenia operacji we / wy.

Async najlepiej nadaje się do zadań obejmujących wywołania usług sieci Web, wywołania zapytań do bazy danych itp., Wątki do zadań intensywnie przetwarzających

Poniższy film wyjaśnia, Async vs Threaded modelkiedy używać itp., Https://www.youtube.com/watch?v=kdzL3r-yJZY

Mam nadzieję, że to jest pomocne.

Lakshmipathi
źródło
2
Link do potencjalnego rozwiązania jest zawsze mile widziany, ale dodaj kontekst do niego, aby inni użytkownicy mieli pojęcie, co to jest i dlaczego się tam znajduje. Zawsze cytuj najbardziej odpowiednią część ważnego linku, na wypadek gdyby strona docelowa była nieosiągalna lub została trwale wyłączona. Weź pod uwagę, że fakt, że jest niewiele więcej niż linkiem do zewnętrznej witryny, jest możliwym powodem, dlaczego i w jaki sposób niektóre odpowiedzi są usuwane? .
Machavity
4

Przede wszystkim należy zauważyć, że wiele szczegółów dotyczących implementacji i planowania wątków jest bardzo specyficznych dla systemu operacyjnego. Ogólnie rzecz biorąc, nie powinieneś martwić się o wątki czekające na siebie nawzajem, ponieważ system operacyjny i sprzęt będą próbowały zorganizować ich wydajne działanie, czy to asynchronicznie w systemie jednoprocesorowym, czy równolegle na wielu procesorach.

Gdy wątek zakończy oczekiwanie na coś, powiedzmy we / wy, można go uznać za działający. Wątki, które można uruchomić, zostaną wkrótce zaplanowane do wykonania. To, czy jest to zaimplementowane jako prosta kolejka, czy coś bardziej wyrafinowanego, zależy również od systemu operacyjnego i sprzętu. Możesz myśleć o zestawie zablokowanych wątków jako o zestawie, a nie jako ściśle uporządkowanej kolejce.

Należy zauważyć, że w systemie jednoprocesorowym programy asynchroniczne, jak zdefiniowano tutaj, są równoważne programom wątkowym.

Joe Kearney
źródło
0

Asynchroniczne we / wy oznacza, że ​​w sterowniku jest już wątek, który wykonuje zadanie, więc powielasz funkcjonalność i ponosisz pewne obciążenie. Z drugiej strony często nie jest udokumentowane, jak dokładnie zachowuje się wątek sterownika, aw złożonych scenariuszach, gdy chcesz kontrolować zachowanie timeout / cancellation / start / stop, synchronizację z innymi wątkami, warto zaimplementować własny wątek. Czasami łatwiej jest też rozumować w terminach synchronizacji.

Boris Geller
źródło
5
W ogóle nie tak działa asynchroniczne we / wy. Zasadniczo, I / O jest sterowane zdarzeniami (inicjujesz I / O do urządzenia, później urządzenie je kończy i miejmy nadzieję, że powie ci to z przerwaniem). Istnieje kilka rodzajów operacji we / wy (jak we / wy dysku), w których sterownik używa wątku jądra z niejasnych powodów; ale w przypadku sieci są to operacje asynchroniczne aż do końca.
Glyph
0

zobacz http://en.wikipedia.org/wiki/Thread_(computing)#I.2FO_and_scheduling

Jednak użycie blokowania wywołań systemowych w wątkach użytkownika (w przeciwieństwie do wątków jądra) lub włókien może być problematyczne. Jeśli wątek użytkownika lub światłowód wykonuje wywołanie systemowe, które blokuje, inne wątki użytkownika i włókna w procesie nie mogą działać, dopóki wywołanie systemowe nie powróci. Typowym przykładem tego problemu jest wykonywanie operacji we / wy: większość programów jest napisana w celu synchronicznego wykonywania operacji we / wy. Gdy inicjowana jest operacja we / wy, wywoływane jest wywołanie systemowe i nie jest zwracane, dopóki operacja we / wy nie zostanie zakończona. W międzyczasie cały proces jest „blokowany” przez jądro i nie może działać, co uniemożliwia wykonywanie innych wątków użytkownika i włókien w tym samym procesie.

W związku z tym cały proces może zostać zablokowany i żaden wątek nie zostanie zaplanowany, gdy jeden wątek zostanie zablokowany w IO. Myślę, że jest to specyficzne dla systemu operacyjnego i nie zawsze będzie utrzymywane.

radość
źródło