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