一般に、ブロッキングと非ブロッキングの Winsock TCP ソケットで速度やパフォーマンスに違いはありますか? 両方のソケットの違いはわかりましたが、2 つのタイプの詳細なパフォーマンス比較はありません。
2 に答える
スピードじゃないから。操作write
と操作は、変装したread
単なるメモリ コピーです。それらが行うのは、それぞれカーネルとの間でデータをコピーすることだけです。つまり、実際には何も送受信しません。
ブロッキングとノンブロッキングの機能は、これらの操作が完了するまでブロックするか、EAGAIN
すぐに実行できない場合に備えて-1 を返すかを尋ねます。たとえば、ソケットから読み取りますが、受信バッファーには何もありません。recv
何かが来るまでぶらぶらするのが好きですか、それとも -1 を返すのが好きEAGAIN
ですか?
私の経験では、非ブロッキングの winsock 操作は少し遅くなりますが、はるかにスケーラブルです。実際には、ノンブロッキング I/O (IOCP を使用) を実行する場合は 2 つのシステム コールとアプリケーション レベルでのディスパッチが必要であり、ブロッキング I/O を使用する場合は 1 つのシステム コールが必要です。多くの同時接続がある場合、適切に実装されていればよりスケーラブルなアーキテクチャのため、ノンブロッキング I/O ははるかに高速です。
最大帯域幅でポイント間でデータを転送する必要がある場合は、ブロッキング I/O を使用します。多数の同時クライアント接続を処理する必要がある場合は、ノンブロッキング I/O を使用してください。それらのどれにもあまり期待しないでください。
一般に、これは「イベント駆動型とスレッド型」のサーバー アーキテクチャに関するものであり、次に「ブロッキングと非ブロッキング」に関するものです。どのような状況でも使用できるユニバーサル サーバー アーキテクチャはありません。用途によります。