2012-03-17 2 views
1

нужен обработка асинхронной I/Oасинхронный ввод/вывод Linux

План использование асинхронного ввод/вывода через ОАП * вызовы на Linux

Ситуация:

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

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

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

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

С уважением, Andrew

+0

из интереса вы посмотрели на форсирование asio? – 111111

+0

Не уверен в Linux. В Windows MSDN: «Успешное завершение WSASend не означает, что данные были успешно доставлены». TBH, я был удивлен тем, что - если данные не были успешно доставлены, возможно, это должно быть возмущено. Если ядро, драйвер и т. Д. Возвращают буферы, которые не были выделены, то они должны хранить копии данных, поэтому теряют преимущество «без копирования» в очереди на загрузку пользовательских буферов: (( –

+0

@MartinJames: t гарантировать успешное завершение * с использованием возвращаемого значения функции 'WSASend()'. Подождите, пока соответствующее уведомление (обратный вызов, уведомление о завершении ввода-вывода и т. д.) не получит фактический результат передачи. Это не означает, что вы можете Не используйте no-copy, вам просто нужно дождаться завершения передачи до повторного использования этого конкретного буфера. –

ответ

2

Вы хотите избежать 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 реализация может быть полностью переопределена с использованием системных вызовов ядра.

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

+0

Или вы можете использовать инфраструктуру более высокого уровня, такую ​​как 'boost :: asio', которая будет использовать любую лучшую реализацию для вашей системы. –

+0

Что такое lio_listio? Заранее спасибо – westtrd

+0

Андре, предполагается, но на этот раз мне нужно и нужно изолировать работу с очень многими одновременными сетевыми сокетами – westtrd

Смежные вопросы