Почему опрос не заменен на epoll?

8

Уровень срабатывания epollочень похож на poll. Почему это не pollпросто оболочка для epollсистем, поддерживающих последнее?

РЕДАКТИРОВАТЬ: я имею в виду, есть ли технические барьеры против такого решения? Реализация pollas epollзначительно повысит производительность многих сетевых приложений. Должна быть какая-то техническая проблема, которую я не замечаю.

Нихт Верстехен
источник
5
Это системные вызовы. Если вы понятия не имеете, о чем он говорит, возможно, вам стоит поискать это, но его вопрос совершенно прав.
drrlvn
2
Оба являются системными вызовами для ожидания каких-либо действий с набором файловых дескрипторов. Epoll специфичен для Linux 2.6+. Я добавил ссылки на страницы руководства.
Я знаю, что они есть. Но есть много Linux / Unix-подобных систем, у которых есть опрос, и на вопрос нельзя ответить, не уточнив, какие версии чего.
2010 г.
Реализация pollкак обертка для epollбыла бы невероятно сложной и неэффективной. Вам нужно будет либо установить новый дескриптор epoll и настроить его каждый раз, либо вам придется выполнить болезненное сравнение текущего набора опросов с тем, который уже связан с дескриптором epoll. Тьфу!
Дэвид Шварц

Ответы:

2

опрос намного проще для простых случаев; это, вероятно, столь же эффективно для небольшого числа файловых дескрипторов. Вызывающему абоненту не нужно беспокоиться о сохранении FD опросов и добавлении / удалении FD, они могут просто добавлять все, что им нужно, при каждом вызове poll.

Я чувствую, что они являются бесплатными, хотя опрос МОЖЕТ быть реализован в качестве оболочки для epoll, вероятно, не должно быть.

epoll может (почти) быть реализован как оболочка для опроса, но это победит его аргументы эффективности.

MarkR
источник
1
Это наиболее вероятный ответ. Я проверил его, и epoll действительно в 10 раз медленнее, чем опрос для 1 файлового дескриптора локального файла (550 us на 1000 опросов и 5420 us на 1000 epolls (create + ctl + wait + close)). epoll_wait был только в 2 раза медленнее, чем опрос.
1

Семантика poll()и epollразные. Если poll()вам сообщают, что дескриптор доступен для чтения, вы читаете, но не читаете все доступные байты, а затем снова передаете этот дескриптор poll(), и он сразу же проснется. AFAIK то же самое не относится к epoll.

Также обратите внимание, что epollдескрипторы являются ограниченным ресурсом. На этой странице рассказывается об epoll_create()условиях отказа, с которыми AFAIK не сталкивается poll().

Хотя я не уверен во всех деталях реализации, из этого можно сказать, что не имеет смысла делать poll()обертку для epoll. Программист должен знать об этих моментах, и существующий код, написанный с допущениями, poll()может сломаться.


источник
1
1. По умолчанию вариант epoll (Level-triggered) действует как опрос (см. Раздел описания на man-странице epoll (7)). 2. Опрос - это, по сути, epoll_create + epoll_ctl + epoll + wait + close. Таким образом, количество дескрипторов epoll, используемых в этом воображаемом опросе, ограничено количеством потоков, выполняющих опрос одновременно. Таким образом, может быть некоторая техника для настройки max_user_instances, чтобы отразить максимальное количество потоков. 3. Я опубликовал этот вопрос из-за любопытства по поводу этих предположений.
1

Хорошо, 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 .

Нихт Верстехен
источник