I/O 完了ポートが高速で優れたモデルであると多くの人が言うのはなぜですか?
I/O 完了ポートの長所と短所は何ですか?
I/O 完了ポートが他のアプローチよりも高速になるポイントを知りたいです。
他のモデル(select、epoll、従来のマルチスレッド/マルチプロセス)と比較して説明できるとより良いでしょう。
I/O 完了ポートが高速で優れたモデルであると多くの人が言うのはなぜですか?
I/O 完了ポートの長所と短所は何ですか?
I/O 完了ポートが他のアプローチよりも高速になるポイントを知りたいです。
他のモデル(select、epoll、従来のマルチスレッド/マルチプロセス)と比較して説明できるとより良いでしょう。
I/O完了ポートは素晴らしいです。それらを説明するのにこれ以上の言葉はありません。Windowsで何かが正しく行われた場合、それは完了ポートです。
いくつかのスレッドを作成し(実際にはいくつでもかまいません)、イベント(手動で投稿したスレッド、タイマーや非同期I / Oからのイベントなど)が到着するまで、1つの完了ポートですべてのスレッドをブロックできます。 。次に、完了ポートは、指定した制限まで、イベントを処理するために1つのスレッドをウェイクアップします。何も指定しなかった場合は、「最大CPUコア数」と想定されます。これは非常に便利です。
すでに最大制限を超える数のスレッドがアクティブになっている場合は、そのうちの1つが完了するまで待機し、待機状態になるとすぐにイベントをスレッドに渡します。また、常にLIFOの順序でスレッドをウェイクアップするため、キャッシュがまだウォームである可能性があります。
言い換えると、完了ポートは、「イベントのポーリング」であり、「CPUを可能な限り満たす」ソリューションでもあります。
ファイルの読み取りと書き込みは、完了ポート、ソケット、または待機可能なその他のものでスローできます。また、必要に応じて独自のイベントを投稿できます。各カスタムイベントには、少なくとも1つの整数と1つのポインターに相当するデータがあります(デフォルトの構造を使用する場合)が、システムは他の構造も受け入れてくれるため、実際にはそれに制限されません。
また、完了ポートは高速で、本当に高速です。昔々、私はあるスレッドから別のスレッドに通知する必要がありました。たまたま、そのスレッドにはファイルI / Oの完了ポートがすでにありましたが、メッセージは出力されませんでした。ですから、スレッドメッセージを投稿する方が明らかにはるかに効率的であるとしても、簡単にするために弾丸を噛んで完了ポートを使用するべきかどうか疑問に思いました。私は未定だったので、ベンチマークを行いました。驚いたことに、完了ポートは約3倍高速でした。だから...より速く、より柔軟に、決定は難しくありませんでした。
IOCP を使用することで、「クライアントごとに 1 つのスレッド」の問題を解決できます。ソフトウェアが真のマルチプロセッサ マシンで実行されない場合、パフォーマンスが大幅に低下することは一般的に知られています。スレッドは、無制限でも安価でもないシステム リソースです。
IOCP は、いくつかの (I/O ワーカー) スレッドで複数のクライアントの入出力を「公平に」処理する方法を提供します。スレッドは中断され、何かをするまで CPU サイクルを使用しません。
また、この素敵な本でいくつかの情報を読むことができますhttp://www.amazon.com/Windows-System-Programming-Johnson-Hart/dp/0321256190
I/O 完了ポートは、非同期 I/O 操作として O/S によって提供されます。つまり、バックグラウンドで (通常はハードウェアで) 発生します。システムは、I/O の完了を待ってリソース (スレッドなど) を無駄にしません。I/O が完了すると、ハードウェアは O/S に割り込みを送信し、O/S は関連するプロセス/スレッドを起動して結果を処理します。 間違い: IOCP はハードウェアのサポートを必要としません (以下のコメントを参照)
通常、単一のスレッドは、I/O が返されない場合にリソースをほとんど使用せずに、多数の I/O 完了を待機できます。
I/O 完了ポートに基づかない他の非同期モデルは通常、スレッド プールを使用し、I/O が完了するまでスレッドを待機させるため、より多くのシステム リソースが使用されます。
反対に、I/O 完了ポートは通常、ハードウェア サポートを必要とするため、一般的にすべての非同期シナリオに適用できるわけではありません。