2016-08-20 12 views
8

Zastanawiam się, co się dzieje, gdy nie ma wątków IO do obsługi wyniku połączenia asynchronicznego.Co się stanie, jeśli nie ma wątków IO do obsługi wyniku asynchronicznego?

Załóżmy, że wykonujesz żądanie asynchroniczne (w aplikacji serwera, więc cały kod asynchroniczny jest przekazywany przez pulę wątków). System operacyjny zasygnalizuje, kiedy pojawi się wynik, a kiedy będzie potrzebny, będzie potrzebny wątek IO do odczytania bajtów z gniazda. Jeśli nie ma dostępnych wątków IO, ponieważ wszystko jest w użyciu (co oznacza maksimum ustawione przez pulę wątków), co się dzieje? Czy istnieje kolejka, w której sygnał może czekać, aż będzie dostępny wątek? A może sygnał nie słychać? Jeśli tak się stanie, co stanie się z kodem czekającym na oczekiwanie?

+0

Zwykle dzieje się tak, gdy prosisz komputer o zbyt wiele rzeczy: po prostu zwalnia. Jest to bardzo głęboko ukryte i nie jest częścią CLR, [IHostIOCompletionManager interface] (https://msdn.microsoft.com/en-us/library/ms164490 (v = vs.110) .aspx) wykonuje zadanie . Zależy od hosta, którego używasz. W praktyce zwykle można bezpiecznie założyć, że argument * completionPortThreads * dla SetMaxThreads() jest całkowicie ignorowany, a maksymalna liczba równoczesnych * wykonywanych * (nie oczekujących) uzupełnień io jest równa liczbie rdzeni procesorów. –

Odpowiedz

5

Jeśli nie ograniczysz puli wątków, utworzy on nowe wątki we/wy w razie potrzeby. Sygnał czeka w strukturze przypominającej kolejkę o nazwie I/O Completion Port (IOCP), dopóki nie zostanie odzyskany; sygnały nie są tracone.

+0

Pula wątków ma maksymalną wartość dla liczby wątków IO (i wątków roboczych). Twoje powiedzenie, że przekroczy tę wartość, aby poradzić sobie z tymi sygnałami? Lub po prostu, jeśli nie jesteśmy w stanie maksymalnym, zostanie utworzony nowy wątek, w przeciwnym razie będzie on umieszczony w kolejce IOCP? – shortspider

+1

Nie, to nie przejdzie, aby przekroczyć limit, ale zgodnie z sugestią, będzie czekał w kolejce na swoją kolej i że oczekiwanie będzie przedłużone, jeśli jest ograniczenie liczby wątków IO, które można wywołać –

2

Wróćmy do dawnych czasów, kiedy OS stosowanie wstępnych i nie mają dużo zakres od concurrency, a następnie, jeśli otworzyć wiele aplikacji, która potrzebuje IO jak Excel, Word, Pdf, Ppt, system wydaje się być zawieszony i nie reaguje, ponieważ nie poradzimy sobie z nimi wszystkimi razem, ale jeśli przestaniesz stawiać kolejną kolejną prośbę, a system się nie zawiesza, wtedy zobaczysz, że wszystkie z nich dostają swoją szansę i znowu się aktywują.

To jest typowy przypadek użycia IO requests w kolejce czekając na przetwarzanie, żadna z nich nie jest tracona aż do czasu awarii systemu, co nie zdarza się tak często, ze względu na solidność jego realizacji, pamiętaj Blue ekran śmierci, który wciąż może się zdarzyć i to jedyny punkt, w którym wnioski o IO zostaną utracone.

Istotą wątków w systemie Windows jest wprowadzenie niezawodności nawet przed współbieżnością, aby nic nie było w kolejce do przetwarzania. W żadnym momencie nie przekroczy limitu, aby utworzyć więcej niż wymaganą liczbę wątków.