epoll - epoll

редактировать

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

epollпохож на FreeBSD s kqueue тем, что состоит из набора пользовательского пространства функции, каждая из которых принимает аргумент дескриптор файла, обозначающий настраиваемый объект ядра, с которым они совместно работают. epollиспользует структуру данных красно-черное дерево (RB-tree) для отслеживания всех файловых дескрипторов, которые в настоящее время отслеживаются.

Содержание
  • 1 API
  • 2 Режимы запуска
  • 3 Критика
  • 4 См. Также
  • 5 Ссылки
  • 6 Внешние ссылки
API
int epoll_create1 (int flags);

Создает объект epollи возвращает его файловый дескриптор. Параметр flagsпозволяет изменять поведение epoll. У него только одно допустимое значение, EPOLL_CLOEXEC. epoll_create ()- это более старый вариант epoll_create1 (), который устарел в версии ядра Linux 2.6.27 и glibc версии 2.9.

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одновременно.

Режимы запуска

epollобеспечивает режимы с запуском по фронту и с запуском по уровню. В режиме запуска по фронту вызов epoll_waitвернется только тогда, когда новое событие будет поставлено в очередь с объектом epoll, а в режиме запуска по уровню epoll_waitбудет возвращаться, пока выполняется условие.

Например, если канал pipe, зарегистрированный в epoll, получил данные, вызов epoll_waitвернется, сигнализируя о наличии данных для быть прочитанным. Предположим, читатель использовал только часть данных из буфера. В режиме с запуском по уровню дальнейшие вызовы epoll_waitбудут возвращаться немедленно, пока буфер канала содержит данные для чтения. Однако в режиме запуска по фронту epoll_waitбудет возвращать только после того, как новые данные будут записаны в конвейер.

Критика

Брайан Кантрилл указал, что epollимел ошибки, которых можно было бы избежать, если бы он учился у своих предшественников: порты завершения ввода / вывода, (Solaris) и kqueue. Однако большая часть его критики была адресована вариантам epollEPOLLONESHOTи EPOLLEXCLUSIVE. EPOLLONESHOTбыл добавлен в версию 2.6.2 основной ветки ядра Linux, выпущенную в феврале 2004 года. EPOLLEXCLUSIVEбыл добавлен в версию 4.5, выпущенную в марте 2016 года.

См. также
  • icon портал Linux
Ссылки
Внешние ссылки
Последняя правка сделана 2021-05-19 12:30:55
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте