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

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

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

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

37
задан someguy 8 May 2010 в 15:01
поделиться

3 ответа

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

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

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

В этой модели не требуется асинхронный ввод-вывод . Данные немедленно копируются в / из буфера сокета.

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

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

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

80
ответ дан 27 November 2019 в 04:12
поделиться

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

19
ответ дан 27 November 2019 в 04:12
поделиться

Прочтите запись в блоге Google на libevent , вы можете реализовать семантику IOCP в Unix, используя асинхронный ввод-вывод, но не можете напрямую реализовать семантику асинхронного ввода-вывода с использованием 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/

0
ответ дан 27 November 2019 в 04:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: