.NETのワーカーとI/Oスレッドの簡単な説明
質問
.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
関連
-
[解決済み] CLSID {XXXX} を持つコンポーネントの COM クラスファクトリの取得は、次のエラーにより失敗しました: 80040154。
-
[解決済み] CryptographicException「キーセットが存在しない」、ただしWCF経由に限る
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] .NETでのdecimal, float, doubleの違い?
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] Microsoft Officeをインストールせずに、C#でExcel(.XLSおよび.XLSX)ファイルを作成するにはどうすればよいですか?
-
[解決済み] プロセスとスレッドの違いは何ですか?
-
[解決済み] .NET Coreと.NET Standard Class Libraryのプロジェクトタイプの違いは何ですか?
-
[解決済み】非同期プログラミングとマルチスレッドの違いは何ですか?
-
[解決済み] スレッド間で例外を伝播させるにはどうしたらいいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] app.configのマッピングがないアセンブリのapp.configの再マッピングを考慮する。
-
[解決済み] ポストバックまたはコールバックの引数が無効です。 イベント検証は '<pages enableEventValidation="true"/>' を使用して有効になっています。
-
[解決済み] 16進数値0x00は無効な文字です。
-
[解決済み] スマートクライアント・ソフトウェアファクトリーの体験談
-
[解決済み] NetFx45WebLinkとNetFx45RedistLinkの違いは何ですか?
-
[解決済み] Microsoft.NETFrameworkとMicrosoft.NETFramework64の違いは何ですか?
-
[解決済み] .Netの配列のLongLengthの目的は何ですか?
-
[解決済み] Moq Callbackについて教えてください。
-
[解決済み] AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersionの違いは何ですか?
-
[解決済み] Entity FrameworkとLINQ to SQLの比較