Асинхронный ввод / вывод Linux - PullRequest
1 голос
/ 17 марта 2012

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

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

Ситуация:

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

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

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

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

С уважением, Эндрю

1 Ответ

2 голосов
/ 17 марта 2012

Вы хотите избежать AIO в Linux для чего-то реального, по крайней мере, на данный момент, начиная с aio(7):

Текущая реализация Linux POSIX AIO предоставляется в пользовательском пространстве glibc. Это имеет ряд ограничений, прежде всего то, что поддержание нескольких потоков для выполнения операций ввода-вывода является дорогостоящим и плохо масштабируется. В течение некоторого времени ведется работа по реализации асинхронного ввода-вывода на основе конечного автомата ядра (см. io_submit(2), io_setup(2), io_cancel(2), io_destroy(2), io_getevents(2)), но эта реализация пока не имеет Это еще не дошло до того, что реализация POSIX AIO может быть полностью реализована с помощью системных вызовов ядра.

Вместо этого посмотрите на неблокирующий ввод / вывод с помощью select(2) / poll(2) / epoll(7).

...