我正在尝试使用 .NET 中的 Stream.BeginWrite Async I/O API 来处理具有许多短消息的高吞吐量情况。因此,分散/收集 API 将极大地减少上下文切换(和 CPU 使用)的数量。这个 API 是否完全使用 LPBUFFERS Win32 API?是否有用于 Scatter/Gather I/O 的替代 API?
4 回答
查看 .net 来源,接受的答案似乎是错误的。
SocketAsyncEventArgs
有一个BufferList
属性。当使用它时Buffer
,操作可以使用分散/聚集 DMA,而不是只能保存单个连续内存块的属性,就像内部Socket.SendAsync(SocketAsyncEventArgs)
使用的那样,WSASend
允许指定多个发送缓冲区,使其适用于 scatter/gather 类型的 I/O
并Socket.SendAsync(SocketAsyncEventArgs)
使用WSARecv
,即
允许指定多个接收缓冲区,使其适用于 scatter/gather 类型的 I/O
我手边没有 .net 3.5 源,但BufferList
自 .net 3.5 起就存在,因此自 .net 3.5 起可能已支持分散/聚集。WSASend 和 WSARecv 的最低操作系统要求记录为 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(不管是什么......)