¿Cuál es el mejor epoll/kqueue/select equvalient en Windows?
io notifications (4)
¿Cuál es la mejor facilidad de notificación de eventos de E / S de Windows?
Mejor me refiero a algo que ...
- no tiene un límite en el número de descriptores de archivos de entrada
- funciona en todos los descriptores de archivos (archivos de disco, sockets, ...)
- proporciona varios modos de notificación (borde activado, límite activado)
Todavía no hay uno, por lo que yo sé. Un amigo y yo estamos trabajando en una implementación de código abierto de Windows epoll (enlace a continuación), pero nos encontramos con problemas para averiguar cómo hacer que actúe de la misma manera que la implementación de Linux.
Obstáculos actuales:
- En Linux, los descriptores de archivos y los descriptores de socket son intercambiables, pero en Windows no lo son. Ambos deben ser compatibles con una implementación epoll.
- En Windows, es bastante complicado obtener eventos kernel ... que es como epoll funciona en Linux. Estamos adivinando que un programa que use nuestra biblioteca epoll multiplataforma funcionará notablemente más lento en Windows que Linux.
Intentaré volver y actualizar esta publicación a medida que avanzamos en el proyecto.
La función select () es POSIX y se puede utilizar en Windows, incluido "winsock.h" o "winsock2.h".
libuv
libuv
ofrece E / S con libuv
para Unix y Windows, y tiene soporte para socket, archivos y pipes. Es la capa de la plataforma de Node.js.
Más detalles están en: http://nikhilm.github.io/uvbook/introduction.html
En Windows, las operaciones asincrónicas se realizan por operación de archivo, no por descriptor. Hay varias maneras de esperar en las operaciones de archivos para completar de forma asincrónica.
Por ejemplo, si desea saber cuándo hay datos disponibles en un socket de red, emita una solicitud de lectura asíncrona en el socket y, cuando se complete, los datos estén disponibles y se hayan recuperado.
En Win32, las operaciones asincrónicas usan la estructura OVERLAPPED
para contener el estado de una operación IO pendiente.
- Asocia los archivos con un puerto de finalización de IO y despacha las solicitudes de E / S asíncronas. Cuando se completa una operación, colocará un mensaje de finalización en la cola que sus hilos de trabajo pueden esperar y recuperar a medida que lleguen. También puede colocar mensajes definidos por el usuario en la cola. No hay límite para la cantidad de archivos o mensajes en cola que se pueden usar con un puerto de finalización
- Despachar cada operación IO con un evento. El evento asociado con una operación será señalado (satisfacer una espera) cuando se complete. Use
WaitForMultipleObjects
para esperar en todos los eventos a la vez. Esto tiene la desventaja de que solo es capaz de esperar enMAXIMUM_WAIT_OBJECTS
objetos a la vez (64). También puede esperar en otros tipos de eventos al mismo tiempo (proceso / terminación del hilo, mutexes, eventos, semáforos) - Use un grupo de hilos . El grupo de subprocesos puede tomar un número ilimitado de objetos y operaciones de archivos para esperar y ejecutar una función definida por el usuario al finalizar cada uno.
- Utilice
ReadFileEx
yWriteFileEx
paraWriteFileEx
en cola llamadas de procedimiento asincrónico (APC) al hilo de llamada ySleepEx
(oWaitFor{Single|Multiple}ObjectsEx
) conAlertable TRUE
para recibir un mensaje de notificación para cada operación cuando finaliza. Este método es similar a un puerto de finalización de IO, pero solo funciona para un hilo.
El núcleo de Windows NT no hace distinción entre las operaciones de archivos de socket, archivo de disco, tubería, etc. internamente: todas estas opciones funcionarán con todos los tipos de archivos.