В течение некоторого времени я много искал, чтобы узнать о различных способах асинхронного программирования/поведения на машинах 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.