使用winsock,你可以配置sockets或者单独的I/O操作来“重叠”。这意味着执行I/O的调用会立即返回,而实际的操作会由单独的工作线程异步完成。Winsock还提供了“完成端口”。据我所知,完成端口充当句柄(套接字)的多路复用器。如果句柄不在I/O操作的中间,即如果所有I/O操作都已完成,则可以解复用句柄。那么,关于我的问题... linux是否支持完成端口,甚至是套接字的异步I/O?
cigdeys31#
如果您正在寻找与IOCP完全相似的东西,您不会找到它,因为它不存在。Windows使用完成时通知模型(因此是I/O Completion Ports)。您异步启动某些操作,并在该操作完成时收到通知。Linux应用程序(以及大多数其他Unix类)通常使用就绪通知模型。您会收到一个通知,说明可以在不阻塞的情况下读取或写入套接字。然后,您执行I/O操作,这不会阻塞。使用这种模型,您不需要异步I/O。数据会立即复制到套接字缓冲区或从套接字缓冲区复制出来。这种编程模型有点棘手,这就是为什么有像libevent这样的抽象库的原因。它提供了一个更简单的编程模型,并抽象出了所支持的操作系统之间的实现差异。Windows中也有一个就绪通知模型(select或WSAWaitForMultipleEvents),你可能以前看过。它不能扩展到大量的套接字,所以它不适合高性能网络应用程序。不要让这一点让你失望- Windows和Linux是完全不同的操作系统。在一个系统上不能很好地扩展的东西可能在另一个系统上工作得很好。这种方法实际上在Linux上工作得很好,性能与Windows上的IOCP相当。
gg0vcinb2#
IOCP在各种UNIX平台上读作“异步I/O”:
r6vfmomb3#
使用boost::asio。它有一个温和的学习曲线,但它是跨平台的,并且会自动使用你正在编译的系统的最佳可用方法。没有理由不这样做。我知道这不是对你问题的回答,但这是我能给予的最好的建议。
j2qf4p5b4#
那么,关于我的问题... linux是否支持完成端口,甚至是套接字的异步I/O?关于套接字,在5.3和更高版本的内核中,Linux has something analogous to completion ports in the shape of io_uring(对于文件/块设备,io_uring支持出现在5.1内核中)。
io_uring
v1l68za45#
阅读Google关于libevent的博客文章,您可以使用异步IO在Unix上实现IOCP语义,但无法直接使用IOCP实现异步IO语义,http://google-opensource.blogspot.com/2010/01/libevent-20x-like-libevent-14x-only.html关于使用BSD套接字API的跨平台异步IO示例,请查看最近在www.example.com上发布的ZeroMQLWN.net。http://www.zeromq.org/LWN文章http://lwn.net/Articles/370307/
libevent
zmeyuzjn6#
Boost ASIO在Linux上使用epoll(React器模式)实现了Windows风格的IOCP(Proactor设计模式)。参见http://think-async.com/Asio/asio-1.5.3/doc/asio/overview/core/async.html
jyztefdp7#
可能有点晚了,但这个答案是为了完整性。Linux,截至2020年(v5.11),已经引入了io_uring,它在语义上类似于Windows上的完成端口,但具有非常不同的API。在这种情况下,您可以使用struct io_uring_sqe对read()或write()等操作进行排队,并在完成时通过struct io_uring_cqe获得通知。它还严重依赖于struct iovec,因此建议熟悉该结构和相关的API。有一个名为liburing的小型Linux专用库,可以更容易地访问内核API。
struct io_uring_sqe
read()
write()
struct io_uring_cqe
struct iovec
liburing
7条答案
按热度按时间cigdeys31#
如果您正在寻找与IOCP完全相似的东西,您不会找到它,因为它不存在。
Windows使用完成时通知模型(因此是I/O Completion Ports)。您异步启动某些操作,并在该操作完成时收到通知。
Linux应用程序(以及大多数其他Unix类)通常使用就绪通知模型。您会收到一个通知,说明可以在不阻塞的情况下读取或写入套接字。然后,您执行I/O操作,这不会阻塞。
使用这种模型,您不需要异步I/O。数据会立即复制到套接字缓冲区或从套接字缓冲区复制出来。
这种编程模型有点棘手,这就是为什么有像libevent这样的抽象库的原因。它提供了一个更简单的编程模型,并抽象出了所支持的操作系统之间的实现差异。
Windows中也有一个就绪通知模型(select或WSAWaitForMultipleEvents),你可能以前看过。它不能扩展到大量的套接字,所以它不适合高性能网络应用程序。
不要让这一点让你失望- Windows和Linux是完全不同的操作系统。在一个系统上不能很好地扩展的东西可能在另一个系统上工作得很好。这种方法实际上在Linux上工作得很好,性能与Windows上的IOCP相当。
gg0vcinb2#
IOCP在各种UNIX平台上读作“异步I/O”:
r6vfmomb3#
使用boost::asio。它有一个温和的学习曲线,但它是跨平台的,并且会自动使用你正在编译的系统的最佳可用方法。没有理由不这样做。
我知道这不是对你问题的回答,但这是我能给予的最好的建议。
j2qf4p5b4#
那么,关于我的问题... linux是否支持完成端口,甚至是套接字的异步I/O?
关于套接字,在5.3和更高版本的内核中,Linux has something analogous to completion ports in the shape of
io_uring
(对于文件/块设备,io_uring
支持出现在5.1内核中)。v1l68za45#
阅读Google关于
libevent
的博客文章,您可以使用异步IO在Unix上实现IOCP语义,但无法直接使用IOCP实现异步IO语义,http://google-opensource.blogspot.com/2010/01/libevent-20x-like-libevent-14x-only.html
关于使用BSD套接字API的跨平台异步IO示例,请查看最近在www.example.com上发布的ZeroMQLWN.net。
http://www.zeromq.org/
LWN文章
http://lwn.net/Articles/370307/
zmeyuzjn6#
Boost ASIO在Linux上使用epoll(React器模式)实现了Windows风格的IOCP(Proactor设计模式)。参见http://think-async.com/Asio/asio-1.5.3/doc/asio/overview/core/async.html
jyztefdp7#
可能有点晚了,但这个答案是为了完整性。
Linux,截至2020年(v5.11),已经引入了
io_uring
,它在语义上类似于Windows上的完成端口,但具有非常不同的API。在这种情况下,您可以使用struct io_uring_sqe
对read()
或write()
等操作进行排队,并在完成时通过struct io_uring_cqe
获得通知。它还严重依赖于
struct iovec
,因此建议熟悉该结构和相关的API。有一个名为liburing
的小型Linux专用库,可以更容易地访问内核API。