epoll
es una llamada al sistema del kernel de Linux para un mecanismo de notificación de eventos de E / S escalable, introducido por primera vez en la versión 2.5.44 del kernel de Linux . [1] Su función es monitorear múltiples descriptores de archivos para ver si la E / S es posible en alguno de ellos. Está destinado a reemplazar las llamadas POSIX y al sistema más antiguas , para lograr un mejor rendimiento en aplicaciones más exigentes, donde la cantidad de descriptores de archivos observados es grande (a diferencia de las llamadas al sistema más antiguas, que operan en tiempo O ( n ), operan en O ( 1) tiempo [2] ). select(2)
poll(2)
epoll
epoll
es similar a FreeBSD 's kqueue
, porque se compone de un conjunto de espacio de usuario funciones, cada uno teniendo un descriptor de archivo argumento que denota el objeto de núcleo configurable, contra el que operan cooperativamente. epoll
utiliza una estructura de datos de árbol rojo-negro ( árbol RB) para realizar un seguimiento de todos los descriptores de archivos que se están monitoreando actualmente. [3]
API
int epoll_create1 ( int banderas );
Crea un epoll
objeto y devuelve su descriptor de archivo. El flags
parámetro permite modificar el comportamiento de epoll. Sólo tiene un valor válido, EPOLL_CLOEXEC
. epoll_create()
es una variante anterior epoll_create1()
y está obsoleta a partir de la versión 2.6.27 del kernel de Linux y la versión 2.9 de glibc. [4]
int epoll_ctl ( int epfd , int op , int fd , struct epoll_event * event );
Controla (configura) qué descriptores de archivo son observados por este objeto y para qué eventos. op
puede ser AÑADIR, MODIFICAR o BORRAR.
int epoll_wait ( int epfd , struct epoll_event * events , int maxevents , int timeout );
Espera cualquiera de los eventos registrados con epoll_ctl
, hasta que se produzca al menos uno o transcurra el tiempo de espera. Devuelve los eventos ocurridos en events
, hasta a la maxevents
vez.
Modos de disparo
epoll
proporciona tanto por flancos y disparado por nivel modos. En el modo de activación por flanco, una llamada a epoll_wait
volverá solo cuando un nuevo evento se ponga en cola con el epoll
objeto, mientras que en el modo de activación por nivel, epoll_wait
volverá mientras se mantenga la condición.
Por ejemplo, si una tubería registrada con epoll
ha recibido datos, epoll_wait
se devolverá una llamada a , indicando la presencia de datos para leer. Supongamos que el lector solo consumió parte de los datos del búfer. En el modo activado por nivel, más llamadas a epoll_wait
regresarán inmediatamente, siempre que el búfer de la tubería contenga datos para leer. Sin embargo, en el modo de activación por flanco, epoll_wait
solo regresará una vez que se escriban nuevos datos en la tubería.
Crítica
Bryan Cantrill señaló que epoll
había errores que podrían haberse evitado si hubiera aprendido de sus predecesores: puertos de finalización de entrada / salida , puertos de eventos (Solaris) y kqueue . [5] Sin embargo, una gran parte de su crítica fue dirigida por epoll
's EPOLLONESHOT
y EPOLLEXCLUSIVE
opciones. EPOLLONESHOT
se agregó en la versión 2.6.2 de la línea principal del kernel de Linux, lanzada en febrero de 2004. EPOLLEXCLUSIVE
Se agregó en la versión 4.5, lanzada en marzo de 2016. [6]
Ver también
Referencias
- ^ "epoll (7) - página de manual de Linux" . Man7.org. 2012-04-17 . Consultado el 1 de marzo de 2014 .
- ^ Oleksiy Kovyrin (13 de abril de 2006). "Uso de epoll () para la programación de red asincrónica" . Kovyrin.net . Consultado el 1 de marzo de 2014 .
- ^ https://idndx.com/2014/09/01/the-implementation-of-epoll-1/
- ^ Con amor, Robert (2013). Programación del sistema Linux (Segunda ed.). O'Reilly. págs. 97, 98. ISBN 978-1-449-33953-1.
- ^ https://www.youtube.com/watch?v=l6XQUciI-Sc&t=57m
- ^ "Epoll está fundamentalmente roto 1/2" . idea.popcount.org. 2017-02-20 . Consultado el 6 de octubre de 2017 .
enlaces externos
- página de manual de epoll
- parche de epoll