42

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

最好的意思是……

  1. 对输入文件描述符的数量没有限制
  2. 适用于所有文件描述符(磁盘文件,套接字,...)
  3. 提供多种通知方式(边沿触发、限位触发)
4

4 回答 4

45

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

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

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

  1. 将文件与IO 完成端口关联并分派异步 IO 请求。当一个操作完成时,它会将完成消息放在队列中,您的工作线程可以等待并在它们到达时检索。您还可以将用户定义的消息放入队列中。完成端口可以使用多少个文​​件或排队的消息没有限制
  2. 使用事件调度每个 IO 操作。与操作关联的事件将在完成时发出信号(满足等待)。用于WaitForMultipleObjects一次等待所有事件。这样做的缺点是只能MAXIMUM_WAIT_OBJECTS一次等待对象 (64)。您还可以同时等待其他类型的事件(进程/线程终止、互斥体、事件、信号量)
  3. 使用线程池。线程池可以接受无限数量的对象和文件操作来等待并在每个完成时执行用户定义的函数。
  4. 使用ReadFileEx和将异步过程调用WriteFileEx(APC)排队到调用线程和(或)用于在每个操作完成时接收通知消息。该方法类似于 IO 完成端口,但仅适用于一个线程。 SleepExWaitFor{Single|Multiple}ObjectsExAlertable TRUE

Windows NT 内核在内部不区分套接字、磁盘文件、管道等文件操作:所有这些选项都适用于所有文件类型。

于 2008-09-15T22:23:39.067 回答
5

库夫

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

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

于 2013-04-16T10:26:42.527 回答
2

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

目前的障碍:

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

随着项目的进展,我会尝试回来更新这篇文章。

http://sourceforge.net/projects/cpoll

于 2008-09-15T22:13:33.227 回答
0

select() 函数是 POSIX 并且可在包括“winsock.h”或“winsock2.h”在内的 Windows 上使用。

于 2012-08-02T10:30:40.527 回答