AIO como tal todavía es un tanto limitado y un verdadero dolor para comenzar, pero funciona en su mayor parte, una vez que lo has buscado.
Tiene algunos en mi opinión errores serios, pero esas son realmente características. Por ejemplo, al enviar una cierta cantidad de comandos o datos, se bloqueará el envío de subprocesos. No recuerdo la justificación exacta de esta característica, pero la respuesta que obtuve en ese momento fue algo así como "sí, por supuesto, el núcleo tiene un límite en el tamaño de la cola, eso es lo que se esperaba". Lo cual es aceptable si envía unas miles de solicitudes ... obviamente, tiene que haber un límite en alguna parte. También podría tener sentido desde el punto de vista de DoS (de lo contrario, un programa malicioso podría obligar al kernel a quedarse sin memoria publicando mil millones de solicitudes). Pero aún así, es algo que puedes enfrentar de manera realista con números "normales" (un centenar o más) y te sorprenderá inesperadamente, lo cual no es bueno.Además, si solo envía media docena de solicitudes y son un poco más grandes (algunos megabytes de datos), puede suceder lo mismo, aparentemente porque el kernel las divide en subpeticiones. Lo cual, una vez más, tiene algún sentido, pero al ver cómo los documentos no lo dicen, uno debe esperar que no haga ninguna diferencia (aparte de tomar más tiempo) si lee 500 bytes o 50 megabytes de datos.
Además, parece que no hay forma de hacer AIO con búfer, al menos en cualquiera de mis sistemas Debian y Ubuntu (aunque he visto a otras personas quejarse de todo lo contrario, es decir, grabaciones sin búfer de hecho pasando por los buffers) Según lo que puedo ver en mis sistemas, AIO solo está realmente asíncrono con el almacenamiento en búfer desactivado, lo cual es una pena (es por eso que actualmente estoy usando una construcción fea alrededor de la asignación de memoria y una hebra de trabajo).
Un problema importante con cualquier elemento asíncrono es poder hacer epoll_wait() en él, lo cual es importante si está haciendo algo más aparte del disco IO (como recibir tráfico de red). Por supuesto, hay io_getevents, pero no es tan deseable/útil, ya que solo funciona para una cosa singular.
En kernels recientes, hay soporte para eventfd. A primera vista, parece inútil, ya que no es obvio cómo puede ser útil de ninguna manera. Sin embargo, para su rescate, existe la función no documentada io_set_eventfd que le permite asociar AIO con un eventfd, que es epoll_wait() - able. Tienes que buscar en los encabezados para descubrirlo, pero ciertamente está ahí, y funciona muy bien.
Mm, tal vez deberías poner tu traje de llama y preguntar por LKML. – ninjalj
ver http://blog.libtorrent.org/2012/10/asynchronous-disk-io/ –