2

IOCP が使用される理由を理解しようとしています。次の 2 つの理由が考えられます。

  • ブロックしないためWSARecv()、クライアントごとに新しいスレッドを作成することなく、数千のクライアントを処理できます (また、作成できるスレッドの数には制限があるため、処理できるクライアントの数は制限されます)。 .
  • ブロックしないためWSASend()、大きなファイルを送信する場合、送信するために新しいスレッドを作成する必要はありません (新しいスレッドを作成しなかった場合、UI スレッドはもちろんブロックされます)。

IOCP を使用する他の理由は何ですか?

4

2 に答える 2

2

IOCPにはあなたが言及した利点がありますが、それはIOCPに限定されません。私はネイティブ ソケット API にはあまり詳しくありませんが、一部の Win32 API には、非同期でありながら IOCP を必要としない「オーバーラップ IO」があります。

もう 1 つの利点は、IOCP を使用すると、要求を処理するスレッドの数がカーネルによって (一種の) 最適化されることです。カーネルは、リクエスト サービング スレッドが行うすべてのブロッキングを認識しており、CPU が十分に活用されるように、常に十分な数のスレッドがブロック解除されていることを確認します。理想的には、決してブロックせず、コアと同じ数のスレッドが存在することです (100% の負荷を想定)。それは非常に効率的です。

IOCP は、別のスレッドに切り替えて IO の結果を処理する代わりに、既にビジー状態の既存のスレッドを単にGetQueuedCompletionStatus再度呼び出すだけであるため、コンテキストの切り替えを減らすのにも役立ちます。

GetQueuedCompletionStatusEx1 回の呼び出しで複数の IO をデキューできるため、カーネルへの遷移の数を減らすために使用できます。

于 2015-05-28T09:35:58.923 に答える
1

また、回避可能なバルク データ コピーとプロテクション リング サイクルを削減します。recv() 呼び出しによって要求されたときに、カーネルがネットワーク スタック バッファーからユーザー空間バッファーにデータをコピーする代わりに、ユーザー空間バッファーは WSARecv() によって提供され、スタックはそれらをカーネル空間に直接ロードできます。

于 2015-05-28T09:38:29.803 に答える