Разница между POSIX AIO и libaio в Linux? - PullRequest
50 голосов
/ 07 января 2012

Что мне кажется понять:

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

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

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

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

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

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

1 Ответ

63 голосов
/ 09 января 2012

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

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

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

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

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

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

...