0

我有 IOCP 应用程序,它为每个套接字上下文存储一个 64kb 缓冲区。它使用大量 RAM,同时处理数千个套接字。相反,我想切换到每个 iocp 线程上下文有一个 64kb 缓冲区的模型(就像我可以在 epoll 和 kqueue 中那样)。为此,我需要我的完成端口能够接收通知,而无需将字节复制到提供的 WSABUF,并且在通知之后只需调用异步 WSARecvFrom(不提供重叠结构,我使用 udp 进行测试),直到我收到 WSAEWOULDBLOCK。我已经读过,如果我为具有重叠结构的 WSARecvFrom 调用提供空的 WSABUF (buf = NULL, len =0),则可以实现以下技术。但它不起作用:IOCP 永远不会“唤醒”,因为缓冲区太小。

还有其他方法可以使这种情况成为可能吗?

4

1 回答 1

2

这适用于 TCP,它是避免“锁定页面”限制的好方法,这在早期版本的 windows 中是一个大问题,但现在似乎不再是一个问题。它应该适合您的情况。

我有一组 IOCP 示例代码,可以从这里下载,它支持“零字节读取”和随后的异步读取(也就是说,一旦使用零字节缓冲区的读取完成,它只会发出与缓冲区重叠的读取),我的最新代码在零字节读取完成后支持同步和异步读取。

请注意,如果您正在处理 TCP,您提到您正在使用 UDP“进行测试”,那么您可以通过每个连接仅发出一个重叠读取来实现“单一缓冲区”。一旦读取完成,您就可以在使用相同的缓冲区发出新的重叠读取之前处理它......

如果您需要处理数千个并发连接,其中连接不经常发送数据,“零字节读取”仍然很有用,因为它将一次锁定的页面数量减少到最少。使用它来减少内存使用将要求您仅在“零字节读取”完成后为连接分配一个缓冲区。

于 2012-05-17T14:58:45.837 回答