encuesta

Seleccionar, sondear y epoll son todos métodos de reutilización de IO proporcionados por la API de Linux.

En comparación con la tecnología multiproceso y multiproceso, la mayor ventaja de la tecnología de multiplexación de E/S es que la sobrecarga del sistema es pequeña y el sistema no tiene que crear procesos/subprocesos ni mantener estos procesos/. subprocesos, lo que reduce en gran medida Reducir la sobrecarga del sistema.

Analicemos primero la función select

int select(int maxfdp1,fd_set *readset,fd_set *writeset,fd_set *exceptset,const struct timeval *timeout); p> Descripción del parámetro

int maxfdp1 especifica el número de descriptores de archivo que se probarán y su valor es el descriptor máximo que se probará más 1.

fd_set *readset, fd_set *writeset, fd_set *exceptset

fd_set puede entenderse como una colección que almacena descriptores de archivos (descriptores de archivos), es decir, identificadores de archivos. Los tres parámetros del medio especifican el conjunto de descriptores de archivos que queremos que el kernel pruebe en condiciones de lectura, escritura y excepción. Si no está interesado en una determinada condición, puede configurarla como un puntero nulo.

const struct timeval *timeout timeout le dice al kernel cuánto tiempo puede esperar para que cualquiera de los conjuntos de descriptores de archivos especificados esté listo. Su estructura de valor de tiempo se utiliza para especificar la cantidad de segundos y microsegundos durante este período.

Valor de retorno

int Si hay un descriptor listo, devuelve su número, 0 si se agota el tiempo de espera, -1 si hay un error

Mecanismo de select() Proporciona una estructura de datos de fd_set, que en realidad es una matriz de tipo largo. Cada elemento de la matriz se puede asociar con un identificador de archivo abierto (ya sea un identificador de Socket, otro archivo o una tubería con nombre o un identificador de dispositivo) y establece. El programador completa el trabajo de contacto. Cuando se llama a select(), el kernel modifica el contenido de fd_set de acuerdo con el estado de IO, notificando así al proceso que ejecutó select() qué Socket o archivo es legible.

Desde una perspectiva de proceso, no hay mucha diferencia entre usar la función de selección para solicitudes de IO y el modelo de bloqueo sincrónico. Incluso hay operaciones adicionales para agregar un socket de monitoreo y llamar a la función de selección, lo que hace que el proceso sea más fácil. la eficiencia es aún peor. Sin embargo, la mayor ventaja de usar select es que los usuarios pueden procesar múltiples solicitudes de E/S de socket simultáneamente en un hilo. Los usuarios pueden registrar múltiples sockets y luego llamar continuamente a select para leer los sockets activados para lograr el propósito de procesar múltiples solicitudes de IO simultáneamente en el mismo hilo. En el modelo de bloqueo síncrono, este propósito debe lograrse mediante subprocesos múltiples.

El mecanismo de la encuesta es similar al de selección. No es muy diferente de la selección. También realiza una encuesta para administrar múltiples descriptores y los procesa de acuerdo con el estado del descriptor. un límite de número máximo de descriptores de archivos. En otras palabras, la encuesta solo resuelve el problema 3 anterior y no resuelve la sobrecarga de rendimiento de los problemas 1 y 2.

El siguiente es el prototipo de función de pll:

poll cambia la forma en que se describe el conjunto de descriptores de archivos, utilizando la estructura pollfd en lugar de la estructura fd_set de select, de modo que el archivo descriptores admitidos por poll El límite de recopilación es mucho mayor que los 1024 de select

Descripción del parámetro

struct pollfd *fds fds es una matriz de tipo struct pollfd, que se utiliza para almacenar el descriptor de socket cuyo estado necesita ser detectado y llamar La matriz fds no se borrará después de la función de encuesta; una estructura pollfd representa un descriptor de archivo monitoreado, y se le indica a poll () que supervise varios descriptores de archivo pasando fds. Entre ellos, el campo de eventos de la estructura es la máscara de evento para monitorear el descriptor de archivo. Este campo lo establece el usuario. El campo de eventos de la estructura es la máscara de evento del resultado de la operación del descriptor de archivo. campo cuando la llamada regresa

nfds_t nfds registra el número total de descriptores en la matriz fds

Valor de retorno

La función int devuelve listo para lectura, escritura o error descriptores en la colección fds Cantidad, devolver 0 significa tiempo de espera, devolver -1 significa error;

epoll se propuso oficialmente en el kernel de Linux 2.6 y se basa en E/S controlada por eventos. En comparación con select, epoll. no tiene límite de número de descriptores, use un descriptor de archivo para administrar múltiples descriptores y almacene los eventos del descriptor de archivo que le interesan al usuario en una tabla de eventos del kernel, de modo que la copia en el espacio del usuario y en el espacio del kernel solo sea necesario. hacerse una vez.

Las funciones relacionadas con epoll proporcionadas en Linux son las siguientes:

1. La función epoll_create crea un identificador de epoll y el tamaño del parámetro indica la cantidad de descriptores que el núcleo debe monitorear. . Se devuelve un descriptor de identificador de epoll cuando la llamada es exitosa y -1 cuando falla.

2. La función epoll_ctl registra el tipo de evento a monitorear. Los cuatro parámetros se explican a continuación:

La estructura epoll_event se define de la siguiente manera:

3. La función epoll_wait espera a que el evento esté listo. Si tiene éxito, devuelve el. número de eventos listos Si la llamada falla, devuelve -1. El tiempo de espera devuelve 0.

epoll es una encuesta mejorada realizada por el kernel de Linux para manejar grandes lotes de descriptores de archivos. Es una versión mejorada de la interfaz IO multiplexada select/poll en Linux. Puede mejorar significativamente el rendimiento del programa. en una gran cantidad de conexiones simultáneas. Utilización de la CPU del sistema cuando solo hay una pequeña cantidad de actividad. La razón es que al adquirir eventos, no es necesario atravesar todo el conjunto de descriptores que se están escuchando, solo necesita atravesar el conjunto de descriptores que los eventos de E/S del kernel despiertan asincrónicamente y se agregan a la cola Listo.

Además de proporcionar activación por nivel (Level Triggered) de eventos IO como select/poll, epoll también proporciona activación por borde (Edge Triggered), lo que hace posible que los programas de espacio de usuario almacenen en caché el estado de IO y reduzcan epoll_wait /epoll_pwait llamada para mejorar la eficiencia de la aplicación.

Originalmente se suponía que LT y ET se usarían para señales de pulso y pueden usarse para explicarlas de manera más vívida. Nivel y Borde se refieren al punto de activación El nivel se activa siempre que sea horizontal, mientras que Borde se activa en los flancos ascendentes y descendentes. Por ejemplo: 0->1 es Borde, 1->1 es Nivel.

El modo ET reduce en gran medida el número de activaciones del evento epoll, por lo que la eficiencia es mayor que la del modo LT.

Una imagen resume las diferencias entre select, poll y epoll:

epoll es actualmente el modelo preferido para el desarrollo de programas concurrentes en red a gran escala en Linux. En la mayoría de los casos, el rendimiento supera con creces el de seleccionar y sondear.

El actualmente popular servidor web de alto rendimiento Nginx confía oficialmente en el eficiente servicio de sondeo de sockets de red proporcionado por epoll. Sin embargo, cuando las conexiones simultáneas no son altas, el método de E/S de bloqueo y subprocesos múltiples puede funcionar mejor.

Dado que select, poll y epoll son implementaciones específicas de multiplexación de E/S, la razón por la que existen al mismo tiempo es que en realidad son productos de diferentes períodos históricos.