Порты Linux и ввода/вывода?
Используя winsock, вы можете настроить сокеты или отдельные операции ввода-вывода для "перекрытия". Это означает, что вызовы для ввода-вывода возвращаются немедленно, а фактические операции выполняются асинхронно отдельными рабочими потоками.
Winsock также предоставляет "порты завершения". Из того, что я понимаю, порт завершения действует как мультиплексор ручек (сокетов). Ручка может быть демультиплексирована, если она не находится в середине операции ввода-вывода, то есть если все операции ввода-вывода завершены.
Итак, по моему вопросу... поддерживает ли linux порты завершения или даже асинхронный ввод-вывод для сокетов?
Ответы
Ответ 1
Если вы ищете нечто вроде IOCP, вы его не найдете, потому что его не существует.
Windows использует оповещение по модели завершения (следовательно, по завершении ввода/вывода). Вы запускаете некоторую операцию асинхронно и получаете уведомление, когда эта операция завершена.
Приложения Linux (и большинство других Unix-аликс) обычно используют оповещение на готовой модели. Вы получаете уведомление о том, что сокет можно читать или записывать без блокировки. Затем вы выполняете операцию ввода-вывода, которая не будет блокироваться.
С помощью этой модели вам не нужен асинхронный ввод-вывод. Данные немедленно копируются в/из буфера сокета.
Модель программирования для этого довольно сложна, поэтому есть библиотеки абстракции, такие как libevent. Он обеспечивает более простую модель программирования и абстрагирует различия в реализации между поддерживаемыми операционными системами.
В Windows также есть уведомление о готовой модели (выберите или WSAWaitForMultipleEvents), о которой вы, возможно, уже обращали внимание. Он не может масштабироваться до большого количества сокетов, поэтому он не подходит для высокопроизводительных сетевых приложений.
Не позволяйте этому убрать вас - Windows и Linux - это совершенно разные операционные системы. Что-то, что плохо масштабируется в одной системе, может отлично работать с другой. Этот подход на самом деле очень хорошо работает в Linux, производительность которого сопоставима с IOCP в Windows.
Ответ 2
IOCP произносится как "асинхронный ввод-вывод" на различных платформах UNIX:
Ответ 3
Использовать boost:: asio. Руки вниз. Он имеет мягкую кривую обучения, но он кросс-платформенный и автоматически использует наилучший доступный метод для системы, которую вы компилируете. Просто нет причин не делать этого.
Я знаю, что это не совсем ответ на ваш вопрос, но это лучший совет, который я мог бы дать.
Ответ 4
Прочитайте запись в блоге от 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/
Ответ 5
Ядро 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?
Ответ 6
Я не совсем понимаю, что вы подразумеваете под "портами завершения". Все, что я могу сказать, это то, что вы можете использовать сокеты в неблокирующем режиме, что означает, что вызовы немедленно возвращаются.
Эта ссылка довольно старая, но всеобъемлющая в том смысле, что она охватывает select()
и т.д.:
http://rhoden.id.au/doc/sockets2.html
И вот инструкция GNU по сокетам: http://www.gnu.org/software/libc/manual/html_node/Sockets.html
Ответ 7
Boost ASIO реализует IOCP в стиле Windows (шаблон проектирования Proactor) на Linux с использованием epoll (шаблон Reactor). См. http://think-async.com/Asio/asio-1.5.3/doc/asio/overview/core/async.html