Epoll

Epoll

Epoll (extended poll) — API асинхронного ввода-вывода, предоставляемого Linux для приложений. API позволяет приложениям осуществлять мониторинг нескольких открытых файловых дескрипторов (которые могут быть файлами, устройствами или сокетами, в том числе сетевыми), для того, чтобы узнать, готово ли устройство для продолжения ввода (вывода). Epoll планировался как более эффективная замена вызовам select () и poll (), определёнными в posix. Epoll может предоставить более эффективный механизм для приложений, обрабатывающих большое количество одновременно открытых соединений - со сложностью O(1) в отличие от стандартного механизма, обладающего сложностью O(n). Epoll аналогичен системе Kqueue из FreeBSD и также представляет собой объект ядра, предоставляемый для работы в пространстве пользователя в виде файлового дескриптора.

Содержание

Проблема select/poll

Для использования select или poll приложение должно передать в ядро полный список всех файловых дескрипторов, в которых оно ожидает появление данных; а ядро, в свою очередь, должно для каждого из переданных элементов проверить состояние дескрипторов и сформировать структуру, описывающую состояние каждого переданного дескриптора. Подобная схема нормально работает в условиях десятков и сотен открытых соединений, но начинает создавать чрезмерный оверхед для соединений в тысячи и десятки тысяч установленных соединений.

Описание epoll API

Linux предоставляет следующие вызовы в рамках API:

  • epoll_create() — создаёт структуру данных (epoll instance), с которой в дальнейшем идёт работа. Структура одна для всех файловых дескрипторов, за которыми идёт наблюдение. Функция возвращает файловый дескриптор, который в дальнейшем передаётся во все остальные вызовы epoll API.
  • epoll_ctl() — используется для управления epoll instance, в частности, позволяет выполнять операции EPOLL_CTL_ADD (добавление файлового дескриптора к наблюдению), EPOLL_CTL_DEL (удаление файлового дескриптора из наблюдения), EPOLL_CTL_MOD (изменение параметров наблюдения), EPOL_CTL_DISABLE (добавлена в Linux 3.7) — для безопасного отключения наблюдения за файловым дескриптором в многопоточных приложениях
  • epoll_wait() — возвращает один или более файловых десктрипторов из списка наблюдения, у которых поменялось состояние (которые готовы к вводу/выводу).
Прототипы функций

int epoll_create(int size);
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout);

Принцип работы: после того, как приложение добавляет дескрипторы к наблюдению и вызывает epoll_wait(), при готовности какого-либо дескриптора (появлению информации, опустошению буфера и т. д.) ядро возвращает приложение из epoll_wait со списком файловых дескрипторов, которые готовы к работе. Если какие-то дескрипторы становятся готовыми к работе до вызова epoll_wait, то они отмечаются соответствующим образом и при следующем вызове epoll_wait управление в приложение возвращается сразу же со списком готовых к работе файловых дескрипторов.

События, за которыми можно наблюдать с помощью epoll:

  • EPOLLIN — новые данные (для чтения) в файловом дескрипторе
  • EPOLLOUT — файловые дескриптор готов продолжить принимать данные (для записи)
  • EPOLLERR — в файловом дескрипторе произошла ошибка
  • EPOLLHUP — закрытие файлового дескриптора

Режимы работы

epoll позволяет работать в двух режимах:

  • edge-triggered — файловый дескриптор с событием возвращается только если с момента последнего возврата произошли новые события (например, пришли новые данные)
  • level-triggered — файловый дескриптор возвращается, если остались непрочитанные/записанные данные

Если приложение прочитало из файлового дескриптора только часть доступных для чтения данных, то при следующем вызове:

  • в edge-triggered файловый дескриптор не будет возвращён до тех пор, пока в дескрипторе не появятся новые данные;
  • в level-triggerd файловый дескриптор будет возвращаться до тех пор, пока не прочитаны все «старые» данные (и новые, если таковые придут)

Управление

Начиная с 2.6.28 /proc/sys/fs/epoll/max_user_watches указывает максимальное число файловых дескрипторов, за которыми может наблюдать пользователь

Источники


Wikimedia Foundation. 2010.

Игры ⚽ Поможем сделать НИР

Полезное


Смотреть что такое "Epoll" в других словарях:

  • POCO — Эту статью следует викифицировать. Пожалуйста, оформите её согласно правилам оформления статей …   Википедия

  • C10k problem — Le c10k problem[note 1] que l on pourrait traduire en français par le problème des dix mille connexions simultanées, est un code numérique utilisé pour exprimer la limitation que la plupart des serveurs ont en termes de connexions réseaux. Cette… …   Wikipédia en Français

  • Comparison of Internet Relay Chat daemons — This list is incomplete; you can help by expanding it. The following tables compare general and technical information including the differences in feature sets between popular IRC daemons. Grey entries in the list represent supposedly… …   Wikipedia

  • Lighttpd — Infobox Software name = lighttpd caption = developer = Jan Kneschke released = ? frequently updated = yes programming language = C operating system = Cross platform language = English genre = Web server license = BSD licenses website =… …   Wikipedia

  • File descriptor — In computer programming, a file descriptor is an abstract key for accessing a file. The term is generally used in POSIX operating systems. In Microsoft Windows terminology and in the context of the C standard I/O library, file handle is preferred …   Wikipedia

  • IRCd — G line redirects here. For other uses, see G line (disambiguation). K line redirects here. For other uses, see K line (disambiguation). An IRCd, short for Internet Relay Chat daemon, is server software that implements the IRC protocol, enabling… …   Wikipedia

  • Asynchronous I/O — Asynchronous I/O, or non blocking I/O, is a form of input/output processing that permits other processing to continue before the transmission has finished. Input and output (I/O) operations on a computer can be extremely slow compared to the… …   Wikipedia

  • Lazarus (software) — This article concerns the software IDE named Lazarus. For other uses of the name, see Lazarus (disambiguation). Infobox Software name = Lazarus caption = Lazarus IDE 0.9.25 Screen print (Linux, GTK1) developer = volunteers latest release version …   Wikipedia

  • Libevent — is an asynchronous event notification software library.The libevent API provides a mechanism to execute a callback function when a specific event occurs on a file descriptor or after a timeout has been reached. Furthermore, libevent also support… …   Wikipedia

  • Internet socket — In computer networking, an Internet socket or network socket is an endpoint of a bidirectional inter process communication flow across an Internet Protocol based computer network, such as the Internet. The term Internet sockets is also used as a… …   Wikipedia


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»