Используя winsock, можно настроить сокеты или разделить операции ввода-вывода для "накладываний". Это означает, что на звонки для выполнения ввода-вывода отвечают сразу, в то время как фактические операции завершаются асинхронно отдельными рабочими потоками.
Winsock также обеспечивает "порты завершения". Из того, что я понимаю, порт завершения действует как мультиплексор дескрипторов (сокеты). Дескриптор может быть демультиплексирован, если это не посреди операции ввода-вывода, т.е. если все ее операции ввода-вывода завершаются.
Так, по моему вопросу... Linux поддерживает порты завершения или даже асинхронный ввод-вывод для сокетов?
Если вы ищете что-то в точности как IOCP, вы не найдете его, потому что его не существует.
Windows использует модель уведомления о завершении (отсюда I / O Completion Порты). Вы запускаете некоторую операцию асинхронно и получаете уведомление, когда эта операция завершена.
Приложения Linux (и большинство других Unix-подобных) обычно используют модель уведомления о готовности. Вы получите уведомление о том, что сокет может быть прочитан или записан без блокировки. Затем вы выполняете операцию ввода-вывода, которая не блокируется.
В этой модели не требуется асинхронный ввод-вывод . Данные немедленно копируются в / из буфера сокета.
Модель программирования для этого довольно сложна, поэтому существуют библиотеки абстракции, такие как libevent. Он обеспечивает более простую модель программирования и абстрагирует различия реализации между поддерживаемыми операционными системами.
В Windows также есть уведомление о готовой модели (select или WSAWaitForMultipleEvents), которое вы, возможно, уже видели раньше. Он не может масштабироваться до большого количества сокетов, поэтому не подходит для высокопроизводительных сетевых приложений.
Пусть вас это не смущает - Windows и Linux - совершенно разные операционные системы. То, что плохо масштабируется в одной системе, может хорошо работать в другой. Этот подход действительно очень хорошо работает в Linux, с производительностью, сопоставимой с IOCP в Windows.
IOCP произносится как «асинхронный ввод-вывод» на различных платформах UNIX:
Прочтите запись в блоге Google на libevent
, вы можете реализовать семантику IOCP в Unix, используя асинхронный ввод-вывод, но не можете напрямую реализовать семантику асинхронного ввода-вывода с использованием IOCP,
http: //google-opensource.blogspot .com / 2010/01 / libevent-20x-like-libevent-14x-only.html
В качестве примера межплатформенного асинхронного ввода-вывода с API сокета BSD посмотрите ZeroMQ, недавно опубликованный на LWN.net,
Статья LWN,