Windows上最佳的epoll / kqueue / select等效项是什么?
时间:2020-03-05 18:54:34 来源:igfitidea点击:
Windows最好的I / O事件通知功能是什么?
最好的意思是...
- 输入文件描述符的数量没有限制
- 适用于所有文件描述符(磁盘文件,套接字等)
- 提供各种通知模式(边缘触发,限制触发)
解决方案
回答
据我所知,还没有人。我和一个朋友正在研究开放源代码Windows epoll的实现(下面的链接),但是我们在解决如何使其与Linux实现相同方面遇到问题。
目前的障碍:
- 在Linux中,文件描述符和套接字描述符可以互换,但在Windows中则不能互换。两者都必须与epoll实现兼容。
- 在Windows中,获取内核事件非常棘手……这就是epoll在Linux中的工作方式。我们猜测使用跨平台epoll库的程序在Windows中的运行速度明显慢于Linux。
随着项目的进展,我将尝试返回并更新本文。
http://sourceforge.net/projects/cpoll
回答
在Windows中,异步操作是通过文件操作而不是描述符来完成的。有几种方法可以等待文件操作异步完成。
例如,如果我们想知道何时网络套接字上的数据可用,请在套接字上发出异步读取请求,并在完成时表明数据可用并被检索。
在Win32中,异步操作使用" OVERLAPPED"结构来包含有关未完成的IO操作的状态。
- 将文件与IO完成端口相关联,并分派异步IO请求。操作完成后,它将在工作线程可以等待的队列上放入一条完成消息,并在它们到达时进行检索。我们也可以将用户定义的消息放入队列。对于完成端口可以使用多少个文件或者排队的消息没有限制
- 向每个IO操作分配一个事件。与操作相关的事件在完成时将发出信号(满足等待)。使用
WaitForMultipleObjects
一次等待所有事件。这样做的缺点是只能一次等待MAXIMUM_WAIT_OBJECTS对象(64)。我们还可以同时等待其他类型的事件(进程/线程终止,互斥体,事件,信号量) - 使用线程池。线程池可以使用无限数量的对象和文件操作来等待并在完成时执行用户定义的函数。
使用" ReadFileEx"和" WriteFileEx"将对调用线程的异步过程调用(APC)和" SleepEx"(或者" WaitFor {Single | Multiple} ObjectsEx")与" Alertable TRUE"排队,以在每次操作时收到通知消息它完成了。此方法类似于IO完成端口,但仅适用于一个线程。
Windows NT内核在内部没有对套接字,磁盘文件,管道等文件操作进行区分:所有这些选项将与所有文件类型一起使用。