42

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

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

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

4

6 回答 6

86

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

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

Linux 应用程序(和大多数其他类 Unix 应用程序)通常使用准备就绪模型的通知。您会收到一个通知,表明可以在不阻塞的情况下读取或写入套接字。然后,您执行 I/O 操作,这不会阻塞。

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

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

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

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

于 2010-05-12T17:02:16.947 回答
23

IOCP 在各种 UNIX 平台上读作“异步 I/O”:

于 2010-05-08T15:23:31.633 回答
10

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

我知道这不能完全回答您的问题,但这是我能给出的最佳建议。

于 2011-08-19T17:40:50.747 回答
7

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

关于套接字,在 5.3 和更高版本的内核中,Linux 具有类似于完成端口的形式io_uring(对于文件/块设备io_uring的支持出现在 5.1 内核中)。

于 2020-04-28T05:12:26.773 回答
0

阅读 Google 上的博文libevent,可以在 Unix 上使用异步 IO 实现 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/

于 2010-05-10T04:30:22.043 回答
0

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

于 2012-08-22T19:32:56.730 回答