多くの短いメッセージを含む高スループットの状況で、.NET で Stream.BeginWrite Async I/O API を使用しようとしています。そのため、スキャッター/ギャザー API は、コンテキスト スイッチ (および CPU 使用率) の数を大幅に削減します。この API は LPBUFFERS Win32 API を使用しますか? Scatter/Gather I/O の代替 API はありますか?
4 に答える
.net ソースを見ると、受け入れられた答えは間違っているようです。
SocketAsyncEventArgs
属性を持っていBufferList
ます。これを使用すると、メモリの 1 つの連続したブロックのみを保持できる属性の代わりに、内部で使用Buffer
されるスキャッター/ギャザー DMA を操作で使用できます。Socket.SendAsync(SocketAsyncEventArgs)
WSASend
複数の送信バッファを指定できるため、スキャッター/ギャザー タイプの I/O に適用できます。
をSocket.SendAsync(SocketAsyncEventArgs)
使用しWSARecv
、
複数の受信バッファを指定できるため、スキャッター/ギャザー タイプの I/O に適用できます。
手元に .net 3.5 のソースはありませんが、.net 3.5BufferList
から存在するため、スキャッター/ギャザーは .net 3.5 からサポートされている可能性があります。WSASend および WSARecv の最小 OS 要件は、Windows Vista / Server 2003 として文書化されています。
注意:使用しているストリームはわかりませんがNetworkStream.BeginWrite
、単一のバッファを WSASend に送信するため、それをスキャッタ/ギャザリングに使用することはできません。
BCLからスキャッター/ギャザーAPIにアクセスできれば驚きますが(l33t w1n32 haxx0rz用です)、常にP / Invokeがあります(これは驚くほど使いやすいですが、私は見つけました)。
フレームワークの根幹を掘り下げたい場合は、いくつかの方法があります。
1) リフレクター
2) MS は最近、デバッグ目的でソースを公開しました。Debugging/Options/General でオプションを有効にすると、VS2008 でステップ インできます。
3) Koders.com もフレームワーク ソースをホストしているようです。
http://www.koders.com/csharp/fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109
.NET でソケット スキャッター/ギャザー I/O を実行する方法はありません。MSFT のブログ投稿によると、.NET 4.5 に同様の API がある可能性があります (それが何であれ...)。