Подтвердить что ты не робот

Порты Linux и ввода/вывода?

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

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

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

4b9b3361

Ответ 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