В сети разбросаны страницы, которые описывают возможности POSIX AIO с разной степенью детализации. Ни один из них не совсем недавний. Непонятно, что именно они описывают. Например, на «официальном» (?) Веб-сайте поддержки асинхронного ввода-вывода ядра Linux говорится, что сокеты не работают, но все страницы руководства «aio.h» на моей рабочей станции Ubuntu 8.04.1, похоже, подразумевают, что он работает для произвольных файловых дескрипторов. Затем есть еще один проект, который, похоже, работает на уровне библиотеки с еще меньшим количеством документации.
Я хотел бы знать:
- Какова цель POSIX AIO? Учитывая, что наиболее очевидный пример реализации, которую я могу найти, говорит, что она не поддерживает сокеты, мне все это кажется странным. Это только для асинхронного дискового ввода-вывода? Если да, то почему гипер-общий API? Если нет, то почему дисковый ввод-вывод первым подвергается атаке?
- Где я могу посмотреть примеры полных программ POSIX AIO?
- Кто-нибудь действительно этим пользуется?
- Какие платформы поддерживают POSIX AIO? Какие части они поддерживают? Кто-нибудь действительно поддерживает подразумеваемое
<aio.h>
обещание «Любой ввод-вывод для любого FD» ?
Другие доступные мне механизмы мультиплексирования совершенно хороши, но случайные фрагменты информации, плавающие вокруг, вызвали у меня любопытство.
Эффективное выполнение ввода-вывода сокетов решено с помощью kqueue, epoll, портов завершения ввода-вывода и т.п. Выполнение асинхронного файлового ввода-вывода - это своего рода поздний этап (помимо перекрывающегося ввода-вывода Windows и ранней поддержки posix AIO в Solaris).
Если вы ищете возможность ввода-вывода через сокеты, вам, вероятно, лучше использовать один из вышеперечисленных механизмов.
Таким образом, основная цель AIO - решить проблему асинхронного дискового ввода-вывода. Скорее всего, поэтому Mac OS X поддерживает только AIO для обычных файлов, а не сокетов (поскольку kqueue в любом случае делает это намного лучше).
Операции записи обычно кэшируются ядром и удаляются позже. Например, когда считывающая головка привода проходит мимо места, где должен быть записан блок.
Однако для операций чтения, если вы хотите, чтобы ядро расставляло приоритеты и упорядочивало чтение, AIO - действительно единственный вариант. Вот почему ядро может (теоретически) делать это лучше, чем любое приложение пользовательского уровня:
Тем не менее, posix AIO имеет довольно неудобный интерфейс, например:
Что касается реального приложения, использующего posix AIO, вы можете взглянуть на lighttpd (lighty), который также опубликовал измерение производительности при представлении поддержки.
Большинство платформ posix на данный момент поддерживают posix AIO (Linux, BSD, Solaris, AIX, tru64). Windows поддерживает его через перекрывающийся файловый ввод-вывод. Насколько я понимаю, только Solaris, Windows и Linux действительно поддерживают асинхронность. файловый ввод-вывод вплоть до драйвера, тогда как другие ОС эмулируют асинхронный режим. Ввод-вывод с потоками ядра. Linux является исключением, его реализация posix AIO в glibc эмулирует асинхронные операции с потоками пользовательского уровня, тогда как его собственный интерфейс асинхронного ввода-вывода (io_submit () и т. Д.) Действительно асинхронен на всем пути вплоть до драйвера, если драйвер поддерживает его. .
Я считаю, что среди операционных систем довольно распространено не поддерживать posix AIO для любого fd, а ограничивать его обычными файлами.
источник
Разработчик libtorrent предоставляет отчет об этом: http://blog.libtorrent.org/2012/10/asynchronous-disk-io/
источник
Есть aio_write - реализовано в glibc; Первый вызов функции aio_read или aio_write порождает ряд потоков пользовательского режима, запросы сообщений aio_write или aio_read к этому потоку, поток выполняет pread / pwrite, и когда он завершается, ответ отправляется обратно в заблокированный вызывающий поток.
Это также «настоящий» aio - поддерживается на уровне ядра (для этого требуется libaio, см. Вызов io_submit http://linux.die.net/man/2/io_submit ); также нужен для этого O_DIRECT (также может поддерживаться не всеми файловыми системами, но основные поддерживают его)
глянь сюда:
http://lse.sourceforge.net/io/aio.html
http://linux.die.net/man/2/io_submit
Разница между POSIX AIO и libaio в Linux?
источник
aio_write
описаны выше, в stackoverflow.com/a/5307557/13564