1. ホーム
  2. .net

.NETのワーカーとI/Oスレッドの簡単な説明

2023-10-21 08:17:34

質問

.NETのワーカーとI/Oスレッドの詳細かつシンプルな説明を見つけるのは非常に困難です。

このトピックに関して私にとって明確なこと(しかし技術的に正確ではないかもしれません)。

  • ワーカースレッドは でなければなりません。 を使用するスレッドです。
  • I/O スレッド (補完ポート スレッドとも呼ばれます) でなければなりません。 デバイスドライバを使用し、基本的に何もせず、CPU 以外の操作の完了を監視するだけです。

明確でないこと

  • ThreadPool.GetAvailableThread メソッドは両方のタイプの利用可能なスレッドの数を返しますが、I/O スレッドの作業をスケジュールするパブリック API はないようです。.NET でワーカー スレッドを手動で作成することしかできないのでしょうか。
  • 1 つの I/O スレッドで複数の I/O 操作を監視できるようです。それは本当ですか?もしそうなら、なぜThreadPoolはデフォルトで非常に多くの利用可能なI/Oスレッドを持っているのですか?
  • いくつかのテキストで、私は、I/O操作の完了後にトリガされるコールバックは、I/Oスレッドによって実行されると読みました。それは本当ですか?このコールバックはCPU操作であることを考えると、ワーカスレッドの仕事ではないのでしょうか?
  • より具体的には、ASP.NET非同期ページではI/Oスレッドを使用しますか?ワーカスレッドの最大数を増やす代わりに、I/O作業を別のスレッドに切り替えることで、パフォーマンスの利点は正確には何ですか?それは、単一のI/Oスレッドが複数の操作を監視するためでしょうか?またはWindowsは、I/Oスレッドを使用する場合、より効率的なコンテキストスイッチングを行うのですか?

どのように解決するのですか?

.net/CLR における「ワーカー スレッド」という用語は、通常、スレッドを生成したアプリケーションに代わって何らかの「作業」を行うメイン スレッド以外のすべてのスレッドを指します。 仕事」とは、I/O が完了するのを待つなど、本当に何でもありです。 スレッドを作成するにはコストがかかるため、ThreadPool はワーカスレッドのキャッシュを保持します。

.net/CLR の「I/O スレッド」という用語は、quot;overlapped" win32 コールからの NativeOverlapped コールバック (補完ポート I/O" とも呼ばれる) をディスパッチするために ThreadPool が予約するスレッドを指しています。CLR は独自の I/O 補完ポートを維持し、任意のハンドルを(ThreadPool.BindHandle API を使用して)それにバインドすることができます。 ここに例があります。 http://blogs.msdn.com/junfeng/archive/2008/12/01/threadpool-bindhandle.aspx . 多くの .net API は NativeOverlapped コールバックを受け取るためにこのメカニズムを内部的に使用していますが、典型的な .net 開発者はこれを直接使用することはありません。

Worker スレッド」と「I/O スレッド」の間には技術的な違いはなく、どちらも通常のスレッドです。 しかし、CLR ThreadPool は、ワーカー スレッドへの高い要求がネイティブ I/O コールバックをディスパッチするために利用可能なすべてのスレッドを使い果たすという状況を避けるために、単にそれぞれの個別のプールを保持します(潜在的にデッドロックにつながる)。(250 個のワーカー スレッドをすべて使用するアプリケーションを想像してください。各スレッドは、完了するいくつかの I/O を待機しています)。

開発者は、I/O スレッドが ThreadPool に返されることを確実にするために I/O コールバックを処理するときにいくつかの注意を払う必要があります。より多くの作業が必要な場合、その作業はワーカスレッドでスケジュールされるべきである。そうでない場合、アプリケーションは、通常のワーカー スレッドとして使用するために予約された I/O 完了スレッドの CLR のプールを「ハイジャック」し、前述のデッドロックの状況を引き起こす危険があります。

さらに読むための良い参考文献をいくつか紹介します。 win32 I/O 補完ポート。 http://msdn.microsoft.com/en-us/library/aa365198(VS.85).aspx 管理されたスレッドプール。 http://msdn.microsoft.com/en-us/library/0ka9477y.aspx BindHandle の例です。 http://blogs.msdn.com/junfeng/archive/2008/12/01/threadpool-bindhandle.aspx