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

Знакомство с основами асинхронного программирования на * nix

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

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

  • select/poll/epoll:: Невозможно выполнить один поток, поскольку epoll по-прежнему блокирует вызов. Также отслеживаемые файловые дескрипторы должны быть открыты в неблокирующем режиме.
  • libaio:: То, о чем я узнал, это то, что его реализация отстойна и ее все еще основанное уведомление, а не завершение, основанное на портах завершения ввода-вывода Windows.
  • Boost ASIO:: Он использует epoll под linux и, следовательно, не является истинным шаблоном async, поскольку он порождает поток, который полностью абстрагируется от кода пользователя, чтобы получить шаблон проектирования проактора
  • libevent:: Любые причины для этого, если я предпочитаю ASIO?

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

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

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

4b9b3361

Ответ 1

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

Это неверно. Библиотека 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

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

подтверждено тем фактом, что по-прежнему нет TRUEY async pattern (concurrency с использованием одного потока) для Linux, доступного для Windows (IOCP).

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

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

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

Нижняя линия. epoll действительно асинхронный ввод-вывод