Linux epoll utilizar tutorial básico

  
 

En la programación de red de Linux, la selección se utiliza para la activación de eventos durante mucho tiempo. En el nuevo kernel de linux, hay un mecanismo para reemplazarlo, que es epoll. En comparación con la selección, el mayor beneficio de epoll es que no reduce la eficiencia a medida que aumenta el número de fds de escucha. Debido a que en la implementación selecta en el kernel, se maneja por sondeo, cuanto mayor es el número de fd sondeados, más tiempo lleva. Además, el archivo de encabezado /usr/include/linux/posix_pospes.h tiene tal declaración: #define __FD_SETSIZE 1024 significa que select puede escuchar hasta 1024 fd al mismo tiempo. Por supuesto, puede expandir este número modificando el archivo de encabezado y recompilando el kernel, pero Esto no parece ser una cura.

La interfaz de epoll es muy simple. Existen tres funciones: 1. int epoll_create (tamaño int); Crear un controlador epoll, el tamaño se usa para decirle al núcleo qué monitores hay. Este parámetro es diferente del primer parámetro en select () y da el valor de fd + 1 para el oyente más grande. Debe tenerse en cuenta que cuando se cree el controlador de epoll, ocupará un valor fd. Si ve /proc /process id /fd /under linux, puede ver este fd, por lo que después de usar epoll, debe Llamar a close () para cerrar, de lo contrario puede causar que fd se agote.

