2016-08-20 10 views
8

非同期呼び出しの結果を処理するIOスレッドがないとどうなるのだろうかと思います。非同期結果を処理するIOスレッドがないとどうなりますか?

(非同期コードがすべてスレッドプールによってハンドラされるように、サーバーアプリケーション内で)非同期Webリクエストを作成するとします。 OSはあなたのために結果があるときにシグナルを出し、ソケットからバイトを読み取るためにIOスレッドが必要なときは通知します。それがすべて使用されているため(すべてスレッドプールによって設定されたmaxまでの意味で)使用可能な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(およびワーカー)スレッドの数の最大値があります。これらの信号を扱うためには、その価値を超えると言いますか?それとも、もし我々が最大値に達していなければ、新しいスレッドが作成されます。さもなければ、それはIOCPキューに置かれますか? – shortspider

+1

いいえ、限界を超えることはできませんが、提案されているように、それはターンを待って待ち行列に入れられ、呼び出すことができるIOスレッドの数に制限がある場合、待ち時間が長くなります –

2

予備の際OS使用者が戻って、以前の倍に行こうとconcurrencyの多くのスコープを持っていなかったあなたがExcel, Word, Pdf, PptのようなIOを必要とする複数のアプリケーションを、開いている場合、その後、システムはそれ以来、ハングして応答しないように見えますそれらのすべてを一緒に扱うことはできませんが、より多くのリクエストを待ち行列に入れずにシステムがクラッシュしなければ、それらのすべてがチャンスを得て再びアクティブになることがわかります。

IO requestsが処理待ちの状態で待機している典型的な使用例ですが、システムのクラッシュが発生しない限り、それらは失われません。現時点では発生しません。死の画面は、まだ起こる可能性があり、IO要求が失われる唯一の点です。

実際、Windowsでのスレッドの本質は、並行処理の前であっても堅牢性を導入することであり、処理のためにキューに入れられるものは失われません。必要な数以上のスレッドを作成するには、限界を超えてはなりません。

関連する問題