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


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

Por mejor me refiero a algo que ...

  1. no tiene un límite en el número de descriptores de archivo de entrada
  2. funciona en todos los descriptores de archivos (archivos de disco, sockets,...)
  3. proporciona varios modos de notificación (edge triggered, limit triggered)
Author: kennytm, 2008-09-16

4 answers

En Windows, las operaciones asincrónicas se realizan por operación de archivo, no por descriptor. Hay varias maneras de esperar a que las operaciones de archivos se completen de forma asíncrona.

Por ejemplo, si desea saber cuándo están disponibles los datos 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 asincrónicas usan OVERLAPPED estructura para contener el estado de una IO sobresaliente operación.

  1. Asocie los archivos con un Puerto de finalización de IO y envíe solicitudes de IO asincrónicas. Cuando una operación se completa, pondrá un mensaje de finalización en la cola que sus hilos de trabajo pueden esperar y recuperar a medida que llegan. También puede poner mensajes definidos por el usuario en la cola. No hay límite para cuántos archivos o mensajes en cola se pueden usar con un puerto de finalización
  2. Envíe cada operación de E / S con un evento. El evento asociado con un la operación será señalada (satisfacer una espera) cuando se complete. Uso WaitForMultipleObjects para esperar todos los eventos a la vez. Esto tiene la desventaja de solo poder esperar en los objetos MAXIMUM_WAIT_OBJECTS a la vez (64). También puede esperar en otros tipos de eventos al mismo tiempo (terminación de procesos/subprocesos, 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 archivos para esperar y ejecutar un definido por el usuario function upon completion each.
  4. Use ReadFileEx y WriteFileEx para poner en cola las llamadas a procedimientos asíncronos (APCs) 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 de IO, pero solo funciona para un subproceso.

El kernel de Windows NT no hace distinción entre socket, archivo de disco, pipe, etc. operaciones de archivo internamente: todas estas las opciones funcionarán con todos los tipos de archivos.

 37
Author: Chris Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-19 21:01:56

Libuv

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

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

 3
Author: schlamar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-16 10:26:42

Todavía no hay uno, que yo sepa. Un amigo y yo estamos trabajando en una implementación de epoll de Windows de código abierto (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 archivo y los descriptores de sockets son intercambiables, pero en Windows no lo son. Ambos deben ser compatibles con una implementación epoll.
  • En Windows es bastante complicado obtener kernel evento... que es como funciona epoll en Linux. Estamos suponiendo que un programa que utiliza nuestra biblioteca epoll multiplataforma se ejecutará notablemente más lento en Windows que en Linux.

Intentaré volver y actualizar este post a medida que avanzamos con el proyecto.

Http://sourceforge.net/projects/cpoll

 0
Author: Heron,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-15 22:13:33

La función Select() es POSIX y se puede usar en windows incluyendo "winsock.h " o " winsock2.h".

 0
Author: Nouil,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-02 10:30:40