Асинхронный ввод-вывод Linux

Требуется асинхронная обработка ввода-вывода

Планируйте использование асинхронного ввода-вывода через вызовы aio * в Linux

Ситуация:

Я открыл сокет с флагами AF_INET и SOCK_STREAM (TCP). Имею лимит верхнего водяного знака для буферов отправки. Хотите выполнять запись в этот сокет асинхронно, а при переполнении буфера отправки хотите отключить сокет.

Итак, у меня есть вопросы:

  1. Когда я сделал асинхронный вызов aio_write на TCP-сокете, когда наступит завершение ввода-вывода - когда буфер записан в буфер сокета или будет подтверждена доставка? Как я могу управлять этим поведением?

  2. Как лучше всего справиться с этим с помощью методов lio_listio

С уважением, Андрей


person westtrd    schedule 17.03.2012    source источник
comment
из интереса вы смотрели на boost asio?   -  person 111111    schedule 17.03.2012
comment
Не уверен насчет Linux. В Windows MSDN: «Успешное завершение WSASend не означает, что данные были успешно доставлены». TBH, меня это удивило - если данные не были доставлены успешно, возможно, их придется отправить повторно. Если ядро, драйвер и т. Д. Возвращают буферы, которые не были подтверждены, тогда они должны хранить копии данных, поэтому теряется преимущество «без копирования», заключающееся в постановке пользовательских буферов в очередь: ((   -  person Martin James    schedule 17.03.2012
comment
@MartinJames: это не гарантирует успешного завершения с использованием возвращаемого значения функции WSASend(). Дождитесь соответствующего уведомления (обратного вызова, уведомления о завершении ввода-вывода и т. Д.), Чтобы получить фактический результат передачи. Это не означает, что вы не можете использовать отсутствие копирования, вам просто нужно дождаться завершения передачи, прежде чем повторно использовать этот конкретный буфер.   -  person André Caron    schedule 17.03.2012
comment
@ AndréCaron - Хорошо, значит, уведомление о завершении WSASend (по крайней мере, с TCP) указывает на успешную доставку?   -  person Martin James    schedule 19.03.2012
comment
@MartinJames: указывает, что, насколько известно операционной системе, содержимое было отправлено по запросу. Уведомление о завершении в основном сообщает вам то же самое, что и результаты вызова синхронной функции send(). Я не очень хорошо осведомлен о низкоуровневом подтверждении TCP и о том, когда именно ОС сообщает вам, что она отправила данные, поэтому я не уверен, означает ли этот результат, что данные были успешно доставлены (например, подтвержденный прием от партнера).   -  person André Caron    schedule 19.03.2012
comment
@ AndréCaron - Хорошо, в любом случае спасибо. Это двое из нас, кто не знает :(   -  person Martin James    schedule 19.03.2012


Ответы (1)


Вы хотите избежать AIO в Linux для чего-либо реального, по крайней мере, на данный момент. From _ 1_:

The current Linux POSIX AIO implementation is provided in userspace by glibc. This has a number of limitations, most notably that maintaining multiple threads to perform I/O operations is expensive and scales poorly. Work has been in progress for some time on a kernel state-machine-based implementation of asynchronous I/O (see io_submit(2), io_setup(2), io_cancel(2), io_destroy(2), io_getevents(2)), but this implementation hasn't yet matured to the point where the POSIX AIO implementation can be completely reimplemented using the kernel system calls.

Вместо этого изучите неблокирующий ввод-вывод с помощью select(2) < / a> / poll(2) / _ 9_.

person Nikolai Fetissov    schedule 17.03.2012
comment
Или вы можете использовать фреймворк более высокого уровня, такой как boost::asio, который будет использовать любую лучшую реализацию для вашей системы. - person André Caron; 17.03.2012
comment
Что насчет lio_listio? заранее спасибо - person westtrd; 17.03.2012
comment
Андре, это предполагается, но на этот раз мне нужно изолировать работу с очень многими одновременными сетевыми сокетами - person westtrd; 17.03.2012
comment
Это требует обновления, поскольку для небуферизованных файлов успешно используется linux-aio. Также проверьте очень недавний io_uring, который, кажется, решает дилемму Linux с помощью асинхронного программирования и может использоваться с любым типом файла (сокеты, буферизация и т. Д.) - person MrIo; 17.11.2020