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.45 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 al sistema y POSIX 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 ), opera en O ( 1) tiempo [2] ). select(2)
poll(2)
epoll
epoll
es similar al de FreeBSD ,kqueue
en el sentido de que consta de un conjunto de funciones de espacio de usuario , cada una de las cuales toma un argumento descriptor de archivo que denota el objeto del núcleo configurable, contra el cual 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]
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. Tiene un solo valor válido, EPOLL_CLOEXEC
. epoll_create()
es una variante anterior epoll_create1()
y está en desuso 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 * evento );
Controla (configura) qué descriptores de archivos son supervisados por este objeto y para qué eventos. op
puede ser AÑADIR, MODIFICAR o ELIMINAR.
int epoll_wait ( int epfd , struct epoll_event * eventos , int maxevents , int timeout );
Espera cualquiera de los eventos registrados con epoll_ctl
, hasta que ocurra al menos uno o transcurra el tiempo de espera. Devuelve los eventos ocurridos en events
, hasta maxevents
a la vez. maxevents
es el número máximo de epoll_event
descriptores de /archivo que se supervisarán. [5] [6] En la mayoría de los casos, maxevents
se establece en el valor del tamaño del *events
argumento ( struct epoll_event *events
matriz).
epoll
proporciona modos activados por flanco y activados por nivel . En el modo activado por flanco, una llamada a epoll_wait
regresará solo cuando se ponga en cola un nuevo evento con el epoll
objeto, mientras que en el modo activado por nivel, epoll_wait
regresará mientras se mantenga la condición.
Por ejemplo, si una tubería registrada epoll
ha recibido datos, se devolverá una llamada epoll_wait
, lo que indicará 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, las llamadas adicionales a epoll_wait
regresarán inmediatamente, siempre que el búfer de la canalización contenga datos para leer. Sin embargo, en el modo activado por flanco, epoll_wait
volverá solo una vez que se escriban datos nuevos en la tubería. [1]
Bryan Cantrill señaló que epoll
tení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 . [7] Sin embargo, gran parte de sus críticas fueron abordadas 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. [8]