【问题标题】:What is the best epoll/kqueue/select equvalient on Windows?Windows 上最好的 epoll/kqueue/select 等效项是什么?
【发布时间】:2010-09-09 04:28:46
【问题描述】:

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

最好的意思是……

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

【问题讨论】:

    标签: windows io notifications epoll


    【解决方案1】:

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

    目前的障碍:

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

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

    http://sourceforge.net/projects/cpoll

    【讨论】:

    • 来自 cpoll 的项目页面:“截至 2009 年 11 月 12 日 0:00:00 GMT,该项目不再处于积极开发中。”
    • 真可惜,我真希望这在 Windows 上是可能的 :-(
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • MAXIMUM_WAIT_OBJECTS 在 XP 及更高版本上也是 64。
    • 我推荐第四个选项(APCs):它对连接数没有限制,你不需要填充任何奇怪的数组,比如 select 等。只需使用 WriteFileEx/ReadFileEx 安排您的异步 IO 并使用 SleepEx/WaitFor{Single|Multiple}ObjectsEx 将线程设置为可警报状态。
    • 你可以参考这段代码sn-p和那里提到的文章gist.github.com/abdul-sami/23e1321c550dc94a9558
    【解决方案3】:

    select() 函数是 POSIX 并且可用于 Windows,包括“winsock.h”或“winsock2.h”。

    【讨论】:

    • 但不适用于文件,因此它不符合标准 2。
    【解决方案4】:

    libuv

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

    更多详情在:http://nikhilm.github.io/uvbook/introduction.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-27
      • 1970-01-01
      • 2011-12-02
      • 2011-02-10
      • 2023-03-03
      • 2013-06-27
      相关资源
      最近更新 更多