WikiDer > Эполл

Epoll

эполл это Ядро 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]

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

использованная литература

  1. ^ "epoll (7) - страница руководства Linux". Man7.org. 2012-04-17. Получено 2014-03-01.
  2. ^ Алексей Ковырин (13.04.2006). «Использование epoll () для асинхронного сетевого программирования». Kovyrin.net. Получено 2014-03-01.
  3. ^ https://idndx.com/2014/09/01/the-implementation-of-epoll-1/
  4. ^ С любовью, Роберт (2013). Системное программирование Linux (Второе изд.). О'Рейли. С. 97, 98. ISBN 978-1-449-33953-1.
  5. ^ https://www.youtube.com/watch?v=l6XQUciI-Sc&t=57m
  6. ^ "Epoll в корне сломан на 1/2". idea.popcount.org. 2017-02-20. Получено 2017-10-06.

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