web-development-kb-es.site

¿Cuál es el mejor equivalente epoll / kqueue / select en Windows?

¿Cuál es el mejor servicio de notificación de eventos de E/S de Windows?

Por mejor quiero decir algo que ...

  1. no tiene un límite en la cantidad de descriptores de archivos de entrada
  2. funciona en todos los descriptores de archivos (archivos de disco, sockets, ...)
  3. proporciona varios modos de notificación (activado por borde, activado por límite)
35
blackwing

En Windows, las operaciones asincrónicas se realizan por operación de archivo, no por descriptor. Hay varias formas de esperar a que las operaciones de archivo se completen 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 estaban disponibles y se recuperaron.

En Win32, las operaciones asíncronas usan la estructura OVERLAPPED para contener el estado de una operación pendiente IO).

  1. Asociar los archivos con un IO Completion Port y despachar asíncrono IO solicitudes. Cuando se completa una operación, colocará un mensaje de finalización en la cola que sus subprocesos de trabajo ) puede esperar y recuperarse a medida que llegan. También puede poner 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
  2. Envíe cada operación IO con un evento. El evento asociado con una operación se señalizará (satisfacer una espera) cuando se complete. Use WaitForMultipleObjects para espere todos los eventos a la vez. Esto tiene la desventaja de que solo puede esperar los objetos MAXIMUM_WAIT_OBJECTS a la vez (64). También puede esperar otros tipos de eventos al mismo tiempo (terminación del proceso/subproceso , mutexes, eventos, semáforos)
  3. Utilice un grupo de subprocesos . El grupo de subprocesos puede tomar un número ilimitado de objetos y operaciones de archivo para esperar y ejecutar un función definida por el usuario al finalizar cada uno.
  4. Utilice ReadFileEx y WriteFileEx para poner en cola Llamadas de procedimiento asincrónicas (APC) al hilo de llamada y SleepEx (o WaitFor{Single|Multiple}ObjectsEx) con Alertable TRUE para recibir un mensaje de notificación para cada operación cuando se complete. Este método es similar a un puerto de finalización IO, pero solo funciona para un subproceso.

El kernel de Windows NT no distingue internamente entre las operaciones de socket, archivo de disco, tubería, etc. internamente: todas estas opciones funcionarán con todos los tipos de archivo.

40
Chris Smith

libuv

libuv ofrece E/S evented para Unix y Windows y tiene soporte para socket, archivos y tuberías. Es la capa de plataforma de Node.js.

Más detalles en: http://nikhilm.github.io/uvbook/introduction.html

4
schlamar

Todavía no hay uno, que yo sepa. 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 descubrir cómo hacer que funcione igual que la implementación de Linux.

Obstáculos actuales:

  • En Linux, los descriptores de archivo y los descriptores de socket son intercambiables, pero en Windows no lo son. Ambos deben ser compatibles con una implementación de epoll.
  • En Windows es bastante complicado obtener eventos del kernel ... así es como funciona epoll en Linux. Suponemos que un programa que utiliza nuestra biblioteca epoll multiplataforma se ejecutará notablemente más lento en Windows que Linux.

Intentaré volver y actualizar esta publicación a medida que avanzamos con el proyecto.

http://sourceforge.net/projects/cpoll

1
Heron

la función select () es POSIX y se puede usar en ventanas que incluyen "winsock.h" o "winsock2.h".

0
Nouil