Cinco modelos de E / S de E / S de bloqueo de programación de red Linux y E / S sin bloqueo (incluidos ejemplos de la vida real) fáciles de entender [recomendado para principiantes]

Prólogo : revisé la multiplexación cuando aprendí la programación de sockets antes de realizar la clasificación. Busqué información relevante y aprendí que la multiplexación también tiene limitaciones. Con el espíritu de romper la pregunta de la cazuela hasta el final, finalmente encontré los puntos de conocimiento sobre el modelo IO.

I. Resumen

En el libro "Programación de red Unix" se mencionan cinco modelos de E / S, a saber: E / S de bloqueo, E / S sin bloqueo, E / S multiplexada, E / S impulsada por señales y E / S asíncrona.

Introduciremos e implementaremos estos 5 modelos aquí. Antes de la introducción, permítame citar cierta metáfora.

Bloque IO , envía un mensaje de texto a la diosa, diciéndole que te estoy buscando, y luego espera en silencio a que la diosa baje, durante este período no harás nada más que esperarte, que es una llanta de refacción. práctica.

IO sin bloqueo , envía un mensaje de texto a la diosa, si no respondes, envíalo de nuevo y envíalo hasta que la diosa baje. Durante este período, no harás nada más que mensajes de texto y esperar, que es una práctica dedicada.

El multiplexado de IO es encontrar una tía que te ayude a monitorear a las chicas que bajan las escaleras. Durante este período, puedes hacer otras cosas. Por ejemplo, puedes mirar a otras chicas por cierto, jugar King Glory, ir al baño, etc. .IO Reuse también incluye modos de selección, encuesta y epoll Entonces, ¿cuál es la diferencia entre ellos?

  • 1) Aunt Select Todas las chicas bajan las escaleras, la tía Select no sabe si esta es tu diosa, necesita preguntar una por una,
    y la capacidad de Aunt Select todavía es limitada y puede monitorear a 1024 chicas como máximo una vez
  • 2) La tía Pol no limita la cantidad de chicas que miran fijamente, siempre que sea una chica que pase por la puerta del dormitorio, ella te ayudará a preguntar si es tu diosa.
  • 3) La tía epoll no limita el número de chicas que miran fijamente, y no hay necesidad de preguntar una por una. Entonces, ¿cómo hacerlo? La tía epoll pondrá una gran nota en el rostro de cada chica que entre al dormitorio, y escribe la niña en él. Siempre que la niña baje las escaleras, la tía epoll sabrá si esta es tu diosa, y luego la tía te lo notificará. La sincronización IO anterior tiene una cosa en común es que cuando la diosa sale del puerta del dormitorio, ya estás parado en la puerta del dormitorio esperando a la diosa, ahora estás en un estado bloqueado

El siguiente es el caso de IO asincrónico:
le dices a la diosa que voy, y luego vas a jugar, hasta que la diosa está abajo y descubre que no puede verte, la diosa te llamará para informarte. y decir que estoy abajo, ¿dónde estás ?, solo entonces llegaste a la puerta del dormitorio. Este es un enfoque de contraataque

Dos, IO con bloqueo y IO sin bloqueo

En la programación de sistemas Linux, presentamos el concepto de bloqueo en el capítulo sobre conceptos. Entonces es fácil entender qué es IO bloqueante y IO no bloqueante. Mira directamente la imagen

1. Bloqueo de IO

El modelo de E / S más tradicional es que el bloqueo ocurre en el proceso de lectura y escritura de datos.

Cuando el hilo del usuario emite una solicitud de IO, el kernel verificará si los datos están listos, si no lo están, esperará a que los datos estén listos y el hilo del usuario estará en un estado bloqueado y el hilo del usuario entregará la CPU. Cuando los datos están listos, el kernel copia los datos en el hilo del usuario y devuelve el resultado al hilo del usuario, y el hilo del usuario libera el estado de bloqueo.
Inserte la descripción de la imagen aquí
el código se muestra a continuación:

	printf("Calling recv(). \n");
	ret =  recv(socket, recv_buf, sizeof(recv_buf), 0); 
	printf("Had called recv(). \n");

Algunas personas pueden decir que se puede usar multihilo + bloqueo de E / S para resolver el problema de eficiencia, pero debido a que en multihilo + bloqueo de E / S, cada socket corresponde a un hilo, lo que causará una gran ocupación de recursos, y especialmente para conexiones largas. En palabras, los recursos de subprocesos nunca se liberarán. Si hay muchas conexiones en el futuro, se producirá un cuello de botella en el rendimiento.

2. E / S sin bloqueo

Cuando el hilo del usuario inicia una operación de E / S, no necesita esperar, pero obtiene un resultado de inmediato. Si el resultado es un error, sabe que los datos no están listos, por lo que puede enviar operaciones IO nuevamente. Una vez que los datos en el kernel están listos y recibe una solicitud del hilo del usuario nuevamente, inmediatamente copia los datos al hilo del usuario y luego regresa.

En el modelo de E / S sin bloqueo, los subprocesos de usuario deben preguntar constantemente si los datos del kernel están listos, es decir, la E / S sin bloqueo no entregará la CPU, pero siempre ocupará la CPU.

Para E / S sin bloqueo, hay un problema muy serio. En el ciclo while, es necesario preguntar constantemente si los datos del kernel están listos, lo que conducirá a un uso muy alto de la CPU, por lo que, en general, el ciclo while rara vez se usa para leer datos.

Inserte la descripción de la imagen aquí
el código se muestra a continuación:

while(1)
{
    
    
	printf("Calling recv(). \n");
	ret =  recv(socket, recv_buf, sizeof(recv_buf), 0); 
	if (EAGAIN == ret) {
    
    continue;}
    else if(ret > -1) {
    
     break;}
	printf("Had called recv(), retry.\n");
}

El editor recomienda mi propio grupo de intercambio de tecnología de lenguaje linuxC / C ++: [ 1106675687 ] He recopilado algunos libros de aprendizaje y materiales de video que creo que es mejor compartir en los archivos del grupo, ¡y puede agregarlos si los necesita!
Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/m0_50662680/article/details/113184748
Recomendado
Clasificación