Хорошо, 7 лет спустя у меня есть более убедительный ответ, основанный на этой статье Эвана Клицке.
Во-первых, причина, по которой я задал вопрос, - это часто упоминаемое преимущество в производительности по epollсравнению с poll/ select. Слово гласит, что epollоно асимптотически более эффективно (O (1)), чем poll(O ( N )).
То , что не так широко известно, что только фронтом сигнала epoll действительно O (1), в то время как уровень-trggered epoll имеет те же асимптотику O ( N ). Действительно, запускаемый по уровню аромат должен проходить по списку отслеживаемых fds каждый раз, когда он вызывается, чтобы найти те, у которых потенциально есть еще ожидающие данные. Разновидность, запускаемая фронтом, может полагаться на сигналы в ответ на появление новых байтов в fd.
Было бы интересно выяснить, как именно возобновленная нить узнает, какой fd разбудил ее, но, безусловно, возможно, что эта информация пройдена во время пробуждения, вызванного эполлом.
Очевидно, что poll/ selectнельзя использовать запуск по краям, так epoll как семантика различна. Как мы видели, реализация с использованием уровня запуска epoll не принесет асимптотических преимуществ в производительности. И, возможно, также отрицательно повлияет на это, если постоянные факторы или постоянные условия высоки (так как они, кажется, основаны на грубом тесте, который я сделал и процитировал в другом комментарии).
Для получения дополнительной информации, пожалуйста, прочитайте блокирующий ввод / вывод, неблокирующий ввод / вывод и Epoll .