2016-08-20 31 views
8

我想知道當沒有IO線程處理異步調用的結果時會發生什麼。假設你做了一個異步web請求(在服務器應用程序中,所有的異步代碼都由線程池處理)。操作系統會發出信號,告訴您何時有結果,何時需要IO線程從套接字讀取字節。如果沒有IO線程可用,因爲這些線程都在使用中(全部含義由線程池設置的最大值)會發生什麼情況?有信號可以等待,直到有線程可用的隊列嗎?還是信號只是聞所未聞?如果後者發生,等待等待的代碼會發生什麼?如果沒有IO線程來處理異步結果,會發生什麼情況?

+0

當您要求計算機執行太多操作時會發生這種情況:它只會減慢速度。這是非常深埋,實際上不是CLR的一部分,[IHostIOCompletionManager接口](https://msdn.microsoft.com/en-us/library/ms164490(v = vs.110).aspx)可以完成工作。取決於你使用的主機。在實踐中,假設SetMaxThreads()的* completionPortThreads *參數完全被忽略,同時執行的*(未等待)io完成的最大數量等於處理器內核的數量通常是安全的。 –

回答

5

除非您限制了線程池,否則它將根據需要創建新的I/O線程。信號以類似隊列的結構等待,稱爲I/O Completion Port (IOCP),直到它被檢索到;信號不會丟失。

+0

線程池具有IO(和worker)線程數的最大值。你說它會超過這個價值來處理這些信號?或者只是如果我們不是最大的一個新的線程將被創建,否則它坐落在IOCP隊列中? – shortspider

+1

不,它不會超過限制,但如所暗示的那樣,它將排隊等待輪到它,並且如果IO線程的數量受到限制,等待時間將會延長 –

2

讓我們回到更早的時候,當OS使用初步和沒有的concurrency很大餘地,那麼,如果你打開多個應用程序,這需要IOExcel, Word, Pdf, Ppt,系統將顯示爲紅,反應遲鈍,因爲它不能將它們全部處理在一起,但是如果你停止排隊請求更多,並且系統不會崩潰,那麼你將看到所有這些人都有機會,並且他們再次活躍起來。

這是IO requests已被排隊等待處理的典型用例,它們中的任何一個都不會丟失,直到並且除非系統崩潰,由於其實現的魯棒性,現在不會經常發生,記住藍色死亡的屏幕,這仍然可以發生,這是IO請求丟失的唯一一點。

實際上,Windows中線程的本質就是在併發性之前引入健壯性,這樣排隊等待處理的東西就不會丟失。在任何時候,它都會超出限制以創建超過所需數量的線程

相關問題