AIO как таковой все еще несколько ограничен, и начинать с него очень сложно, но он работает, по большей части, после того, как вы его откопали.
У него есть некоторые, на мой взгляд, серьезныеошибки, но это действительно функции.Например, при отправке определенного количества команд или данных ваш поток будет заблокирован.Я не помню точного обоснования этой функции, но ответ, который я получил тогда, был что-то вроде: «Да, конечно, ядро имеет ограничение на размер очереди, то есть, как задумано».Что приемлемо, если вы подаете несколько тысяч запросов ... очевидно, где-то должен быть предел.Это также может иметь смысл с точки зрения DoS (в противном случае вредоносная программа может заставить ядро исчерпать память, отправив миллиард запросов).Но, тем не менее, это то, что вы можете реально встретить с «нормальными» числами (около сотни), и оно неожиданно вас поразит, что не годится.Плюс, если вы отправляете только полдюжины или около того запросов, и они немного больше (несколько мегабайт данных), то может произойти то же самое, по-видимому, потому что ядро разбивает их в подзапросах.Что, опять-таки, имеет смысл, но, видя, что документы не говорят вам, следует ожидать, что не имеет значения (кроме того, что требуется больше времени), независимо от того, читаете ли вы 500 байтов или 50 мегабайт данных.
Кроме того, кажется, что нет никакого способа сделать буферизованный AIO, по крайней мере, на любой из моих систем Debian и Ubuntu (хотя я видел, как другие люди жалуются на прямо противоположное, то есть на самом деле небуферизованные записи проходят через буферы).Из того, что я вижу в своих системах, AIO действительно асинхронен только с отключенной буферизацией, и это позор (поэтому я вместо этого использую некрасивую конструкцию вокруг отображения памяти и рабочего потока).
Важной проблемой любого асинхронного является возможность epoll_wait () на нем, что важно, если вы делаете что-то еще, кроме дискового ввода-вывода (например, получение сетевого трафика).Конечно, есть io_getevents, но это не так желательно / полезно, так как он работает только для одной единственной вещи.
В последних версиях ядра есть поддержка eventfd .На первый взгляд, это кажется бесполезным, так как не очевидно, как это может быть полезно в любом случае.Тем не менее, для вашего спасения есть недокументированная функция io_set_eventfd , которая позволяет вам связать AIO с eventfd, который способен epoll_wait ().Чтобы узнать об этом, вам нужно пролистать заголовки, но он, безусловно, есть, и он прекрасно работает.