Порты завершения ввода-вывода и Linux?

используя winsock, вы можете настроить сокеты или отдельные операции ввода-вывода для "перекрытия". Это означает, что вызовы для выполнения ввода-вывода возвращаются немедленно, в то время как фактические операции выполняются асинхронно отдельными рабочими потоками.

Winsock также предоставляет "порты завершения". Из того, что я понимаю, порт завершения действует как мультиплексор дескрипторов (сокетов). Дескриптор может быть демультиплексирован, если он не находится в середине операции ввода-вывода, т. е. если все его операции ввода-вывода завершено.

Итак, к моему вопросу... поддерживает ли linux порты завершения или даже асинхронный ввод-вывод для сокетов?

7 ответов


Если вы ищете что-то точно как IOCP, вы не найдете его, потому что он не существует.

Windows использует модель уведомления о завершении (следовательно, I / O завершение порты). Вы запускаете некоторую операцию асинхронно и получаете уведомление, когда эта операция завершена.

Приложения Linux (и большинство других Unix-alikes) обычно используют уведомление о готовой модели. Вы получаете уведомление о том, что сокет можно прочитать или записать в без блокировки. Затем вы выполняете операцию ввода-вывода, которая не будет блокировать.

с этой моделью, вы не нужно асинхронного ввода/вывода данных будет автоматически скопирован в / из буфера сокета.

модель программирования для этого довольно сложная, поэтому существуют библиотеки абстракций, такие как libevent. Он обеспечивает более простую модель программирования и абстрагирует различия в реализации между поддерживаемыми операционными системный.

в Windows также есть уведомление о готовой модели (select или WSAWaitForMultipleEvents), которую вы, возможно, видели раньше. Он не может масштабироваться до большого количества сокетов, поэтому он не подходит для высокопроизводительных сетевых приложений.

Не позволяйте этому отключить вас-Windows и Linux-это совершенно разные операционные системы. То, что не очень хорошо масштабируется в одной системе, может очень хорошо работать в другой. Этот подход на самом деле очень хорошо работает в Linux, с производительностью, сопоставимой с IOCP в Windows.


IOCP произносится как "асинхронный ввод-вывод" на различных платформах UNIX:


используйте boost:: asio. Легко. Он имеет мягкую кривую обучения, но он кросс-платформенный и автоматически использует лучший доступный метод для системы, которую вы компилируете. Просто нет причин не делать этого.

Я знаю, что это не совсем ответ на ваш вопрос, но это лучший совет, который я могу дать.


прочитайте запись в блоге из Google on libevent, вы можете реализовать семантику IOCP в Unix с помощью асинхронного ввода-вывода, но не можете напрямую реализовать асинхронную семантику IO с помощью IOCP,

http://google-opensource.blogspot.com/2010/01/libevent-20x-like-libevent-14x-only.html

для примера кроссплатформенного асинхронного ввода-вывода с API сокета BSD посмотрите на ZeroMQ, как недавно опубликованный на LWN.net,

http://www.zeromq.org/

LWN статья,

http://lwn.net/Articles/370307/


ядро Linux предоставляет концепцию" завершения блока ввода-вывода", каждый раз, когда вы используете API" blk_complete_request", например. Другой пример:

http://lxr.free-electrons.com/source/kernel/sched/completion.c

и как описано здесь:

http://www.ibm.com/developerworks/library/l-async/

linux имеет как синхронный, так и асинхронный API завершения ввода-вывода.

выше все на уровне ядра. На уровне пользовательского пространства есть API "io_submit ()":

http://www.fsl.cs.sunysb.edu / ~vass/linux-aio.txt

который детализировал полный набор API io_* ().

частично подобный вопрос:

действительно ли нет асинхронного ввода-вывода блока в Linux?


Я не совсем понимаю, что вы подразумеваете под "порты завершения". Все что я могу сказать, что вы можете использовать сокеты в неблокирующем режиме, что означает, что призывы немедленно вернуть.

эта ссылка довольно старая, но всеобъемлющая в том смысле, что она охватывает select() etc.: http://rhoden.id.au/doc/sockets2.html

и вот руководство GNU по сокетам:http://www.gnu.org/software/libc/manual/html_node/Sockets.html


Boost ASIO реализует Windows style IOCP (шаблон проектирования Proactor) в Linux с помощью epoll (шаблон реактора). См.http://think-async.com/Asio/asio-1.5.3/doc/asio/overview/core/async.html