Linux和I/O完成端口?

som*_*guy 37 sockets linux posix asynchronous iocp

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

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

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

Bla*_*ura 80

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

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

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

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

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

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

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

  • 只要您写入的数据多于缓冲区可容纳的数据,任何同步I/O都将被阻塞.如果您正在编写的数据已被分页,则您的进程将阻止页面错误. (3认同)
  • @Vladislav Vaintroub:`WSARecv()`安排要执行的I/O操作.当操作*完成*时,`GetQueuedCompletionStatus()`将返回.查看准备事件和完成事件之间的差异. (3认同)

D.S*_*ley 19

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

  • "异步I/O"是错误的,并且*大多数*Unices支持不足!谨防 (4认同)
  • 它确实看起来像POSIX AIO已经被忽视了.您可能希望阅读_"快速UNIX服务器"_(http://dank.qemfd.net/dankwiki/index.php/Fast_UNIX_Servers)上的一些参考资料.那里似乎有很多好消息. (3认同)

Ken*_*ith 9

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

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

  • +1我讨厌`ASIO`,因为它极其使用名称空间,但我不得不同意它是最高质量的免费库,它完全支持Windows和Linux.另一方面,`Libevent`对Windows的劣质,未完成的支持. (6认同)

Ano*_*non 7

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

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