tag - ¿Puertos de terminación de I/O y Linux?
tag editor linux (7)
Usando winsock, puede configurar sockets o operaciones de E / S separadas para "solapar". Esto significa que las llamadas para realizar E / S se devuelven inmediatamente, mientras que las operaciones reales se completan de manera asincrónica por hilos de trabajo separados.
Winsock también proporciona "puertos de finalización". Por lo que entiendo, un puerto de finalización actúa como un multiplexor de identificadores (sockets). Un manipulador se puede demultiplexar si no está en el medio de una operación de E / S, es decir, si se completan todas sus operaciones de E / S.
Entonces, en mi pregunta ... ¿Linux admite puertos de terminación o incluso E / S asíncronas para sockets?
Boost ASIO implementa el estilo de Windows IOCP (patrón de diseño de Proactor) en Linux utilizando epoll (patrón Reactor). Ver http://think-async.com/Asio/asio-1.5.3/doc/asio/overview/core/async.html
El núcleo de Linux proporciona el concepto de "finalización de bloques de E / S" cada vez que utiliza la API "blk_complete_request", por ejemplo. Otro ejemplo:
http://lxr.free-electrons.com/source/kernel/sched/completion.c
Y como se explica aquí:
http://www.ibm.com/developerworks/library/l-async/
Linux tiene API de finalización de bloques de E / S síncrona y asíncrona.
Todo lo anterior está en el nivel kernel. En el nivel de espacio de usuario, está la API "io_submit ()":
http://www.fsl.cs.sunysb.edu/~vass/linux-aio.txt
que detalla el conjunto completo de io _ * () API.
Pregunta parcialmente similar:
IOCP se pronuncia "E / S asíncrona" en varias plataformas UNIX:
- POSIX AIO es el estándar
- Kernel AIO y epoll parecen ser implementaciones específicas de Linux
- Kqueue es la implementación de * BSD y Mac OSX
- Message Passing Interface (MPI) es una opción para informática de alto rendimiento
- referencia Boost obligatoria - Boost.Asio
Lea la entrada del blog de Google en libevent
, puede implementar la semántica de IOCP en Unix utilizando IO asíncrono, pero no puede implementar directamente la semántica IO asíncrona utilizando IOCP,
http://google-opensource.blogspot.com/2010/01/libevent-20x-like-libevent-14x-only.html
Para un ejemplo IO asincrónico de plataforma cruzada con una API de socket BSD, mire ZeroMQ como se publicó recientemente en LWN.net,
Artículo LWN,
No entiendo completamente lo que quiere decir con "puertos de finalización". Todo lo que puedo decir es que puede usar enchufes en modo no bloqueante, lo que significa que las llamadas regresan inmediatamente.
Esta referencia es bastante antigua, pero es completa en el sentido de que cubre select()
etc .: http://rhoden.id.au/doc/sockets2.html
Y aquí está el manual de GNU en los sockets: http://www.gnu.org/software/libc/manual/html_node/Sockets.html
Si está buscando algo exactamente como IOCP, no lo encontrará, porque no existe.
Windows usa un modelo de notificación de finalización (por lo tanto, puertos de finalización de E / S). Comienza alguna operación asincrónicamente y recibe una notificación cuando se completa esa operación.
Las aplicaciones Linux (y la mayoría de Unix-similares) generalmente usan una notificación en el modelo listo. Recibe una notificación de que el socket se puede leer o escribir sin bloquear. Luego, usted hace la operación de E / S, que no se bloqueará.
Con este modelo, no necesita E / S asincrónica. Los datos se copian inmediatamente dentro / fuera del búfer del zócalo.
El modelo de programación para esto es un poco complicado, por lo que hay bibliotecas de abstracción como libevent. Proporciona un modelo de programación más simple y abstrae las diferencias de implementación entre los sistemas operativos admitidos.
También hay una notificación en el modelo listo en Windows (seleccione o WSAWaitForMultipleEvents), que puede haber visto antes. No se puede escalar a un gran número de sockets, por lo que no es adecuado para aplicaciones de red de alto rendimiento.
No dejes que eso te desanime: Windows y Linux son sistemas operativos completamente diferentes. Algo que no se escala bien en un sistema puede funcionar muy bien en el otro. Este enfoque realmente funciona muy bien en Linux, con un rendimiento comparable al de IOCP en Windows.
Utilice boost :: asio. Manos abajo. Tiene una curva de aprendizaje leve, pero es multiplataforma y utiliza automáticamente el mejor método disponible para el sistema en el que se está compilando. Simplemente no hay razón para no hacerlo.
Sé que esta no es una buena respuesta a su pregunta, pero es el mejor consejo que puedo dar.