4

Mac OS X 上是否有任何等效的 IO 完成端口用于在文件上实现异步 IO....

谢谢....

4

3 回答 3

6

很不幸的是,不行。

kqueue 是 OSX 和 FreeBSD 上高性能异步 i/o 的机制。与 Linux epoll 一样,与 IOCP(Solaris、AIX、Windows)相比,它在 i/o 的另一端发出信号。kqueue 和 epoll 将在可以尝试读取或写入时发出信号,而 IOCP 将在读取或写入完成时回调。与 IOCP 模型相比,许多人发现 epoll 和 kqueue 使用的信号机制难以理解。因此,虽然 kqueue 和 IOCP 都是高性能异步 i/o 的机制,但它们没有可比性。

可以使用 epoll 或 kqueue 和线程池来实现 IOCP。你可以在 Wine 项目中找到一个例子。

更正:

Mac OS X 在Grand Central Dispatch中实现了类似 IOCP 的功能。它在内部使用 GCD 线程池和 kqueue API。便利函数是dispatch_readdispatch_write。与 IOCP 一样,GCD 中的异步 I/O 函数在 I/O 任务完成时发出信号,而不是像原始 kqueue API 那样在文件描述符准备好时发出信号。

请注意,GCD API 不是“分叉安全的”,并且不能在fork没有exec. 如果这样做,函数调用将永远不会返回。

另请注意,Mac OS X 中的 kqueue 传闻不如 FreeBSD 中的 kqueue 性能,因此它可能更适合开发而不是生产。然而, GCD (libdispatch) 是开源的,也可以在其他平台上使用。

2015 年 1 月 3 日更新

FreeBSD 具有 8.1 版的 GCD。Wine 具有用于 Linux 的基于 epoll 的 IOCP。因此,可以使用 IOCP 设计来编写应该在 Windows、Linux、Solaris、AIX、FreeBSD、MacOSX(和 iOS,但不是 Android)上运行的服务器代码。这与直接使用 kqueue 和 epoll 不同,后者必须重组 Windows 服务器以使用其 IOCP,并且很可能性能较低。

于 2014-02-16T21:32:24.073 回答
2

由于您要求为 OS X 提供 Windows 特定功能,而不是直接使用 kqueue,您可以尝试libevent。它是不同 AIO 机制的精简包装器,可在两个平台上运行。

于 2011-06-09T04:36:26.553 回答
1

使用 Kqueue

http://en.wikipedia.org/wiki/Kqueue

于 2011-06-09T04:20:59.977 回答