МХП-Арена
- 1 year ago
- 0
- 0
Epoll
(event poll) — API мультиплексированного ввода-вывода, предоставляемого
Linux
для приложений. API позволяет приложениям осуществлять мониторинг нескольких открытых
файловых дескрипторов
(которые могут быть файлами, устройствами или сокетами, в том числе сетевыми), для того, чтобы узнать, готово ли устройство для продолжения ввода (вывода). Epoll планировался как более эффективная замена вызовам
()
и
()
, определёнными в
POSIX
. Epoll может предоставить более эффективный механизм для приложений, обрабатывающих большое количество одновременно открытых соединений — со сложностью O(1) в отличие от стандартного механизма, обладающего сложностью O(n). Epoll аналогичен системе
из
FreeBSD
и также представляет собой объект ядра, предоставляемый для работы в
пространстве пользователя
в виде
файлового дескриптора
.
По аналогии "epoll" часто называют другие подобные решения, схожие по методике.
Для использования select или poll приложение должно передать в ядро полный список всех файловых дескрипторов, в которых оно ожидает появление данных; а ядро, в свою очередь, должно для каждого из переданных элементов проверить состояние дескрипторов и сформировать структуру, описывающую состояние каждого переданного дескриптора. Такой подход не создаст много проблем в условиях десятков или сотен дескрипторов. Тем не менее, производительность в больших сетях заметно падает.
Linux предоставляет следующие вызовы в рамках API:
int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
Принцип работы: после того, как приложение добавляет дескрипторы к наблюдению и вызывает epoll_wait(), при готовности какого-либо дескриптора (появлению информации, опустошению буфера и т. д.) ядро возвращает приложение из epoll_wait со списком файловых дескрипторов, которые готовы к работе. Если какие-то дескрипторы становятся готовыми к работе до вызова epoll_wait, то они отмечаются соответствующим образом и при следующем вызове epoll_wait управление в приложение возвращается сразу же со списком готовых к работе файловых дескрипторов.
События, за которыми можно наблюдать с помощью epoll:
epoll позволяет работать в двух режимах:
Если приложение прочитало из файлового дескриптора только часть доступных для чтения данных, то при следующем вызове:
Начиная с 2.6.28 /proc/sys/fs/epoll/max_user_watches указывает максимальное число файловых дескрипторов, за которыми может наблюдать пользователь.