2011-06-09 78 views

回答

2

既然你问的不是使用的kqueue为OS X在Windows特定功能,直接您可以尝试libevent。它是不同AIO机制的薄包装,它可以在两种平台上工作。

+0

谢谢..我会尝试使用它.... – anonymos 2011-06-09 04:55:46

+0

libevent使用Windows select()函数。这个功能基本上是一个玩具。它只适用于套接字,通常不适用于文件描述符,并且不能使用多于64个套接字。当只提供64个客户端时,您可以使用线程并阻止I/O。 – 2014-03-26 14:23:07

1
+0

谢谢..示例代码示例如何使用它获取异步IO完成通知.... – anonymos 2011-06-09 04:25:59

+0

当文件描述符准备就绪时,类似于poll和select(以及Linux上的epoll),kqueue信号。 IOCP在电源I/O操作完成时发出信号。因此信号位于I/O的另一端。 在MacOSX中,FreeBSD和iOS相当于Windows IOCP,是GCD中的I/O功能。但是他们在引擎盖下使用了kqueue和全局线程池。 – 2015-01-03 16:15:16

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_read和。与IOCP类似,I/O任务完成时GCD信号中的异步I/O函数,而不是像原始kqueue API那样准备好文件描述符时。

请注意,GCD API不是“叉式安全”的,并且不能在POSIX fork的两侧使用,且不能使用exec。如果你这样做,函数调用将永远不会返回。

另外要注意的是,在FreeBSD上,Mac OS X中的kqueue比kqueue性能低,所以它可能比开发更适合开发。然而,GCD(libdispatch)是Open Source,并且可以在其他平台上使用。

更新2015年1月3日

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