stringtranslate.com

epoll

epollсистемный вызов ядра Linux для масштабируемого механизма уведомления о событиях ввода-вывода, впервые представленный в версии 2.5.45 ядра Linux . [1] Его функция заключается в мониторинге нескольких файловых дескрипторов для определения возможности ввода-вывода на любом из них. Он предназначен для замены старых POSIX и системных вызовов , чтобы достичь лучшей производительности в более требовательных приложениях, где количество отслеживаемых файловых дескрипторов велико (в отличие от старых системных вызовов, которые работают за время O ( n ), работает за время O (1) ). [2] select(2)poll(2) epoll

epollпохож на FreeBSDkqueue тем, что состоит из набора функций пользовательского пространства , каждая из которых принимает аргумент дескриптора файла, обозначающий настраиваемый объект ядра, с которым они совместно работают. 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Может быть ADD, MODIFY или DELETE.

int epoll_wait ( int epfd , struct epoll_event * events , int maxevents , int timeout );         

Ожидает любого из событий, зарегистрированных для с epoll_ctl, пока не произойдет хотя бы одно или не истечет время ожидания. Возвращает произошедшие события в events, до maxeventsза один раз. maxevents— максимальное количество epoll_eventдескрипторов /file для мониторинга. [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опций EPOLLONESHOTи EPOLLEXCLUSIVE. EPOLLONESHOTбыл добавлен в версию 2.6.2 основной ветки ядра Linux, выпущенную в феврале 2004 года. EPOLLEXCLUSIVEбыл добавлен в версию 4.5, выпущенную в марте 2016 года. [8]

Смотрите также

Ссылки

  1. ^ ab "epoll(7) - страница руководства Linux". Man7.org. 2012-04-17 . Получено 2014-03-01 .
  2. ^ Алексей Ковырин (2006-04-13). "Использование epoll() для асинхронного сетевого программирования". Kovyrin.net . Получено 2014-03-01 .
  3. ^ "Реализация epoll (1)". idndx.com . Сентябрь 2014 г.
  4. ^ Лав, Роберт (2013). Linux System Programming (Второе издание). O'Reilly. С. 97, 98. ISBN 978-1-449-33953-1.
  5. ^ "epoll_wait: maxevents". 3 июня 2010 г. Получено 06.07.2023 г.
  6. ^ "epoll_wait(2) — Страница руководства Linux". 2023-03-30 . Получено 2023-07-06 .
  7. Архивировано в Ghostarchive и Wayback Machine: «Ubuntu убивает котят | BSD Now 103». YouTube .
  8. ^ "Epoll фундаментально сломан на 1/2". idea.popcount.org. 2017-02-20 . Получено 2017-10-06 .

Внешние ссылки