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