Mac OS X 的 IO 完成端口
Mac OS X 上是否有等效的 IO COmpletion 端口用于在文件上实现异步 IO...
谢谢...
Is there any equivalent of IO COmpletion ports on Mac OS X for implementing Asynchronous IO on files....
Thank you....
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不幸的是,没有。kqueue 是 OSX 和 FreeBSD 上高性能异步 I/O 的机制。与 Linux epoll 一样,与 IOCP(Solaris、AIX、Windows)相比,它在 i/o 的另一端发出信号。 kqueue 和 epoll 将在可以尝试读取或写入时发出信号,而 IOCP 将在读取或写入完成时回调。许多人发现 epoll 和 kqueue 使用的信号机制与 IOCP 模型相比很难理解。因此,虽然 kqueue 和 IOCP 都是高性能异步 I/O 的机制,但它们不具有可比性。
可以使用 epoll 或 kqueue 和线程池来实现 IOCP。您可以在 Wine 项目中找到一个示例。
更正:
Mac OS X 在 Grand Central Dispatch。 它在内部使用 GCD 线程池和 kqueue API。方便的函数是
dispatch_read
和dispatch_write
。与 IOCP 一样,GCD 中的异步 I/O 函数会在 I/O 任务完成时发出信号,而不是像原始 kqueue API 那样在文件描述符准备就绪时发出信号。请注意,GCD API 不是“fork 安全”的,并且不能在没有
exec
的情况下在 POSIXfork
的两侧使用。如果这样做,函数调用将永远不会返回。另请注意,据说 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,并且性能很可能较低。
Unfortunately, no.kqueue is the mechanism for high-performance asynchronous i/o on OSX and FreeBSD. Like Linux epoll it signals in the opposite end of i/o compared to IOCPs (Solaris, AIX, Windows). kqueue and epoll will signal when it's ok to attempt a read or a write, whereas IOCPs will callback when a read or a write has completed. Many find the signalling mechanism used by epoll and kqueue difficult to understand compared to the IOCP model. So while kqueue and IOCP are both mechanisms for high-performance asynchronous i/o, they are not comparable.
It is possible to implement IOCPs using epoll or kqueue and a thread pool. You can find an example of that in the Wine project.
Correction:
Mac OS X has an implementation of IOCP like functions in Grand Central Dispatch. It uses the GCD thread pool and kqueue APIs internally. Convinience functions are
dispatch_read
anddispatch_write
. Like IOCP the asynchronous I/O functions in GCD signals at the completion of an I/O task, not when the file descriptor is ready like the raw kqueue API.Beware that GCD APIs are not "fork safe", and cannot be used on both sides of a POSIX
fork
without anexec
. If you do, the function call will never return.Also beware that kqueue in Mac OS X is rumored to be less performant than kqueue in FreeBSD, so it might be better for development than production. GCD (libdispatch) is Open Source however, and can be used on other platforms as well.
Update Jan 3, 2015:
FreeBSD has GCD from version 8.1. Wine has epoll-based IOCP for Linux. It is therefore possible to use IOCP design to write server code that should run on Windows, Linux, Solaris, AIX, FreeBSD, MacOSX (and iOS, but not Android). This is different from using kqueue and epoll directly, where a Windows server must be restructured to use its IOCPs, and very likely be less performant.
由于您要求 OS X 具有 Windows 特定功能,因此您可以尝试 libevent,而不是直接使用 kqueue 。它是不同 AIO 机制的薄包装,并且可以在两个平台上工作。
Since you asked for a Windows specific feature for OS X, instead of using kqueue directly you may try libevent. It's a thin wrapper to different AIO mechanisms and it work on both platforms.
使用 Kqueue
http://en.wikipedia.org/wiki/Kqueue
Use Kqueue
http://en.wikipedia.org/wiki/Kqueue