WikiDer > Эполл
эполл
это Ядро Linux системный вызов для масштабируемого механизма уведомления о событиях ввода-вывода, впервые представленного в версии 2.5.44 Ядро Linux.[1] Его функция - отслеживать несколько файловых дескрипторов, чтобы увидеть, возможен ли ввод-вывод для любого из них. Он предназначен для замены старых POSIX выберите (2)
и опрос (2)
системные вызовы, чтобы добиться лучшей производительности в более требовательных приложениях, где количество просмотренных файловые дескрипторы большой (в отличие от старых системных вызовов, которые работают в О(п) время, эполл
работает в О(1 раз[2]).
эполл
похоже на FreeBSDс kqueue
, в том, что он состоит из набора пользовательское пространство функции, каждая из которых дескриптор файла аргумент, обозначающий настраиваемый объект ядра, с которым они совместно работают. эполл
использует красно-черное дерево Структура данных (RB-tree) для отслеживания всех файловых дескрипторов, которые в настоящее время отслеживаются.[3]
API
int epoll_create1(int флаги);
Создает эполл
объект и возвращает его файловый дескриптор. В флаги
Параметр позволяет изменять поведение epoll. У него только одно допустимое значение, EPOLL_CLOEXEC
. epoll_create ()
это более старый вариант epoll_create1 ()
и устарела в версии ядра Linux 2.6.27 и glibc версии 2.9.[4]
int epoll_ctl(int э.п.п.м., int op, int fd, структура epoll_event *мероприятие);
Управляет (настраивает), какие дескрипторы файлов отслеживаются этим объектом и для каких событий. op
может быть ДОБАВИТЬ, ИЗМЕНИТЬ или УДАЛИТЬ.
int epoll_wait(int э.п.п.м., структура epoll_event *События, int maxevents, int тайм-аут);
Ожидает любого из событий, зарегистрированных на epoll_ctl
, пока не произойдет хотя бы одно событие или не истечет время ожидания. Возвращает произошедшие события в События
, вплоть до maxevents
однажды.
Режимы срабатывания
эполл
обеспечивает как срабатывающий по краю и срабатывает по уровню режимы. В режиме запуска по фронту вызов epoll_wait
вернется только тогда, когда новое событие будет поставлено в очередь с эполл
объект, находясь в режиме срабатывания уровня, epoll_wait
вернется, пока выполняется условие.
Например, если труба зарегистрирован с эполл
получил данные, звонок epoll_wait
вернется, сигнализируя о наличии данных для чтения. Предположим, читатель использовал только часть данных из буфера. В режиме с запуском уровня дальнейшие вызовы epoll_wait
вернется немедленно, пока буфер канала содержит данные для чтения. Однако в режиме запуска по фронту epoll_wait
вернется только после того, как новые данные будут записаны в канал.
Критика
Брайан Кэнтрилл указал, что эполл
были ошибки, которых можно было бы избежать, если бы он учился у своих предшественников: порты завершения ввода / вывода, порты событий (Солярис) и kqueue.[5] Однако большая часть его критики была адресована эполл
с EPOLLONESHOT
и EPOLLEXCLUSIVE
опции. EPOLLONESHOT
был добавлен в версию 2.6.2 основной ветки ядра Linux, выпущенной в феврале 2004 года. EPOLLEXCLUSIVE
был добавлен в версии 4.5, выпущенной в марте 2016 года.[6]
Смотрите также
использованная литература
- ^ "epoll (7) - страница руководства Linux". Man7.org. 2012-04-17. Получено 2014-03-01.
- ^ Алексей Ковырин (13.04.2006). «Использование epoll () для асинхронного сетевого программирования». Kovyrin.net. Получено 2014-03-01.
- ^ https://idndx.com/2014/09/01/the-implementation-of-epoll-1/
- ^ С любовью, Роберт (2013). Системное программирование Linux (Второе изд.). О'Рейли. С. 97, 98. ISBN 978-1-449-33953-1.
- ^ https://www.youtube.com/watch?v=l6XQUciI-Sc&t=57m
- ^ "Epoll в корне сломан на 1/2". idea.popcount.org. 2017-02-20. Получено 2017-10-06.