Diferencia entre POSIX AIO y libaio en Linux?


Lo que yo parece entender:

POSIX AIO Las API están prototipadas en <aio.h> y usted vincula su programa con librt(-lrt), mientras que las API libaio en <libaio.h> y su programa están vinculadas con libaio (-laio).

Lo que no puedo entender:

1.¿El kernel maneja cualquiera de estos métodos de manera diferente?

2.Is la bandera O_DIRECT obligatorio para el uso de cualquiera de ellos?

Como se menciona en este post , libaio funciona bien sin O_DIRECT cuando usando libaio.Bien, entendido pero:

De acuerdo con el libro de R. Love Linux System Programming, Linux soporta aio (que asumo es POSIX AIO) en archivos regulares solo si se abre con O_DIRECT.Pero un pequeño programa que escribí (usando aio.h, enlazado con -lrt) que llama a aio_write en un archivo abierto sin la bandera O_DIRECT funciona sin problemas.

Author: Community, 2012-01-07

1 answers

En Linux, las dos implementaciones de AIO son fundamentalmente diferentes.

POSIX AIO es una implementación a nivel de usuario que realiza E/S de bloqueo normal en múltiples subprocesos, dando la ilusión de que las E/S son asincrónicas. La razón principal para hacer esto es que:

  1. funciona con cualquier sistema de archivos
  2. funciona (esencialmente) en cualquier sistema operativo (tenga en cuenta que el libc de gnu es portable)
  3. funciona en archivos con búfer habilitado (es decir, sin bandera O_DIRECT set)

El principal inconveniente es que la profundidad de la cola (es decir, el número de operaciones pendientes que puede tener en la práctica) está limitada por el número de hilos que elija tener, lo que también significa que una operación lenta en un disco puede bloquear una operación que vaya a un disco diferente. También afecta qué E / S (o cuántas) ve el núcleo y el programador de discos también.

El núcleo AIO (i. e. io_submit() et.al.) es soporte del kernel para operaciones de E/S asíncronas, donde las solicitudes de io están en cola en el núcleo, ordenadas por cualquier programador de disco que tenga, presumiblemente algunas de ellas se reenvían (en un orden algo óptimo que uno esperaría) al disco real como operaciones asíncronas (usando TCQ o NCQ). La principal restricción con este enfoque es que no todos los sistemas de archivos funcionan tan bien o en absoluto con E / S asíncrona (y puede recurrir a la semántica de bloqueo), los archivos tienen que abrirse con O_DIRECT que viene con un montón de otras restricciones en la E / S peticiones. Si no puede abrir sus archivos con O_DIRECT, todavía puede "funcionar", ya que obtiene los datos correctos de nuevo, pero probablemente no se hace de forma asíncrona, sino que vuelve a bloquear la semántica.

También tenga en cuenta que io_submit() puede bloquear en el disco bajo ciertas circunstancias.

 56
Author: Arvid,
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-01-08 23:21:27