Linux和I / O完成端口?

使用winsock,你可以configuration套接字或单独的I / O操作来“重叠”。 这意味着执行I / O的调用会立即返回,而实际的操作是由不同的工作线程asynchronous完成的。

Winsock还提供“完成端口”。 据我所知,一个完成端口作为手柄(sockets)的多路复用器。 如果一个句柄不在I / O操作的中间,也就是说,如果它的所有I / O操作都完成了 ,它就可以被解复用。

所以,在我的问题… Linux支持完成端口,甚至asynchronousI / O套接字?

Solutions Collecting From Web of "Linux和I / O完成端口?"

如果你正在寻找类似IOCP的东西,你不会找到它,因为它不存在。

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

Linux应用程序(和大多数其他Unix相似)通常使用就绪模式的通知。 您会收到一个通知,表示可以无阻塞地读取或写入套接字。 然后,你做I / O操作,不会阻塞。

有了这个模型,你不需要异步I / O。 数据立即被复制到/从套接字缓冲区中。

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

在Windows中还有就绪模型的通知(select或WSAWaitForMultipleEvents),您可能已经看过。 它不能扩展到大量的插座,所以不适合高性能的网络应用。

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

IOCP在不同的UNIX平台上发音为“异步I / O”:

  • POSIX AIO是标准的
  • 内核AIO和epoll似乎是Linux特定的实现
  • Kqueue是* BSD和Mac OSX的实现
  • 消息传递接口(MPI)是高性能计算的一个选项
  • 强制性Boost引用 – Boost.Asio

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

我知道这不是你的问题的答案,但这是我可以给的最好的建议。

libevent上阅读Google的博客条目,可以使用异步IO在Unix上实现IOCP语义,但不能直接使用IOCP来实现异步IO语义,

http://google-opensource.blogspot.com/2010/01/libevent-20x-like-libevent-14x-only.html

举个例子,跨平台异步IO和BSD套接字API在最近发布在LWN.net上的ZeroMQ上,

http://www.zeromq.org/

LWN文章,

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

Linux内核确实提供了“I / O块完成”的概念,每次你使用“blk_complete_request”API。 另一个例子:

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。

部分类似的问题:

Linux上真的没有异步块I / O吗?

我不完全明白你的意思是“完成港口”。 我只能说,你可以在非阻塞模式下使用套接字,这意味着调用立即返回。

这个引用是相当陈旧的,但是它涵盖了select()等全面的内容: http : //rhoden.id.au/doc/sockets2.html

这里是关于套接字的GNU手册: http : //www.gnu.org/software/libc/manual/html_node/Sockets.html

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