La diferencia entre sincrónico y asincrónico, con bloqueo y sin bloqueo, selección, sondeo y epoll.
El concepto de asíncrono es relativo a la sincronización.
(1) Al emitir una llamada sincrónica, la persona que llama debe esperar la notificación de la información de devolución (resultado) antes de continuar realizando operaciones posteriores.
(2) Al emitir una llamada asincrónica; procedimiento Cuando se llama, la persona que llama no obtendrá la información de devolución (resultado) inmediatamente. El componente que realmente maneja la llamada notifica a la persona que llama mediante estado, notificaciones y devoluciones de llamada cuando se completa la llamada.
Aquí se menciona que los componentes de ejecución y las personas que llaman devuelven resultados de tres maneras: estado, notificación y devolución de llamada. El mecanismo de notificación que se utiliza depende de la implementación del componente de ejecución y la persona que llama no lo puede controlar a menos que el componente de ejecución proporcione múltiples opciones.
(A) Bloquear llamada significa que el hilo actual se cuelga hasta que regresa el resultado de la llamada y está en un estado de espera de notificación de mensaje, sin poder realizar ninguna otra tarea
(B ) Llamada sin bloqueo significa que la función no bloqueará el hilo actual hasta que el resultado no se pueda obtener de inmediato y luego regresará inmediatamente
Analogía del escenario:
Por ejemplo, supongamos que voy a al banco, puede haber dos maneras:
En el escenario anterior, si:
a) Si elige hacer cola (sincronizar) y no hacer nada mientras está en cola (el hilo está suspendido y no se puede hacer nada), entonces es un modelo de bloqueo sincrónico;
b) Si elige hacer cola (sincrónicamente), pero mientras hace cola, está haciendo cosas no relacionadas con la banca, como fumar, ( el hilo no está suspendido, puede hacer otras cosas), entonces es un modelo sincrónico sin bloqueo;
c) Si elige tomar un ticket pequeño, haga el trabajo de esperar la llamada (notificación ), pero siéntese en el asiento y no haga nada (el hilo está suspendido y no puede hacer nada), este es el modelo de bloqueo asincrónico;
d) Si elige tomar un boleto pequeño, siéntese en el sentarse y esperar la llamada (notificación), pero sentarse al teléfono hablando de negocios al mismo tiempo (el hilo no está suspendido y puede hacer otras cosas), este es el modelo asincrónico sin bloqueo.
Resuma estos cuatro modos:
1: Modo de bloqueo sincrónico, la eficiencia más baja, es decir, te concentras en hacer cola y no haces nada.
2: Bloqueo asincrónico, también muy ineficiente, es decir, obtienes el número y esperas la llamada (notificación), pero te quedas ahí sentado sin hacer nada
3: Sin bloqueo sincrónico , eficiente No es alto ya que implica alternar entre subprocesos. Por ejemplo, hablas por teléfono o fumas mientras estás en la cola, pero tienes que moverte en la cola de vez en cuando. El programa necesita alternar entre las dos acciones de hacer cola y hacer llamadas telefónicas, y se puede imaginar la sobrecarga del sistema.
4: Asíncrono, sin bloqueo, muy eficiente. Mientras estás sentado con tu recibo y esperas la llamada (notificación), puedes llamar para discutir tu negocio.
Varios conceptos básicos bajo Linux
1: Control de usuario y espacio del kernel. Los sistemas operativos modernos utilizan memoria virtual y, en un sistema operativo de 32 bits, su espacio de direccionamiento (memoria virtual) es 4G (2 elevado a 32). Para garantizar que los procesos del usuario complementen la ejecución directa del kernel y garanticen la seguridad del kernel, el sistema operativo divide el espacio virtual en dos partes, una es el espacio del kernel y la otra es el espacio del usuario. Para los sistemas operativos Linux, el espacio de bytes de 1G más alto se asigna al kernel y se denomina espacio del kernel, mientras que el espacio de bytes de 3G más bajo se divide en espacio de usuario.
2: El cambio de proceso consume recursos. Para controlar la ejecución del proceso, el kernel debe tener la capacidad de suspender el proceso que se ejecuta en la CPU y reanudar la ejecución del proceso previamente suspendido. llamado cambio de proceso. Este comportamiento se llama cambio de proceso. Cada vez que cambia, debe guardar el contexto del proceso anterior y así sucesivamente, en resumen, recuerde que el cambio de proceso requiere muchos recursos.
3: Descriptor de archivo: el descriptor de archivo tiene la forma de un número entero no negativo.
De hecho, es un índice de la tabla de registros mantenida por el núcleo para cada proceso, que registra los archivos abiertos por ese proceso. Cuando un programa abre un archivo, el núcleo devuelve un descriptor de archivo entero no negativo al proceso. Pero los descriptores de archivos se utilizan generalmente en sistemas Unix y Linux.
Caché IO. La operación de IO predeterminada de la mayoría de los sistemas es caché IO. En el mecanismo de caché IO de Linux, el sistema operativo almacena en caché los datos IO en el caché de la página del sistema. se copia al búfer del kernel del sistema operativo antes de copiarlo del búfer del kernel del sistema operativo al espacio de direcciones de la aplicación. Desventajas de la IO en caché: durante el proceso de transferencia, los datos deben copiarse varias veces entre la aplicación, el espacio de direcciones y el kernel. El consumo de CPU y memoria causado por este bloqueo de la operación de copia de datos es muy alto.
Modelo IO de LINUX
Network IO es esencialmente lectura de sockets. En LINUX, los sockets se abstraen como flujos, por lo que las operaciones en la red IO pueden interpretarse como operaciones en flujos.
Para el acceso IO (como operaciones de lectura), los datos primero se copian en el búfer del kernel del sistema operativo y luego se copian desde el búfer del kernel a la capa de usuario del proceso, es decir, la dirección de la aplicación. espacio. Entonces, cuando ocurre una operación de lectura, en realidad pasa por dos etapas:
1: El búfer del núcleo está en su lugar
2: Los datos se copian del búfer del núcleo a la dirección de el espacio del programa de usuario
Entonces, en caso de operación de lectura en el socket io, los dos pasos son:
1: Espere a que llegue el paquete de la red y luego cópielo al buffer del kernel y luego copiado al buffer del kernel.
Existen varios modos de E/S de red:
¿Le resulta familiar? Generalmente nos referimos a select, poll y epoll como diferentes implementaciones de IO multiplexada en el modelo de sincronización. A continuación se presentarán el bloqueo síncrono, el no bloqueo síncrono y la multiplexación de E/S síncrona.
1: Bloqueo sincrónico
Es el modelo IO de red más simple y más utilizado.
Como se puede ver en la figura, el proceso del usuario se bloquea después de llamar a la llamada del sistema recvfrom. Luego, el kernel comienza la primera fase de IO: preparación de datos. Una vez completada la primera fase, el kernel inicia la segunda fase, copiando los datos del búfer del kernel al búfer del programa del usuario (esto lleva algún tiempo). Luego, el kernel devuelve el resultado (recvfrom, para ser precisos) y el proceso del usuario deja de bloquearse y comienza a ejecutarse nuevamente.
Resumen: En el modelo de bloqueo síncrono, el programa de usuario se bloquea en ambas fases de la ejecución del kernel io. Pero debido a esto, no hay demoras en la devolución de datos y el modelo del programa es simple.
Dos: Sin bloqueo síncrono
El no bloqueo síncrono es un método de sondeo diseñado para sondear de vez en cuando. En realidad, el modo sin bloqueo síncrono puede considerarse como un pequeño subconjunto del modo de bloqueo síncrono.
Tercero: multiplexación IO
Dado que el modo síncrono sin bloqueo requiere un sondeo constante, el sondeo por sí solo ocupa una gran parte del proceso y consume recursos de la CPU. El proceso del usuario no solo puede leer este socket, sino también leer o escribir otros sockets. En este momento, la gente pensará que dentro de un tiempo de sondeo, no solo se debe consultar un socket fd La situación de consulta, y dentro de un tiempo de sondeo, el Es necesario consultar el estado de finalización del socket fd de múltiples tareas. Siempre que se complete cualquier tarea, se procesará. Además, el encuestador no es el estado del usuario del proceso, solo alguien que ayuda. Esto se llama multiplexación IO. Como todos sabemos, seleccionar, sondear y epoll hacen esto en Linux.
La llamada selecta se realiza a nivel del kernel. La diferencia entre el sondeo selecto y el sondeo en modo síncrono sin bloqueo es que el primero puede esperar varios sockets, escuchar varios puertos IO a la vez y luego ejecutar. la llamada en cualquier socket. Devuelve legibilidad cuando esté listo. Después de llamar a select o poll, el proceso se bloqueará, lo cual es diferente de bloquear IO, pero select no espera a que lleguen todos los sockets antes de procesar, sino que devuelve los datos al proceso del usuario para su procesamiento.
De hecho, en el caso de una sola tarea, el efecto de selección puede ser peor que el no bloqueo sincrónico, porque select y recvfrom son dos llamadas al sistema, mientras que las llamadas sin bloqueo solo una.
En el modelo de multiplexación io, cada socket generalmente está configurado como sin bloqueo, pero de hecho, todo el proceso del usuario siempre está bloqueado, excepto que el proceso del usuario no está bloqueado por el bloqueo IO, sino. bloqueado por la función de selección.
Cuando se utiliza socket IO, el proceso del usuario no se bloquea, pero sí lo bloquea la función seleccionada.
En comparación con el multiproceso y el multiproceso, la mayor ventaja de la multiplexación IO es la baja sobrecarga del sistema.
Uno: seleccionar
La función select monitorea múltiples sockets fs. La función no regresará hasta que un determinado descriptor esté listo o se agote el tiempo de espera. Cuando regresa la función de selección, puede encontrar un descriptor listo recorriendo el fdset. El proceso básico de selección es:
2: encuesta
La encuesta es básicamente la misma que seleccionar. Copia la matriz fds pasada por el usuario al espacio del kernel y luego realiza la consulta. el estado de cada fd. Si el estado de un fd es diferente del estado de otros fd, la función de sondeo devuelve el estado de cada fd. Si el estado de un fd es listo, el fd se agrega a la cola de espera y el recorrido continúa. Si no hay ningún fd listo después de recorrer todos los fds, el proceso actual se bloquea hasta que el dispositivo esté listo o se agote el tiempo de espera de la actividad.
Características:
1: la encuesta no tiene límite máximo de conexión porque se basa en el almacenamiento de listas vinculadas, a diferencia de selectic que monitorea directamente fd.
2: la encuesta no tiene un número máximo de conexiones porque utiliza una lista enlazada.
2: La misma matriz fd grande se copia entre el modo de usuario y el espacio de direcciones del kernel.
3: Otra característica del sondeo es la activación horizontal: si se ha informado de un fd pero no se ha procesado, se informará nuevamente en el siguiente sondeo.
4: Al igual que select, después de que regrese el sondeo, aún necesita atravesar fdset para preparar los sockets. Cuando la cantidad de fd es grande, la eficiencia disminuirá linealmente.
Tres: epoll
epoll admite disparo horizontal y disparo por borde. La característica más importante de la activación de borde es que solo le dice al proceso qué fds están listos y se le notifica solo una vez. Otra característica es que epoll usa "eventos" para notificar el estado listo, es decir, registra fd con epoll_ctl. Una vez que fd está listo, el kernel utilizará un mecanismo de devolución de llamada similar a una devolución de llamada para activar fd y epoll_wait recibirá la notificación.
No hay límite en la cantidad máxima de conexiones simultáneas y el límite superior de la cantidad de FD que se pueden abrir es mucho mayor que 1024 (la memoria 1G puede monitorear alrededor de 100,000 puertos).
Se mejora la eficiencia, no es un método de sondeo y la eficiencia no se reducirá debido al aumento en el número de FD.
Solo los FD activos y disponibles llamarán a la función de devolución de llamada, es decir, la mayor ventaja de Epoll es que solo se preocupa por sus conexiones "activas", no por el número total de conexiones, por lo que en un entorno de red real, Epoll será mucho más. eficiente Para seleccionar y sondear.
La copia de memoria, utilizando la memoria asignada de archivos mmap(), puede acelerar el paso de mensajes en el espacio del kernel, es decir, Epoll usa mmap para reducir la sobrecarga de copia.
Hable sobre sincronización, asíncrono, bloqueo y no bloqueo
Hable sobre los cinco modelos IO en Linux
Utilice select, poll y epoll para hablar sobre IO en detalle Multiplexación