tagger tag mp3tag mac kid3 editar easytag linux sockets asynchronous posix iocp

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?



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:

¿Realmente no hay E / S de bloques asíncronos en Linux?





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.