эполл
epoll
— это ядра Linux системный вызов для масштабируемого механизма уведомления о событиях ввода-вывода, впервые представленный в версии 2.5.45 ядра Linux . [1] Его функция — отслеживать несколько файловых дескрипторов, чтобы определить, возможен ли ввод-вывод на любом из них. Он предназначен для замены старого POSIX. select(2)
и poll(2)
системные вызовы , для достижения лучшей производительности в более требовательных приложениях, где количество отслеживаемых файловых дескрипторов велико (в отличие от старых системных вызовов, которые работают за O ( n ), время epoll
работает за время O (1). [2]
epoll
похож FreeBSD на kqueue
, поскольку он состоит из набора функций пользовательского пространства , каждая из которых принимает аргумент дескриптора файла , обозначающий настраиваемый объект ядра, с которым они совместно работают. epoll
использует структуру данных красно-черного дерева (RB-дерево) для отслеживания всех файловых дескрипторов, которые в данный момент отслеживаются. [3]
API
[ редактировать ]int epoll_create1(int flags);
Создает epoll
объект и возвращает его файловый дескриптор. flags
Параметр позволяет изменить поведение epoll. Он имеет только одно допустимое значение, EPOLL_CLOEXEC
. epoll_create()
это более старый вариант epoll_create1()
и устарел с версии ядра Linux 2.6.27 и glibc версии 2.9. [4]
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
Управляет (настраивает), какие файловые дескрипторы отслеживаются этим объектом и за какими событиями. op
может быть ДОБАВИТЬ, ИЗМЕНИТЬ или УДАЛИТЬ.
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);
Ожидает любого из событий, зарегистрированных с помощью epoll_ctl
, пока не произойдет хотя бы одно или не истечет время ожидания. Возвращает произошедшие события в events
, до maxevents
сразу. maxevents
это максимальное количество epoll_event
/файловые дескрипторы, которые необходимо отслеживать. [5] [6] В большинстве случаев maxevents
устанавливается на значение размера *events
аргумент ( struct epoll_event *events
множество).
Режимы запуска
[ редактировать ]epoll
обеспечивает режимы запуска как по фронту , так и по уровню . В режиме, запускаемом по фронту, вызов epoll_wait
вернется только тогда, когда новое событие будет поставлено в очередь с epoll
объект, находясь в режиме срабатывания по уровню, epoll_wait
будет возвращаться до тех пор, пока условие сохраняется.
Например, если труба зарегистрирована в epoll
получил данные, звонок на epoll_wait
вернется, сигнализируя о наличии данных для чтения. Предположим, считыватель потреблял только часть данных из буфера. В режиме, запускаемом по уровню, дальнейшие вызовы epoll_wait
вернется немедленно, пока буфер канала содержит данные для чтения. Однако в режиме запуска по фронту epoll_wait
вернется только после записи новых данных в канал. [1]
Ошибки
[ редактировать ]Брайан Кэнтрилл отметил, что epoll
имел ошибки, которых можно было бы избежать, если бы он учился у своих предшественников: порты завершения ввода/вывода , порты событий (Solaris) и kqueue . [7] Однако большая часть его критики была адресована epoll
's EPOLLONESHOT
и EPOLLEXCLUSIVE
параметры. EPOLLONESHOT
был добавлен в версию 2.6.2 основной ветки ядра Linux, выпущенную в феврале 2004 года. EPOLLEXCLUSIVE
был добавлен в версии 4.5, выпущенной в марте 2016 года. [8]
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Jump up to: а б «epoll(7) — страница руководства Linux» . Man7.org. 17 апреля 2012 г. Проверено 1 марта 2014 г.
- ^ Алексей Ковырин (13 апреля 2006 г.). «Использование epoll() для асинхронного сетевого программирования» . Ковырин.нет . Проверено 1 марта 2014 г.
- ^ «Реализация epoll (1)» . idndx.com . Сентябрь 2014.
- ^ С любовью, Роберт (2013). Системное программирование Linux (второе изд.). О'Рейли. стр. 97, 98. ISBN. 978-1-449-33953-1 .
- ^ «epoll_wait: maxevents» . 3 июня 2010 г. Проверено 6 июля 2023 г.
- ^ «epoll_wait(2) — страница руководства Linux» . 30 марта 2023 г. Проверено 6 июля 2023 г.
- ^ Архивировано в Ghostarchive и Wayback Machine : «Ubuntu убивает котят | BSD Now 103» . Ютуб .
- ^ "Эполл принципиально сломан на 1/2" . idea.popcount.org. 20 февраля 2017 г. Проверено 6 октября 2017 г.