stringtranslate.com

эполл

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

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и EPOLLEXCLUSIVEoptions'. EPOLLONESHOTбыл добавлен в версию 2.6.2 основной ветки ядра Linux, выпущенную в феврале 2004 г. EPOLLEXCLUSIVEБыл добавлен в версию 4.5, выпущенную в марте 2016 г. [8]

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

Рекомендации

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

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