什么是Windows上最好的epoll / kqueue / select equvalient?

什么是Windows最好的I / O事件通知工具?

我最好的意思是…

  1. 对input文件描述符的数量没有限制
  2. 适用于所有文件描述符(磁盘文件,套接字…)
  3. 提供各种通知模式(边沿触发,限制触发)

在Windows中,异步操作由文件操作完成,而不是由描述符完成。 有几种方法可以等待文件操作异步完成。

例如,如果您想知道网络套接字上的数据何时可用,请在套接字上发出异步读取请求,并在完成时提供数据并进行检索。

在Win32中,异步操作使用OVERLAPPED结构来包含有关未完成的IO操作的状态。

  1. 将这些文件与一个IO完成端口相关联,并分派异步IO请求。 当一个操作完成时,它会在工作线程可以等待的队列上放置一个完成消息,并在到达时进行检索。 您也可以将用户定义的消息放入队列中。 完成端口可以使用多少文件或排队消息没有限制
  2. 用事件分派每个IO操作。 与操作相关的事件将在完成时变成信号(满足等待)。 使用WaitForMultipleObjects一次等待所有事件。 这具有仅能够一次等待MAXIMUM_WAIT_OBJECTS对象的缺点(64)。 您也可以同时等待其他类型的事件(进程/线程终止,互斥,事件,信号量)
  3. 使用线程池 。 线程池可以采取无限数量的对象和文件操作来等待,并在每个完成时执行用户定义的功能 。
  4. 使用ReadFileExWriteFileEx将异步过程调用 (APC)排队到调用线程和SleepEx (或WaitFor{Single|Multiple}ObjectsEx ),并且WaitFor{Single|Multiple}ObjectsExAlertable TRUE以在每个操作完成时接收通知消息。 此方法与IO完成端口类似,但仅适用于一个线程。

Windows NT内核在内部对套接字,磁盘文件,管道等文件操作没有任何区别:所有这些选项都适用于所有文件类型。

libuv

libuv为Unix和Windows提供了均衡的I / O,并且支持套接字,文件和管道。 它是Node.js的平台层。

更多细节在: http : //nikhilm.github.io/uvbook/introduction.html

据我所知,还没有一个。 我和一个朋友正在开发一个开源的Windows epoll实现(下面的链接),但是我们遇到了一些问题,弄清楚如何使它像Linux实现一样行事。

目前的障碍:

  • 在Linux中,文件描述符和套接字描述符是可以互换的,但是在Windows中它们不是。 两者都必须与epoll实现兼容。
  • 在Windows中,获取内核事件是非常棘手的……这是在Linux中epoll如何工作的。 我们猜测使用我们的跨平台epoll库的程序在Windows中的运行速度要明显慢于Linux。

我会尝试回来,并更新这个职位,因为我们在项目上取得进展。

http://sourceforge.net/projects/cpoll

select()函数是POSIX,可用于包括“winsock.h”或“winsock2.h”的窗口。