Знакомство с основами асинхронного программирования на * nix - PullRequest
15 голосов
/ 08 января 2012

В течение некоторого времени я много гуглял, чтобы узнать о различных способах достижения асинхронного программирования / поведения на машинах nix, и (как я знал ранее) подтвердил тот факт, что до сих пор не существует асинхронного TRULYшаблон (параллелизм с использованием одного потока) для Linux, доступный для Windows (IOCP).

Ниже представлено несколько альтернатив для Linux:

  1. select / poll / epoll :: Невозможно выполнить с использованием одного потока, так как epoll все еще блокирует вызов.Кроме того, отслеживаемые файловые дескрипторы должны открываться в неблокирующем режиме.
  2. libaio :: Что я узнал, так это то, что его реализация отстой и его уведомление по-прежнему основано вместо завершенияосновано как на портах завершения ввода / вывода Windows.
  3. Boost ASIO :: Он использует epoll под linux и, таким образом, не является истинным асинхронным шаблоном, поскольку порождает потоки, которые полностью абстрагированы от пользовательского кода доПолучить шаблон проектирования Proactor
  4. libevent :: Есть ли основания для этого, если я предпочитаю ASIO?

Теперь вот вопросы:)

  1. Какой будет лучший шаблон проектирования для написания быстро масштабируемого сетевого сервера с использованием epoll (конечно, здесь придется использовать потоки :()
  2. Я где-то читал, что «открывать можно только сокетыв неблокирующем режиме "следовательно, epoll поддерживает только сокеты и, следовательно, не может использоваться для дискового ввода-вывода. Насколько верно приведенное выше утверждение и почему асинхронное программирование не может быть выполнено надисковый ввод / вывод с использованием epoll?
  3. Boost ASIO использует одну большую блокировку вызова epoll.Я на самом деле не понимал, каковы могут быть его последствия и как их преодолеть с помощью самого asio. Аналогичный вопрос
  4. Как изменить шаблон ASIO для работы с дисковыми файлами?Есть ли рекомендуемый шаблон дизайна?

Надеюсь, кто-нибудь сможет ответить на все вопросы и с хорошими объяснениями.Также приветствуется любая ссылка на источник, где подробно описываются детали реализации шаблонов epoll и AIO design.

Ответы [ 2 ]

11 голосов
/ 08 января 2012

Boost ASIO :: Он использует epoll под linux и, следовательно, не является истинным асинхронным шаблоном, поскольку порождает потоки, которые полностью абстрагированы от пользовательского кода для получения шаблона проектирования proactor

Этонеправильно.Библиотека Asio использует epoll() по умолчанию в большинстве последних версий ядра Linux.однако потоки, вызывающие io_service::run(), будут вызывать обработчики обратного вызова по мере необходимости.В библиотеке Asio есть только одно место, где поток используется для эмуляции асинхронного интерфейса, это хорошо описано в документации :

Для io_service используется дополнительный потокэмулировать асинхронное разрешение хоста.Этот поток создается при первом вызове либо ip::tcp::resolver::async_resolve(), либо ip::udp::resolver::async_resolve().

Это не делает библиотеку "не истинным асинхронным шаблоном", как вы утверждаете, на самом деле ее имя может не совпадатьс вами по определению.

1) Какой будет лучший шаблон проектирования для написания быстро масштабируемого сетевого сервера с использованием epoll (конечно, здесь придется использовать потоки :()

Я предлагаю использовать Boost Asio, он использует шаблон проектирования проактора.

3) Boost ASIO использует один большой замок вокруг вызова epoll.Я на самом деле не понимал, каковы могут быть его последствия и как их преодолеть, используя саму asio

В реакторе epoll используется мьютекс для отправки обработчиков, хотя на практике это не представляет большой проблемы для большинства приложений.Существуют специфичные для приложений способы смягчения этого поведения, например io_service на процессор для использования локальности данных.См. мой ответ на аналогичный вопрос по этой теме.Это также часто обсуждается в списке рассылки Asio .

4) Как я могу изменить шаблон ASIO для работы с дисковыми файлами?Есть ли рекомендуемый шаблон проектирования?

Библиотека Asio изначально не поддерживает файловый ввод-вывод, как вы заметили.Было несколько попыток добавить его в библиотеку, я бы посоветовал обсудить в список рассылки .

2 голосов
/ 08 января 2012

Прежде всего:

получил подтверждение того факта, что для Linux все еще не существует асинхронного шаблона TRULY (параллелизм с использованием одного потока), доступного для Windows (IOCP).

Возможно, у вас есть небольшое заблуждение, асинхронный может быть построен поверх API "опроса".

Более того, этот «реакторный» (epoll-подобный) API более мощный, чем «проакторный» API (IOCP), так как второе может быть реализовано в терминах первого (но не наоборот).

Также некоторые операции, которые «действительно» асинхронны, например, например, дисковый ввод-вывод, некоторые другие инструменты могут быть с комбинацией сигналов и специфичные для Linux signalfd могут обеспечить полный охват некоторых других случаев.

Итог. epoll - это действительно асинхронный ввод / вывод

...