适用于Mac OS X的IO完成端口

时间:2011-06-09 04:11:59

标签: asynchronous io-completion-ports

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

谢谢....

3 个答案:

答案 0 :(得分: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的POSIX exec的两侧使用。如果这样做,函数调用将永远不会返回。

另外要注意,传言Mac OS X中的kqueue在FreeBSD中的性能低于kqueue,所以开发可能比生产更好。然而,GCD(libdispatch)是Open Source,也可以在其他平台上使用。

2015年1月3日更新

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)