stringtranslate.com

epoll

epolles 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

epolles 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. epollutiliza 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 epollobjeto y devuelve su descriptor de archivo. El flagspará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. oppuede 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 maxeventsa la vez. maxeventses el número máximo de epoll_eventdescriptores de /archivo que se supervisarán. [5] [6] En la mayoría de los casos, maxeventsse establece en el valor del tamaño del *eventsargumento ( struct epoll_event *eventsmatriz).

Modos de disparo

epollproporciona modos activados por flanco y activados por nivel . En el modo activado por flanco, una llamada a epoll_waitregresará solo cuando se ponga en cola un nuevo evento con el epollobjeto, mientras que en el modo activado por nivel, epoll_waitregresará mientras se mantenga la condición.

Por ejemplo, si una tubería registrada epollha 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_waitregresarán inmediatamente, siempre que el búfer de la canalización contenga datos para leer. Sin embargo, en el modo activado por flanco, epoll_waitvolverá solo una vez que se escriban datos nuevos en la tubería. [1]

Crítica

Bryan Cantrill señaló que epolltení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 EPOLLONESHOTy EPOLLEXCLUSIVEopciones. EPOLLONESHOTse agregó en la versión 2.6.2 de la línea principal del kernel de Linux, lanzada en febrero de 2004. EPOLLEXCLUSIVEse agregó en la versión 4.5, lanzada en marzo de 2016. [8]

Ver también

Referencias

  1. ^ ab "epoll(7) - página del manual de Linux". Man7.org. 2012-04-17 . Consultado el 1 de marzo de 2014 .
  2. ^ Oleksiy Kovyrin (13 de abril de 2006). "Uso de epoll() para programación de redes asincrónicas". Kovyrin.net . Consultado el 1 de marzo de 2014 .
  3. ^ "La implementación de epoll (1)". idndx.com . Septiembre de 2014.
  4. ^ Con amor, Robert (2013). Programación del sistema Linux (Segunda ed.). O'Reilly. págs.97, 98. ISBN 978-1-449-33953-1.
  5. ^ "epoll_wait: maxevents". 3 de junio de 2010 . Consultado el 6 de julio de 2023 .
  6. ^ "epoll_wait(2) - Página del manual de Linux". 2023-03-30 . Consultado el 6 de julio de 2023 .
  7. ^ Archivado en Ghostarchive y Wayback Machine: "Ubuntu Slaughters Kittens | BSD Now 103". YouTube .
  8. ^ "Epoll está fundamentalmente roto a la mitad". idea.popcount.org. 2017-02-20 . Consultado el 6 de octubre de 2017 .

enlaces externos