Разница между POSIX AIO и libaio в Linux?

Что я, кажется, понимаю:

POSIX AIO API прототипируются в <aio.h> и вы связываете свою программу с помощью librt(-lrt), а libaio API в <libaio.h> и ваша программа связана с libaio (-laio).

Что я не могу понять:

1. По-разному ли обрабатывает ядро ​​любой из этих методов?

2. Является ли O_DIRECT флаг обязательный для использования любого из них?

Как уже упоминалось в этом посте, libaio прекрасно работает без O_DIRECT когда используешь libaioХорошо, понял, но:

Согласно книге R.Love по системному программированию в Linux, Linux поддерживает aio (я предполагаю, что это POSIX AIO) для обычных файлов, только если открыт с помощью O_DIRECT.Но небольшая программа, которую я написал (используя aio.h, связанный с -lrt), которая вызывает aio_write на файл, открытый без O_DIRECT флаг работает без проблем.

1 ответ

Решение

В linux две реализации AIO принципиально отличаются.

POSIX AIO - это реализация на уровне пользователя, которая выполняет нормальный блокирующий ввод / вывод в нескольких потоках, что создает иллюзию асинхронного ввода / вывода. Основная причина сделать это заключается в том, что:

  1. работает с любой файловой системой
  2. он работает (по существу) в любой операционной системе (имейте в виду, что библиотека GNU GNU переносима)
  3. он работает с файлами с включенной буферизацией (т. е. не установлен флаг O_DIRECT)

Основным недостатком является то, что глубина вашей очереди (то есть количество ожидающих операций, которые вы можете иметь на практике) ограничена количеством потоков, которые вы выбираете, что также означает, что медленная операция на одном диске может заблокировать операцию, переходящую к другой диск. Это также влияет на то, какие операции ввода-вывода (или сколько) видят ядро ​​и планировщик диска.

AIO ядра (т.е. io_submit() et.al.) - это поддержка ядром асинхронных операций ввода-вывода, когда запросы io фактически ставятся в очередь в ядре, отсортированные по планировщику диска, предположительно некоторые из них пересылаются (в некотором оптимальном порядке (можно было бы надеяться) на фактический диск как на асинхронные операции (с использованием TCQ или NCQ). Основным ограничением этого подхода является то, что не все файловые системы работают так или иначе с асинхронным вводом-выводом (и могут вернуться к блокирующей семантике), файлы должны открываться с помощью O_DIRECT, что сопровождается целым рядом других ограничений на Запросы ввода / вывода. Если вам не удается открыть файлы с помощью O_DIRECT, он все равно может "работать", так как вы получаете правильные данные обратно, но, вероятно, это делается не асинхронно, а возвращается к блокировке семантики.

Также имейте в виду, что io_submit () может блокировать диск при определенных обстоятельствах.

Другие вопросы по тегам