使用winsock,您可以将套接字或单独的I/O 操作配置为“重叠”。这意味着执行 I/O 的调用会立即返回,而实际操作则由单独的工作线程异步完成。
Winsock 还提供“完成端口”。据我了解,完成端口充当句柄(套接字)的多路复用器。如果句柄不在 I/O 操作中间,即如果它的所有 I/O 操作都在进行,则它可以被多路分离。完全的.
那么,关于我的问题...Linux 是否支持完成端口甚至套接字的异步 I/O?
如果您正在寻找与 IOCP 完全相同的东西,您将找不到它,因为它不存在。
Windows 使用完成通知模型(因此 I/O完成端口)。您异步启动某些操作,并在该操作完成时收到通知。
Linux 应用程序(以及大多数其他 Unix 类似应用程序)通常使用就绪通知模型。您会收到一条通知,表明可以在不阻塞的情况下读取或写入套接字。然后,您进行 I/O 操作,这不会阻塞。
使用此模型,您无需need异步 I/O。数据立即被复制到套接字缓冲区中/从套接字缓冲区中复制出来。
这种编程模型有点棘手,这就是为什么有像 libevent 这样的抽象库。它提供了更简单的编程模型,并抽象了支持的操作系统之间的实现差异。
Windows 中还有一个关于就绪模型的通知(select 或 WSAWaitForMultipleEvents),您之前可能已经看过。它无法扩展到大量套接字,因此不适合高性能网络应用程序。
不要因此而失望 - Windows 和 Linux 是完全不同的操作系统。在一个系统上无法很好扩展的东西可能在另一个系统上工作得很好。这种方法实际上在 Linux 上效果很好,性能与 Windows 上的 IOCP 相当。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)