2. int epoll_ctl (int epfd, int op, int fd, struct epoll_event * event); función de registro de eventos epoll, que difiere de select () en decirle al kernel qué tipo de oyente escuchar cuando escucha eventos Evento, pero aquí para registrar el tipo de evento a ser escuchado. El primer parámetro es el valor de retorno de epoll_create (), el segundo parámetro representa la acción, que está representada por tres macros: EPOLL_CTL_ADD: registrar nueva fd en dfpe; EPOLL_CTL_MOD: modificar el evento de escucha de fd registrado; EPOLL_CTL_DEL: desde Epfd borra un fd; el tercer parámetro es el fd que se escucha, el cuarto parámetro le dice al kernel qué escuchar, la estructura de la estructura epoll_event es la siguiente: struct epoll_event {__uint32_t events; /* Epoll events * /epoll_data_t data; /* La variable de datos de usuario * /};

los eventos pueden ser una colección de las siguientes macros: EPOLLIN: indica que el descriptor de archivo correspondiente se puede leer (incluido el par SOCKET normalmente está cerrado); EPOLLOUT: indica el descriptor de archivo correspondiente Puede escribirse; EPOLLPRI: indica que el descriptor de archivo correspondiente tiene datos legibles urgentes (en este caso, debe indicar que se aproximan datos fuera de banda); EPOLLERR: indica que el descriptor de archivo correspondiente tiene un error; EPOLLHUP: indica que el descriptor de archivo correspondiente está bloqueado; EPOLLET: establece EPOLL en modo de disparo por flanco, que está relacionado con el nivel de disparo.EPOLLONESHOT: solo escucha un evento. Después de escuchar este evento, si necesitas seguir escuchando este socket, debes agregar este socket a la cola EPOLL nuevamente.

3. int epoll_wait (int epfd, struct epoll_event * eventos, int maxevents, int timeout); espere a que se generen los eventos, similar a la llamada select (). Los parámetros eventos se usan para obtener la colección de eventos del kernel. Maxevents le dice al kernel qué tan grandes son los eventos. El valor de maxevents no puede ser más grande que el tamaño al crear epoll_create (). El tiempo de espera es el tiempo de espera (milisegundos, 0 regresará de inmediato, -1 No estoy seguro, también hay dichos que está permanentemente bloqueado). Esta función devuelve el número de eventos que deben procesarse, como devolver 0 para indicar que se ha agotado el tiempo.

---------------------------------------------- ------------------------------------------------

En el manual de manual, obtenga una descripción detallada de ET y LT de la siguiente manera.

El evento EPOLL tiene dos modelos: Disparo de borde (ET) Activado por nivel (LT)

Si existe tal Ejemplo: 1. Hemos agregado un identificador de archivo (RFD) para leer los datos de la tubería al descriptor de epoll. 2. En este punto, se escriben 2 KB de datos desde el otro extremo de la tubería. 3. Llame a epoll_wait (2) Y devolverá RFD, lo que indica que está listo para leer la operación 4. Luego leemos 1 KB de datos 5. Llame a epoll_wait (2) ...

Modo de funcionamiento de disparo por flanco: Usamos el indicador EPOLLET cuando agregamos el RFD al descriptor de epoll en el paso 1. Después de llamar a epoll_wait (2) en el paso 5, probablemente se bloquee porque los datos restantes aún existen en el búfer de entrada del archivo. Y el originador de datos todavía está esperando un mensaje de retroalimentación para los datos que se han enviado. El modo de trabajo ET reporta el evento solo cuando ocurre un evento en el identificador de archivo monitoreado. Por lo tanto, en el paso 5, la persona que llama puede dejar de esperar los datos restantes que aún se encuentran en el búfer de entrada de archivos. En el ejemplo anterior, se genera un evento en el controlador RFD porque se realizó una operación de escritura en el paso 2, y luego el evento se destruirá en el paso 3. Debido a que la operación de lectura en el paso 4 no lee los datos en el búfer de entrada de archivo vacío, no está definido si suspendemos después de llamar a epoll_wait (2) en el paso 5. Cuando epoll funciona en modo ET, debe usar un zócalo no bloqueante para evitar la inanición de la tarea de procesar múltiples descriptores de archivo debido a una operación de escritura de bloque /lectura bloqueada de un identificador de archivo. Es mejor llamar a la interfaz epoll del modo ET de la siguiente manera, que se describirá más adelante para evitar posibles defectos. i basado en el identificador de archivo no bloqueante ii solo debe bloquearse cuando read (2) o write (2) devuelve EAGAIN, esperando. Pero esto no quiere decir que cada lectura () deba leerse cíclicamente, hasta que se lea que se genera un EAGAIN y se completa el procesamiento del evento. Cuando la longitud de datos de lectura devuelta por read () es menor que la longitud de datos solicitada, Asegúrese de que no hay datos en el búfer en este momento, y puede pensar que el evento se ha procesado.

Level Triggered funciona a la inversa. Al llamar a la interfaz de epoll en el modo LT, es equivalente a un sondeo más rápido (2), y tienen la misma sin importar si los datos se usan más adelante. Funcion Porque incluso si usa epoll en el modo ET, se generarán múltiples eventos cuando se reciban múltiples fragmentos de datos. La persona que llama puede establecer el indicador EPOLLONESHOT, que está deshabilitado en el descriptor de epoll después de que epoll_wait (2) reciba el evento. Por lo tanto, cuando se establece EPOLLONESHOT, el procesamiento del identificador de archivos utilizando epoll_ctl (2) con el indicador EPOLL_CTL_MOD se convierte en algo que debe hacer el llamante.

Luego explique ET en detalle, LT:

LT (nivel disparado) es el modo de trabajo predeterminado, y es compatible con zócalos de bloque y sin bloque. De esta manera, el kernel le informa Un descriptor de archivos está listo, entonces puede realizar operaciones de E /S en este fd listo. Si no hace nada, el kernel continuará notificándole, por lo que es menos probable que este modo esté programado. La selección /encuesta tradicional es representativa de este modelo.

ET (de activación por flanco) es un modo de operación de alta velocidad que solo admite tomas sin bloqueo. En este modo, el kernel le dice a través de epoll cuando el descriptor nunca ha estado listo para estar listo. Luego, se supone que sabe que el descriptor de archivos está listo y que no enviará más notificaciones listas para ese descriptor de archivos hasta que haga algo que haga que el descriptor de archivos ya no esté listo (por ejemplo, Un error EWOULDBLOCK se produce cuando se envía, recibe o recibe una solicitud, o cuando se envía y recibe menos de cierta cantidad de datos. Sin embargo, tenga en cuenta que si no realiza operaciones de E /S en este fd (para que no esté listo de nuevo), el kernel no enviará más notificaciones (solo una vez), pero en el protocolo TCP, la utilidad de aceleración del modo ET aún debe ser más Más confirmación de referencia (esta frase no entiende).

Copyright © Conocimiento de Windows All Rights Reserved