Análisis de comparación select /poll /epoll

  
 

select /poll /epoll es un mecanismo de multiplexación IO que puede monitorear múltiples descriptores al mismo tiempo. Cuando un descriptor está listo (listo para lectura o escritura), el programa correspondiente es notificado inmediatamente para leer o escribir. Esencialmente, seleccionar /poll /epoll es I /O síncrono, es decir, la lectura y la escritura están bloqueadas.
One, seleccione

Prototipo:
int select (int n, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout);

Clases de Monitor 3 desde la función de selección Descriptores de archivo: writefds, readfds, exceptfds. Llamar a los bloques de función de selección hasta que el descriptor esté listo (los datos son legibles, se pueden escribir o se produce una excepción) o se agota el tiempo de espera, y la función regresa. Cuando la función de selección regresa, puede encontrar el descriptor listo atravesando el conjunto de descriptores.

seleccionar desventajas

  • El número máximo de descriptores de archivos que un solo proceso puede monitorear es de 1024 en Linux. Puede aumentar el límite superior modificando la definición de la macro, pero también existe. La ineficiencia es débil;
  • Eficiencia de IO A medida que aumenta el número de descriptores monitoreados, su eficiencia también disminuye linealmente.

    2, encuesta

    Prototipo:
    Int poll (struct pollfd * fds, unsigned int nfds, int timeout);

    donde pollfd representa el conjunto de descriptores monitoreados, tal como sigue: struct pollfd {int fd; //descriptores de archivo eventos cortos; //monitoreado El evento de solicitud es breve reventos; //el evento ha ocurrido}; la estructura de

    pollfd contiene el evento que se monitoreará y el evento que ocurrió, y no hay un límite máximo en el pollfd (pero un número demasiado grande también causará una caída en el rendimiento). Al igual que con la función de selección, cuando la función de sondeo regresa, puede encontrar el descriptor listo atravesando el conjunto de descriptores.

    De lo anterior, tanto la selección como la encuesta necesitan recuperar el socket listo atravesando el descriptor de archivo después de regresar. De hecho, un gran número de clientes conectados al mismo tiempo pueden tener solo unos pocos estados listos a la vez, por lo que a medida que aumenta el número de descriptores monitoreados, su eficiencia disminuye linealmente.
    Three, epoll

    epoll se propone en el kernel 2.6, es una versión mejorada de select y poll. En comparación con la selección y la encuesta, epoll es más flexible y no tiene límite de descriptores. Epoll usa un descriptor de archivo para administrar múltiples descriptores, almacenando eventos en los descriptores de archivo del espacio de usuario en una tabla de eventos en el kernel, de modo que la copia en el espacio de usuario y el espacio del kernel solo se requiere una vez. El mecanismo de epoll es el mecanismo de multiplexación de E /S más eficiente de Linux, a la espera de eventos de E /S para múltiples manejadores de archivos en un solo lugar.

    Select /poll tiene solo un método, y epoll tiene tres métodos, epoll_create (), epoll_ctl () y epoll_wait ().
    3.1 epoll_create ()
    int epoll_create (tamaño int);

    se utiliza para crear un controlador para epoll, el tamaño se refiere al número de descriptores para escuchar. Ahora el núcleo es compatible con la expansión dinámica, el significado de este valor es único La cantidad de fd asignados por primera vez se expandirá dinámicamente cuando no haya suficiente espacio. Después de crear el controlador epoll, toma un valor fd.
    ls /proc /< pid > /fd ///Puede ejecutarse desde el terminal. Después de ver fd

    después de usar epoll, debe llamar a close (). Apague, de lo contrario puede causar que fd se agote.
    3.2 epoll_ctl ()
    int epoll_ctl (int epfd, int op, int fd, struct epoll_event * event);

    se utiliza para realizar operaciones op en los descriptores de archivo (fd) que deben escucharse, como fd Añadir al mango epoll.

  • dfpe: es el valor de retorno de epoll_create ();
  • op: indica la operación op, representada por tres macros, que representan agregar, eliminar y modificar el evento de escucha a fd.;
  • EPOLL_CTL_ADD (aDD)
  • EPOLL_CTL_DEL (suprimido)
  • EPOLL_CTL_MOD (modificado)
  • fd: descripción del archivo tiene que escuchar
  • epoll_event: el evento que se escuchará, la estructura epoll_event está estructurado de la siguiente manera:
    struct epoll_event {__uint32_t events; /* Epoll event * /epoll_data_t data; /* usuario disponible * *};

    eventos pueden indicar correspondiente valor de descriptor de archivo :( operación)

  • EPOLLIN: leer (incluyendo SOCKET pares normalmente cerrado);
  • EPOLLOUT: escribible;
  • EPOLLERR: Error;
  • EPOLLHUP: Interrumpir;
  • EPOLLPRI: legibilidad de alta prioridad (aquí debe indicar la presencia de datos fuera de banda);
    < Li> EPOLLET: establece EPOLL en el modo de disparo por flanco, esto es fase En términos del nivel de disparo.
  • EPOLLONESHOT: escuchar sólo un incidente, cuando haya terminado de escuchar este incidente ya no va a escuchar a este evento
    3.3 epoll_wait ()
    int epoll_wait (int dfpe , struct epoll_event * events, int maxevents, int timeout);
  • epfd: espere a que io events en epfd, devuelva maxevents events;
  • events: colecciones utilizadas para obtener eventos del núcleo;
  • maxevents: events, el valor de maxevents no puede ser mayor que el tamaño al crear epoll_create ();
  • timeout: timeout (milisegundos, 0 volverá inmediatamente).

    Esta función devuelve el número de eventos que deben procesarse. Si se devuelve 0, se ha agotado el tiempo de espera.
    4. Contraste

    En select /poll, el proceso solo escanea todos los descriptores de archivos monitoreados después de llamar a un determinado método, y epoll registra un archivo con epoll_ctl () por adelantado. Descriptor, una vez que el descriptor de archivo está listo, el kernel utilizará un mecanismo de devolución de llamada similar a la devolución de llamada para activar rápidamente el descriptor de archivo y recibir una notificación cuando el proceso llame a epoll_wait ().
    (La descripción del descriptor de archivo se elimina aquí, pero al escuchar el mecanismo de la devolución de llamada. Este es el encanto de epoll.)

    ventaja de epoll

    1. Monitoreo El número de descriptores no está limitado. El límite FD admitido es el número máximo de archivos abiertos. El número específico puede verse por cat /proc /sys /fs /file-max. En general, este número tiene una gran relación con la memoria del sistema. Este valor para teléfonos móviles es 200,000-300,000.

    2. La eficiencia IO no aumenta con el número de disminución de la vigilancia fd. Epoll es diferente de la forma de sondeo y de sondeo, pero se implementa mediante la función de devolución de llamada definida por cada fd. Solo el fd listo ejecutará la función de devolución de llamada.

      Si no lo hace un montón de inactividad de la conexión o muerto-conexión, epoll y ratio de eficiencia no selecciona /sondeo mucho más alto, pero cuando se enfrentan a un gran número de inactividad de la conexión, se encuentra Epoll es mucho más eficiente que seleccionar /sondear.

  • Copyright © Conocimiento de Windows All Rights Reserved