Уровень срабатывания epoll
очень похож на poll
. Почему это не poll
просто оболочка для epoll
систем, поддерживающих последнее?
РЕДАКТИРОВАТЬ: я имею в виду, есть ли технические барьеры против такого решения? Реализация poll
as epoll
значительно повысит производительность многих сетевых приложений. Должна быть какая-то техническая проблема, которую я не замечаю.
poll
как обертка дляepoll
была бы невероятно сложной и неэффективной. Вам нужно будет либо установить новый дескриптор epoll и настроить его каждый раз, либо вам придется выполнить болезненное сравнение текущего набора опросов с тем, который уже связан с дескриптором epoll. Тьфу!Ответы:
опрос намного проще для простых случаев; это, вероятно, столь же эффективно для небольшого числа файловых дескрипторов. Вызывающему абоненту не нужно беспокоиться о сохранении FD опросов и добавлении / удалении FD, они могут просто добавлять все, что им нужно, при каждом вызове poll.
Я чувствую, что они являются бесплатными, хотя опрос МОЖЕТ быть реализован в качестве оболочки для epoll, вероятно, не должно быть.
epoll может (почти) быть реализован как оболочка для опроса, но это победит его аргументы эффективности.
источник
Семантика
poll()
иepoll
разные. Еслиpoll()
вам сообщают, что дескриптор доступен для чтения, вы читаете, но не читаете все доступные байты, а затем снова передаете этот дескрипторpoll()
, и он сразу же проснется. AFAIK то же самое не относится кepoll
.Также обратите внимание, что
epoll
дескрипторы являются ограниченным ресурсом. На этой странице рассказывается обepoll_create()
условиях отказа, с которыми AFAIK не сталкиваетсяpoll()
.Хотя я не уверен во всех деталях реализации, из этого можно сказать, что не имеет смысла делать
poll()
обертку дляepoll
. Программист должен знать об этих моментах, и существующий код, написанный с допущениями,poll()
может сломаться.источник
Хорошо, 7 лет спустя у меня есть более убедительный ответ, основанный на этой статье Эвана Клицке.
Во-первых, причина, по которой я задал вопрос, - это часто упоминаемое преимущество в производительности по
epoll
сравнению сpoll
/select
. Слово гласит, чтоepoll
оно асимптотически более эффективно (O (1)), чемpoll
(O ( N )).То , что не так широко известно, что только фронтом сигнала
epoll
действительно O (1), в то время как уровень-trggeredepoll
имеет те же асимптотику O ( N ). Действительно, запускаемый по уровню аромат должен проходить по списку отслеживаемых fds каждый раз, когда он вызывается, чтобы найти те, у которых потенциально есть еще ожидающие данные. Разновидность, запускаемая фронтом, может полагаться на сигналы в ответ на появление новых байтов в fd.Было бы интересно выяснить, как именно возобновленная нить узнает, какой fd разбудил ее, но, безусловно, возможно, что эта информация пройдена во время пробуждения, вызванного эполлом.
Очевидно, что
poll
/select
нельзя использовать запуск по краям, такepoll
как семантика различна. Как мы видели, реализация с использованием уровня запускаepoll
не принесет асимптотических преимуществ в производительности. И, возможно, также отрицательно повлияет на это, если постоянные факторы или постоянные условия высоки (так как они, кажется, основаны на грубом тесте, который я сделал и процитировал в другом комментарии).Для получения дополнительной информации, пожалуйста, прочитайте блокирующий ввод / вывод, неблокирующий ввод / вывод и Epoll .
источник