Linux和I / O完成端口?

时间:2010-05-08 15:01:07

标签: linux sockets asynchronous posix iocp

使用winsock,您可以将套接字或单独的I / O操作配置为“重叠”。这意味着立即返回执行I / O的调用,而实际操作由不同的工作线程异步完成。

Winsock还提供“完成端口”。据我所知,完成端口充当句柄(套接字)的多路复用器。如果句柄不在I / O操作的中间,即如果其所有I / O操作都完成,则可以解复用句柄。

那么,关于我的问题...... linux是否支持完成端口甚至是套接字的异步I / O?

7 个答案:

答案 0 :(得分:78)

如果你正在寻找与IOCP完全相同的东西,你将找不到它,因为它不存在。

Windows在完成模型上使用通知(因此I / O 完成端口)。您以异步方式启动某些操作,并在该操作完成后收到通知。

Linux应用程序(以及大多数其他类Unix)通常在就绪模型上使用通知。您会收到一条通知,告知可以无阻塞地读取或写入套接字。然后,执行I / O操作,该操作不会阻止。

使用此模型,您不需要需要异步I / O.数据立即被复制到套接字缓冲区中。

这种编程模型有点棘手,这就是为什么有像libevent这样的抽象库。它提供了一种更简单的编程模型,并抽象出支持的操作系统之间的实现差异。

Windows中的就绪模型也有一个通知(select或WSAWaitForMultipleEvents),您可能已经查看过了。它无法扩展到大量套接字,因此不适合高性能网络应用。

不要让它让你失望 - Windows和Linux是完全不同的操作系统。在一个系统上不能很好地扩展的东西可能在另一个系统上工作得很好。这种方法在Linux上实际上运行良好,其性能可与Windows上的IOCP相媲美。

答案 1 :(得分:20)

IOCP在各种UNIX平台上发音为“异步I / O”:

答案 2 :(得分:8)

使用boost :: asio。把手放下。它具有温和的学习曲线,但它是跨平台的,并且会自动使用您正在编译的系统的最佳可用方法。根本没有理由不这样做。

我知道这不是你问题的答案,但这是我能给出的最佳建议。

答案 3 :(得分:4)

那么,关于我的问题... linux是否支持完成端口甚至套接字的异步I / O?

关于套接字,在5.3及更高版本的内核中,Linux has something analogous to completion ports in the shape of io_uring(对于文件/块设备io_uring的支持出现在5.1内核中)。

答案 4 :(得分:1)

libevent上阅读Google的博客文章,您可以使用异步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,

http://www.zeromq.org/

LWN文章,

http://lwn.net/Articles/370307/

答案 5 :(得分:1)

每次使用“blk_complete_request”API时,Linux内核都会提供“I / O块完成”概念。另一个例子:

http://lxr.free-electrons.com/source/kernel/sched/completion.c

如下所述:

http://www.ibm.com/developerworks/library/l-async/

linux确实有同步和异步I / O块完成API。

以上都是内核级别的。在用户空间级别有“io_submit()”API:

http://www.fsl.cs.sunysb.edu/~vass/linux-aio.txt

详细介绍了完整的io _ *()API。

部分相似的问题:

Is there really no asynchronous block I/O on Linux?

答案 6 :(得分:0)

Boost ASIO使用epoll(Reactor模式)在Linux上实现Windows风格的IOCP(Proactor设计模式)。见http://think-async.com/Asio/asio-1.5.3/doc/asio/overview/core/async.html