Winsock还提供了“完成端口”。据我了解,完成端口充当句柄(套接字)的复用器。如果一个句柄没有处于I/O操作中,也就是说,如果它的所有I/O操作都已经完成,那么该句柄可以被分解。
那么,接下来我的问题是,Linux是否支持完成端口或套接字的异步I/O?
如果你正在寻找与IOCP完全相同的东西,那么你会失望,因为它并不存在。
Windows使用一种通知完成模型(因此有I / O 完成端口)。您异步启动某些操作,并在该操作完成时接收通知。
Linux应用程序(以及大多数其他类Unix系统)通常使用通知就绪模型。您会接收到一个通知,表明可以从套接字读取或写入而不会阻塞。然后,您执行I / O操作,这将不会阻塞。
使用此模型,您不需要异步I / O。数据立即被复制到/出套接字缓冲区。
这种模型的编程方式有点棘手,这就是为什么有像libevent这样的抽象库。它提供了更简单的编程模型,并抽象出所支持操作系统之间的实现差异。
在Windows中也有通知就绪模型(如select或WSAWaitForMultipleEvents),也许你之前看过它。它无法扩展到大量套接字,因此不适用于高性能网络应用程序。
不要被这种情况吓倒 - Windows和Linux是完全不同的操作系统。在一个系统上不良扩展的东西,在另一个系统上可能效果很好。这种方法在Linux上实际上非常有效,性能可与Windows上的IOCP相媲美。
WSARecv()
会安排I/O操作执行。当操作完成后,GetQueuedCompletionStatus()
将返回。请注意就绪事件和完成事件之间的区别。 - someguy在各种UNIX平台上,IOCP被发音为“异步I/O”:
使用boost::asio。毫无疑问。它具有温和的学习曲线,但它是跨平台的,并且自动使用适用于您正在编译的系统的最佳方法。简单地说,没有理由不这样做。
我知道这并不完全回答了你的问题,但这是我能给出的最好建议。
ASIO
,因为它极度使用命名空间,但我不得不承认,它是最高质量的免费库,完全支持Windows和Linux。另一方面,Libevent
对于Windows的支持效果很差,且不完善。 - unixman83阅读谷歌关于 libevent
的博客文章,您可以使用异步IO在Unix上实现IOCP语义,但不能直接使用IOCP实现异步IO语义。
http://google-opensource.blogspot.com/2010/01/libevent-20x-like-libevent-14x-only.html
如果想要了解使用BSD套接字API的跨平台异步IO示例,请查看最近在LWN.net上发布的ZeroMQ。
LWN文章,
Boost ASIO 在 Linux 上使用 epoll(反应器模式)实现了 Windows 风格的 IOCP(Proactor 设计模式)。请参见 http://think-async.com/Asio/asio-1.5.3/doc/asio/overview/core/async.html。
epoll
是 Linux 最快的服务器编程方法。需要注意的是,Linux 目前在互联网服务器市场上的份额比 Windows 更大。 - unixman83