Seleccionar programación de red
Entrada y salida con bloqueo
Entrada y salida sin bloqueo
I /O Multiplexación (selección y sondeo)
Entrada y salida controlada por señal (SIGIO)
E/S asíncrona (función POSIX AIO): la característica más importante del modelo IO asíncrono es que enviar notificación de vuelta cuando se complete.
El bloqueo o no depende de cómo se implemente la conmutación IO.
El bloqueo asincrónico se basa en la selección y la implementación de la función de selección en sí es el bloqueo. La ventaja de utilizar la función de selección es que se pueden monitorear varios identificadores de archivos al mismo tiempo.
Notificar directamente después de la finalización asincrónica sin bloqueo. El proceso de usuario solo necesita iniciar una operación IO y luego regresar inmediatamente. Una vez que la operación IO se haya completado realmente, se notificará a la aplicación que se completó la operación IO. En este momento, el proceso del usuario solo necesita procesar datos y no necesita realizar operaciones reales de lectura y escritura de IO, porque el kernel ha completado las operaciones reales de lectura y escritura de IO.
1 Bloqueo de E/S
No es necesario explicar esto, bloqueando el socket. La siguiente figura es una ilustración de su proceso de llamada:
Concéntrese en la explicación de la figura anterior y se mencionarán los siguientes ejemplos. Primero, la aplicación llama a recvfrom() para ingresar al kernel. Tenga en cuenta que el kernel tiene dos procesos: esperar datos y copiar datos del kernel al usuario. Recvfrom() no regresa hasta que se completa la última copia. Este proceso ha sido bloqueado.
2 E/S sin bloqueo:
A diferencia de las E/S con bloqueo, el diagrama del proceso de llamada del socket sin bloqueo es el siguiente:
Como dijiste Mira, si lo manipulas directamente, es una encuesta. . Hasta que el búfer del kernel tenga datos.
Multiplexación de 3 E/S (selección y sondeo)
El modelo de reutilización de E/S más común, seleccione.
Selecciona el bloque primero y regresa solo si hay un socket activo. En comparación con el bloqueo de E/S, select tiene dos llamadas al sistema, pero select puede manejar múltiples sockets.
4 Entrada/Salida impulsada por señal (SIGIO)
Solo compatible con sistemas UNIX, los cursos interesados pueden consultar los materiales relevantes.
En comparación con la multiplexación de E/S (selección y sondeo), su ventaja es que elimina el bloqueo y el sondeo de selección. Cuando hay un socket activo, es manejado por el controlador registrado.
5 E/S asíncronas (funciones POSIX AIO _)
Casi no hay soporte para el sistema *nix y el IOCP de Windows es este modo.
Mecanismo de multiplexación de E/S totalmente asíncrono, porque al observar los otros cuatro modelos anteriores, al menos el kernel lo bloqueará al copiar datos a la aplicación. Sin embargo, el modelo solo notifica a la aplicación después de que se completa la copia, lo que indica que es puramente asincrónico. Parece que solo el puerto de finalización de Windows está en este modo y la eficiencia también es muy buena.
La siguiente es una comparación de los cinco modelos anteriores.
Se puede observar que cuanto más atrás, menos congestión y la eficiencia teórica es óptima.
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
Los cinco modelos son relativamente claros. Lo único que queda es colocar Select, EPOLL, IOCP y KQueue según el número.
Select e iocp corresponden al tercer y quinto modelo respectivamente. ¿Qué pasa con epoll y kqueue? De hecho, select pertenece al mismo modelo, pero es más avanzado. Se puede considerar que tiene algunas características del cuarto modelo, como el mecanismo de devolución de llamada.
¿Por qué epoll y kqueue son más avanzados que select?
La respuesta es que no están realizando encuestas. Porque en su lugar utilizaron devoluciones de llamada.
Piénselo, cuando hay muchos sockets, cada vez que selecciona (), debe atravesar el socket FD_SETSIZE para completar la programación. No importa qué socket esté activo, debe atravesarse. Esto desperdicia mucho tiempo de CPU. Puede evitar el sondeo si puede registrar una función de devolución de llamada para el socket y hacerlo automáticamente cuando están activos, que es lo que hacen epoll y kqueue.
¿Windows o *nix (IOCP o kqueue/epoll)?
Es cierto que el IOCP de Windows es excelente y actualmente hay muy pocos sistemas que admitan E/S asíncronas, sin embargo, debido a las limitaciones de su propio sistema, los servidores grandes todavía están bajo UNIX. Y como se mencionó anteriormente, en comparación con IOCP, kqueue/epoll es solo otra capa de barrera para copiar datos del kernel a la capa de aplicación y no puede considerarse como una clase de E/S asincrónica. Pero esta pequeña pieza es insignificante, kqueue y epoll han hecho un buen trabajo.
Proporcione interfaces consistentes y patrones de diseño IO.
De hecho, no importa qué modelo sea, se puede abstraer para proporcionar una interfaz consistente, como ace y Libevent (basado en el modo reactor), que son multiplataforma y seleccionan automáticamente el óptimo. Mecanismo de reutilización de E/S, los usuarios solo necesitan llamar a la interfaz. Hablando de eso, debo mencionar dos patrones de diseño, Reactor y Proactor. Ver: Modo Reactor versus Modo Pre-Reactor. Libevent es el modelo Reactor y ACE proporciona el modelo Proactor. De hecho, es una encapsulación de varios mecanismos de multiplexación de E/S.
¿Cuál es el mecanismo de E/S del paquete Java nio?
Ahora se puede determinar que la esencia del Java actual es el modelo select(), que se puede encontrar consultando /jre/bin/nio.dll en cuanto a por qué el servidor Java es altamente eficiente. . No lo sé, tal vez mejor diseño. . -_-.
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
Para resumir algunos puntos clave:
Solo IOCP es E/S asíncrona, y otros mecanismos están más o menos bloqueados.
Select es ineficiente porque requiere un sondeo cada vez. Pero la ineficiencia es relativa, depende de la situación y también puede mejorarse mediante un buen diseño.
Epoll, kqueue y select son modos Reacor, e IOCP es el modo Proactor.
El paquete Java nio es un modelo de elección. .
(2) La diferencia entre epoll y select
1. Utilice multiproceso o multiproceso, pero este método hará que el programa sea muy complicado y también difícil. Crear y mantener procesos y subprocesos requiere mucha sobrecarga. (El servidor Apache es un proceso secundario, que tiene la ventaja de aislar a los usuarios) (bloqueo de E/S sincrónico)
2. Un método mejor es la multiplexación de E/S (esto también parece traducir la multiplexación). Primero construya una lista de descriptores (cola en epoll) y luego llame a una función que no regresará hasta que uno de estos descriptores esté listo. Cuando regrese, le indicará al proceso qué E/S está lista. Select y epoll son soluciones para mecanismos de E/S multicanal. select está en el estándar POSIX, mientras que epoll es exclusivo de Linux.
Hay tres diferencias principales (epoll es mejor que select):
1.select tiene un número limitado de identificadores, que se declaran en el archivo de encabezado linux/posix_types.h: # define _fd _setsize 1024 significa que select puede monitorear hasta 1024 fds al mismo tiempo. Epoll no lo hace, su límite es el número máximo de identificadores de archivos abiertos.
2. La mayor ventaja de epoll es que la eficiencia no disminuirá a medida que aumente el número de FD. El procesamiento de sondeo se utiliza en selec y la estructura de datos es similar a una matriz, mientras que EPOLL mantiene una cola y solo verifica si la cola está vacía. Epoll solo funcionará en sockets "activos"; esto se debe a que en la implementación del kernel, epoll se implementa en función de funciones de devolución de llamada en cada fd. Entonces, solo el socket "activo" llamará activamente a la función de devolución de llamada (agregue este identificador a la cola), pero otros identificadores de estado inactivo no lo harán. Hasta ahora, epoll ha implementado una "pseudo" AIO. Pero si la mayor parte de las E/S están "activas" y la tasa de utilización de cada puerto de E/S es alta, entonces epoll no es necesariamente más eficiente que select (mantener la cola puede ser más complicado).
3. Utilice mmap para acelerar la transmisión de mensajes entre el kernel y el espacio del usuario. Ya sea select, poll o epoll, el kernel necesita informar al espacio del usuario del mensaje FD. Es muy importante cómo evitar la copia innecesaria de memoria. En este punto, el kernel implementa epoll en la misma memoria que mmap en el espacio de usuario.
Acerca de los modos de trabajo de epoll ET, LT
Epoll funciona de dos maneras.
Et: gatillo de flanco, gatillo de flanco. Solo se le notificará cuando el estado cambie y epoll_wait regrese. En otras palabras, un evento se notifica sólo una vez. Y solo se admiten sockets sin bloqueo.
Lt: disparador de nivel, disparador de nivel (modo de trabajo por defecto). Similar a seleccionar/encuesta, siempre que haya eventos no controlados, se seguirá notificando. Llamar a la interfaz epoll en modo LT equivale a un sondeo más rápido. Admite enchufes bloqueantes y no bloqueantes.
Tres modelos de programación de redes concurrentes en Linux
1 modelo Apache, abreviado como PPC (Proceso por conexión): asigna un proceso para cada conexión. El tiempo y el espacio que el host asigna a cada conexión son costosos y, a medida que aumenta el número de conexiones, también aumenta una gran cantidad de gastos generales de conmutación entre procesos. Es difícil manejar una gran cantidad de conexiones simultáneas de clientes.
Modelo 2 TPC (un hilo por conexión): Hay un hilo por conexión. Similar al PCC.
3Seleccione modelo: Tecnología de multiplexación de E/S.
.1 Cada conexión corresponde a una descripción. El modelo seleccionado está limitado por FD_SETSIZE, es decir, el número máximo de descriptores abiertos por un proceso Linux2.6.35 es 1024. De hecho, la cantidad de descriptores que puede abrir cada proceso en Linux solo está limitada por el tamaño de la memoria. Pero al diseñar la llamada al sistema de selección, se hace referencia al valor de FD_SETSIZE. Este valor se puede cambiar recompilando el kernel, pero este problema no se puede resolver. Incluso para un millón de solicitudes de conexión de usuarios, el número correspondiente de procesos ha aumentado, pero todavía parece ser una gota en el océano.
2select escaneará un conjunto de descriptores de archivos cada vez, y el tamaño de este conjunto es el valor pasado como primer parámetro de selección. Sin embargo, si aumenta la cantidad de descriptores de archivos que puede abrir cada proceso, la eficiencia del escaneo también disminuirá.
.3 Kernel al espacio de usuario, utilizando copia de memoria para transferir información que ocurre en la descripción del archivo.
4 Modelo de sondeo: tecnología de reutilización de E/S. El modelo Poll no está limitado por FD_SETSIZE porque el usuario especifica el tamaño del conjunto de descriptores de archivos escaneados por el kernel, que es el segundo argumento para sondear. Pero todavía existen problemas con la eficiencia del escaneo y la copia de memoria.
Modelo de 5 pselect: Tecnología de reutilización de E/S. Lo mismo que la selección.
6 modelo epoll:
1) No hay límite de tamaño de descriptor de archivo, solo está relacionado con el tamaño de la memoria.
2) Cuando 2) epoll regrese, quedará claro qué socket fd ocurrió y no es necesario comparar uno por uno como select.
3) El kernel utiliza * * * el modo de compartir memoria para transmitir mensajes al espacio del usuario.
Cuatro: Preguntas frecuentes
1. Un solo epoll no puede resolver todos los problemas, especialmente cada operación lleva mucho tiempo porque epoll se procesa en serie. Por lo tanto, es necesario crear un grupo de subprocesos para desempeñar un papel más importante.
2. Si fd se registra en dos epolls, ambos epolls activarán eventos si hay tiempo.
3. Si el fd registrado en epoll está cerrado, se eliminará automáticamente de la lista de escucha de epoll.
4. Si varios eventos activan epoll al mismo tiempo, se devolverán varios eventos juntos.
5.epoll_wait siempre escuchará si ocurre el evento epollhup, por lo que no es necesario agregarlo al evento.
6. Para evitar una gran cantidad de IO, solo se procesa un FD en modo et y otros FD mueren de hambre. Linux sugiere que el bit listo se puede agregar a la estructura a la que está vinculado el fd, y luego epoll_wait solo se configurará en modo listo después de que se active el evento, y luego se sondeará la lista de fd listos a continuación.