質問

多くの短いメッセージを含む高スループットの状況のた​​めに、.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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top