В этом руководстве дается общий обзор асинхронного ввода-вывода и рассказывается о том, как его поддерживает ядро.Далее мы поговорим о posix AIO (который является стандартизированным API для доступа к асинхронному вводу-выводу), подразумевая, что использование posix AIO API в linux предоставит вам доступ к поддержке ядра для AIO.Это не так.
В Linux действительно есть две отдельные реализации AIO:
- ядро AIO, которое использует io_submit () и др.), Которое поддерживается только в ядре 2.6(или на самом деле 2.5, и могут быть версии с обратным портированием на 2.4.
- posix AIO, который является функцией glibc, по существу не связанной с ядром. Он реализует API posix с точки зрения создания потоков пользовательского уровняблокировка вызовов дискового ввода-вывода.
Итак, короче говоря, если у вас уже есть универсальная реализация нескольких потоков для дискового ввода-вывода, вам может быть лучше использовать это, чем использовать реализацию glibc (потому что вы могли бы иметь немного больший контроль над ним).
Если вы на самом деле намерены использовать семейство функций io_submit (), вам, возможно, придется проделать довольно большую работу, чтобы обойти ограничения этих функций.
ядро AIO требует, чтобы ваши файлы открывались с помощью O_DIRECT. Что, в свою очередь, требует всех ваших смещений, размеров чтения и записибыть выровненным по блокам на диске.Обычно это нормально, если вы используете только один большой файл и можете заставить его работать очень похоже на кеш страниц в ОС.Для чтения и записи произвольных файлов с произвольными смещениями и длинами это становится грязным.
Если вы в конечном итоге дадите ядру AIO шанс, я настоятельно рекомендую привязать один или несколько событийных файлов к вашим iocbs, чтобы вы моглидождитесь завершения, используя epoll / select, а не блокируя его в io_getevents ().