Hay páginas esparcidas por la web que describen las instalaciones POSIX AIO con distintos detalles. Ninguno de ellos es terriblemente reciente. No está claro qué es exactamente lo que están describiendo. Por ejemplo, el sitio web "oficial" (?) Para el soporte de E / S asíncronas del kernel de Linux aquí dice que los sockets no funcionan, pero las páginas del manual "aio.h" en mi estación de trabajo Ubuntu 8.04.1 parecen implicar que funciona para descriptores de archivos arbitrarios. Luego hay otro proyecto que parece funcionar en la capa de la biblioteca con incluso menos documentación.
Me gustaría saber:
- ¿Cuál es el propósito de POSIX AIO? Dado que el ejemplo más obvio de una implementación que puedo encontrar dice que no admite sockets, todo me parece extraño. ¿Es solo para E / S de disco asíncrono? Si es así, ¿por qué la API hipergeneral? Si no es así, ¿por qué la E / S de disco es lo primero que fue atacado?
- ¿Dónde hay ejemplos de programas POSIX AIO completos que pueda ver?
- ¿Alguien realmente lo usa, de verdad?
- ¿Qué plataformas son compatibles con POSIX AIO? ¿Qué partes apoyan? ¿Alguien realmente apoya el implícito "Cualquier E / S a cualquier FD" que
<aio.h>
parece prometer?
Los otros mecanismos de multiplexación disponibles para mí son perfectamente buenos, pero los fragmentos aleatorios de información que flotan por ahí me han dado curiosidad.
Hacer E / S de socket de manera eficiente se ha resuelto con kqueue, epoll, puertos de finalización de E / S y similares. Hacer E / S de archivos asincrónicas es una especie de llegada tardía (aparte de las E / S superpuestas de Windows y el soporte temprano de Solaris para posix AIO).
Si está buscando hacer E / S de socket, probablemente sea mejor que use uno de los mecanismos anteriores.
El objetivo principal de AIO es, por tanto, resolver el problema de la E / S de disco asíncrona. Es muy probable que esta sea la razón por la que Mac OS X solo admite AIO para archivos normales y no sockets (ya que kqueue lo hace mucho mejor de todos modos).
Las operaciones de escritura generalmente se almacenan en caché por el kernel y se eliminan en un momento posterior. Por ejemplo, cuando el cabezal de lectura de la unidad pasa por la ubicación donde se va a escribir el bloque.
Sin embargo, para las operaciones de lectura, si desea que el kernel priorice y ordene sus lecturas, AIO es realmente la única opción. He aquí por qué el kernal puede (teóricamente) hacerlo mejor que cualquier aplicación de nivel de usuario:
Dicho esto, posix AIO tiene una interfaz bastante incómoda, por ejemplo:
En cuanto a la aplicación del mundo real que usa posix AIO, puede echar un vistazo a lighttpd (lighty), que también publicó una medición de rendimiento al presentar el soporte.
La mayoría de las plataformas posix soportan posix AIO por ahora (Linux, BSD, Solaris, AIX, tru64). Windows lo admite a través de su E / S de archivos superpuestos. Tengo entendido que solo Solaris, Windows y Linux realmente admiten async. E / S de archivos hasta el controlador, mientras que los otros sistemas operativos emulan el archivo async. E / S con subprocesos del kernel. Linux es la excepción, su implementación posix AIO en glibc emula operaciones asíncronas con subprocesos de nivel de usuario, mientras que su interfaz nativa de E / S asíncrona (io_submit (), etc.) es verdaderamente asíncrona hasta el controlador, asumiendo que el controlador lo admite. .
Creo que es bastante común entre los sistemas operativos no admitir posix AIO para ningún fd, pero restringirlo a archivos normales.
fuente
Un desarrollador de libtorrent proporciona un informe sobre esto: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/
fuente
Hay aio_write - implementado en glibc; La primera llamada de la función aio_read o aio_write genera una cantidad de subprocesos en modo de usuario, solicitudes de publicación de aio_write o aio_read a ese subproceso, el subproceso hace pread / pwrite y cuando termina, la respuesta se vuelve a publicar en el subproceso de llamada bloqueado.
También es aio 'real', compatible con el nivel del kernel (necesita libaio para eso, consulte la llamada io_submit http://linux.die.net/man/2/io_submit ); también necesita O_DIRECT para eso (también puede que no sea compatible con todos los sistemas de archivos, pero los principales sí lo admiten)
mira aquí:
http://lse.sourceforge.net/io/aio.html
http://linux.die.net/man/2/io_submit
¿Diferencia entre POSIX AIO y libaio en Linux?
fuente
aio_write
se cubren anteriormente, en stackoverflow.com/a/5307557/13564