なぜ多くの人々がI/O完了ポートが高速でニースモデルだと言うのですか?
I/O完了ポートの長所と短所は何ですか?
IOCPを他のモデルより高速にするいくつかのポイントを知りたいです。
他のモデル(select、epoll、従来のマルチスレッド/プロセス)を比較して説明できるなら、より良いでしょう。
I/O完了ポートは素晴らしいです。それらを説明するより良いWordはありません。 Windowsで何かが正しく行われていれば、それは完了ポートです。
いくつかのスレッドを作成して(実際にはいくつでもかまいません)、イベント(手動で投稿するスレッド、または タイマー または 非同期I/Oなど)が到着します。次に、完了ポートは、指定した制限まで、イベントを処理するために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/032125619