В течение некоторого времени я много гуглил, чтобы узнать о различных способах достижения асинхронного программирования / поведения на машинах nix, и (как мне было известно ранее) получил подтверждение того факта, что до сих пор нет ИСТИННОГО асинхронного шаблона (параллелизм с использованием одного потока) для Linux, как это доступно для Windows (IOCP).
Ниже приведены несколько альтернатив для Linux:
- select / poll / epoll :: Невозможно выполнить с использованием одного потока, поскольку epoll все еще блокирует вызов. Также отслеживаемые файловые дескрипторы должны быть открыты в неблокирующем режиме.
- libaio :: Что я узнал, так это то, что его реализация - отстой, и его все еще основанное на уведомлении, а не на завершении, как в портах завершения ввода-вывода Windows.
- Boost ASIO: он использует epoll под Linux и, следовательно, не является настоящим асинхронным шаблоном, поскольку порождает потоки, которые полностью абстрагируются от пользовательского кода для достижения шаблона проектирования проактора.
- libevent :: Есть ли причина для этого, если я предпочитаю ASIO?
А теперь вопросы :)
- Каким будет лучший шаблон проектирования для написания быстрого масштабируемого сетевого сервера с использованием epoll (конечно, здесь придется использовать потоки :()
- Я где-то читал, что «в неблокирующем режиме можно открывать только сокеты», следовательно, epoll поддерживает только сокеты и, следовательно, не может использоваться для дискового ввода-вывода. Насколько верно приведенное выше утверждение и почему асинхронное программирование не может выполняться на дисковом вводе-выводе с помощью epoll?
- Boost ASIO использует одну большую блокировку вокруг вызова epoll. На самом деле я не понимал, какие могут быть последствия и как их преодолеть с помощью самого asio. Аналогичный вопрос
- Как я могу изменить шаблон ASIO для работы с дисковыми файлами? Есть ли рекомендуемый шаблон дизайна?
Надеюсь, что кто-нибудь также сможет ответить на все вопросы с хорошими объяснениями. Также приветствуются любые ссылки на источник, где объясняются детали реализации шаблонов проектирования epoll и AIO.
select
,poll
иepoll
имеют параметр тайм-аута, который может быть равен нулю, что приводит к немедленному возврату функций. - person Some programmer dude   schedule 08.01.2012aio_*
функциями, является асинхронным. Вы просите, чтобы вас уведомляли, когда происходит событие, а затем продолжаете заниматься своими делами, пока ядро обрабатывает ваш ввод-вывод. - person Some programmer dude   schedule 08.01.2012select
в одном потоке. Скорее всего, с ненулевым таймаутом, но использование этих функций в режиме опроса с нулевым таймаутом и в одном потоке далеко не редкость. Однако это не совсем асинхронный процесс, а опрос. - person Some programmer dude   schedule 08.01.2012