0

ソケット コンテキストごとに 64kb のバッファを格納する IOCP アプリケーションがあります。何千ものソケットを処理しながら、大量の RAM を使用します。これの代わりに、iocp-thread コンテキストごとに 64kb のバッファを持つモデルに切り替えたいと思います (epoll と kqueue でできるように)。このためには、提供された WSABUF にバイトをコピーすることなく通知を受信できる完了ポートが必要であり、通知の後、WSAEWOULDBLOCK を受信するまで非同期 WSARecvFrom (重複した構造を提供せずに、テストに udp を使用しています) を呼び出すだけです。構造が重複している WSARecvFrom 呼び出しに空の WSABUF (buf = NULL, len =0) を指定すると、次の手法を実現できることを読みました。しかし、うまくいきません: バッファーが小さすぎるため、IOCP が「起動」しません。

そのようなシナリオを可能にする他の方法はありますか?

4

1 に答える 1

2

これは TCP では問題なく動作し、以前のバージョンの Windows では大きな問題でしたが、現在はあまり問題にならないように思われる "ロックされたページ" の制限を回避する良い方法です。あなたの状況ではうまくいくはずです。

ここからダウンロードできるIOCPサンプルコードのセットがあり、これは「ゼロバイト読み取り」とその後の非同期読み取りをサポートしています(つまり、ゼロバイトバッファーでの読み取りが完了すると、バッファーでのオーバーラップ読み取りのみが発行されます)、私の最新のコードは、ゼロ バイト読み取り完了後の同期読み取りと非同期読み取りの両方をサポートします。

TCP を扱っている場合、「テスト用に」UDP を使用していると述べた場合、接続ごとに単一のオーバーラップ読み取りを発行するだけで「単一バッファ」を実現できることに注意してください。その読み取りが完了すると、同じバッファーを使用して新しいオーバーラップ読み取りを発行する前に、それを処理できます...

「ゼロバイト読み取り」は、一度にロックされるページの数を最小限に抑えるため、接続が頻繁にデータを送信しない数千の同時接続を処理する必要がある場合にも役立ちます。これを使用してメモリ使用量を削減するには、「ゼロ バイトの読み取り」が完了したら、接続にバッファを割り当てるだけで済みます。

于 2012-05-17T14:58:45.837 に答える