Я проектирую цикл обработки событий для асинхронного ввода-вывода с использованием epoll / devpoll / kqueue / poll / select (включая windows-select).
У меня есть два варианта выполнения операции ввода-вывода:
Неблокирующий режим, опрос по EAGAIN
- Установить сокет в неблокирующий режим.
- Чтение / запись в сокет.
- Если операция прошла успешно, отправьте уведомление о завершении в цикл событий.
- Если я получу EAGAIN, добавлю сокет в «список выбора» и сокет опроса.
Режим опроса: опрос, а затем выполнение
- Добавить сокет для выбора списка и опроса его.
- Дождаться уведомления о том, что он доступен для чтения и записи
- чтение / запись
- Публикация уведомления о завершении в цикле событий sucseeds
Мне кажется, что для начала потребуется меньше системных вызовов при использовании в обычном режиме, особенно для записи в сокет (буферы довольно большие).Кроме того, похоже, что можно было бы сократить накладные расходы на количество «избранных» исполнений, особенно это хорошо, когда у вас нет чего-то, что масштабируется так же, как epoll / devpoll / kqueue.
Вопросы:
- Есть ли преимущества второго подхода?
- Существуют ли проблемы переносимости неблокирующих операций над сокетами / файловыми дескрипторами в многочисленных операционных системах: Linux, FreeBSD, Solaris, MacOSX, Windows.
Примечания: Пожалуйста, не предлагайте использовать существующие реализации цикла событий / socket-api