开发者

IO COmpletion Ports for Mac OS X

开发者 https://www.devze.com 2023-03-11 05:26 出处:网络
Is there any equivalent of IO COmpletion ports on Mac OS X for implementing As开发者_StackOverflowynchronous IO on files....

Is there any equivalent of IO COmpletion ports on Mac OS X for implementing As开发者_StackOverflowynchronous IO on files....

Thank you....


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 and dispatch_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 an exec. 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.


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.


Use Kqueue

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

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号