私は現在、インターネットでカスタム スレッド プールの実装を探しています。IOCP を使用する実装を見つけました。それらを使用することの利点は何ですか?彼らは仕事盗みを提供していますか、それともそのようなものですか、私は本当に答えを見つけることができました...
2 に答える
IOCP = "IO 完了ポート"。これは、Windows OS に組み込まれたカーネル オブジェクトであり、マルチスレッドの非同期 IO をインテリジェントに管理する方法を提供します。
非常に単純化した (そして少し単純化しすぎた) 用語で言えば、実行したい IO ジョブについて IOCP に伝えます。それらを非同期で実行し、それらの各ジョブの結果のキューを維持します。ジョブについて IOCP に通知するための呼び出しは、すぐに返されます (IO が発生している間はブロックされません)。概念的には .NET IAsyncResult に似たオブジェクトが返されます。必要に応じてブロックしたり、コールバックを提供したり、定期的にポーリングしてジョブが完了したかどうかを確認したりできます。
これらのジョブを実行している間、IOCP はスレッド プールを使用します。スレッド プールは、スレッドの数をプロセッサの数以下に制限しようとします (これは構成可能ですが、目的とデフォルトはプロセッサの数に制限することです)。ただし、IOCP は、これらのスレッドのタスクがブロックされる場合があるという事実に備えています。Asycn IO タスクはブロックされませんが、別の種類のタスクを提供した可能性があります。したがって、IOCP に別の数値を与えることができます...これは、他のスレッドの 1 つがブロックされているために IOCP が上昇できる「通常の最大値」を超えるスレッドの数です。目標は、実際に何かを実行している (つまり、ブロックされていない) スレッドを「通常の最大」数にすることです。これが発生した場合、しばらくの間、IOCP は通常の最大数よりも多くのスレッドを使用します。
これは簡単な要約であり、概念のみであり、前述したように、いくつかの点で単純化しすぎています。しかし、それはあなたに一般的な考えを与えるはずです。Windows OS に関する Jeffrey Richter の本では、これについて詳しく説明されています (ただし、これらの本は現在絶版になっています)。これらの本は中古品であることがわかりますが、実際には当初よりも中古品の価格が高くなっています。「Advanced Windows」はあなたが望むタイトルだと思いますが、別のタイトルの本の更新版が存在する可能性があります。