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