¿Por qué pasó el programa al leer el archivo?

Fuente | La supervivencia de Coder en una isla desierta (ID: escape-it)

¿Alguna vez te has preguntado qué sucede en la parte inferior de la computadora cuando realizamos operaciones de E / S?

Antes de responder esta pregunta, veamos por qué la E / S es extremadamente importante para las computadoras.

¿Cuál es la computadora que no puede realizar E / S?

Creo que las operaciones de E / S son las más familiares para los programadores:

Cuando usamos printf en lenguaje C, "<<" en C ++, imprimimos en Python, System.out.println en Java, etc., esto es E / S; cuando usamos varios lenguajes para leer y escribir archivos, Esto también es I / O; cuando nos comunicamos con la red vía TCP / IP, esto también es I / O; cuando usamos el mouse para volar en el aire, cuando levantamos el teclado y damos punteros en el área de comentarios, o nos sumergimos en la fabricación Cuando hay un error, cuando podemos ver una hermosa interfaz gráfica en la pantalla, etc., todo esto es E / S.

Piénselo, si no hubiera una computadora de E / S, sería un dispositivo aburrido. No puede ver películas, jugar o navegar por Internet. Una computadora así es, en el mejor de los casos, una calculadora grande.

Dado que la E / S es tan importante, ¿qué es exactamente la E / S?

¿Qué es la E / S?

La E / S es una simple copia de datos , nada más.

Esto es muy importante, para profundizar la impresión de todos, vengan, todos, síganme, amigos en el árbol de allí y amigos en la pared de allí, levanten la mano y cántenme. El horizonte sin límites es. . . Lo siento, la E / S es solo una copia de datos, la E / S es solo una copia de datos.

Dejemos primero el concierto a un lado, ya que está copiando datos, ¿de dónde debería copiarse?

Si los datos se copian desde un dispositivo externo a la memoria, esto es Entrada.

Si los datos se copian de la memoria al dispositivo externo, esto es Salida.

Copiar datos de un lado a otro entre la memoria y los dispositivos externos es Entrada y Salida, denominada E / S (Entrada / Salida), nada más.

E / S dada CPU

Ahora que sabemos qué es la E / S, el siguiente paso es la parte importante: presta atención y siéntate.

Sabemos que la frecuencia principal de la CPU actual comienza en unos pocos GHz. ¿Qué significa esto? En pocas palabras, la velocidad a la que la CPU ejecuta las instrucciones de la máquina está en el nivel de nanosegundos, mientras que la E / S habitual, como las operaciones de disco, una búsqueda de disco es de aproximadamente milisegundos, por lo que si comparamos la velocidad de la CPU con la de un avión de combate, entonces las operaciones de E / S La velocidad es KFC .

Es decir, cuando nuestro programa se ejecuta (la CPU ejecuta las instrucciones de la máquina), su velocidad es mucho más rápida que la velocidad de E / S. Entonces la siguiente pregunta es que la diferencia de velocidad entre los dos es tan grande, entonces cómo diseñamos, ¿Cómo utilizar los recursos del sistema de manera más razonable y eficiente?

Dado que hay una diferencia de velocidad y el proceso no puede avanzar hasta que se complete la operación de E / S, obviamente solo hay una forma, y ​​es esperar, esperar .

Lo mismo ocurre con la espera. Hay una espera inteligente y una espera tonta, lo que se conoce como espera tonta. Entonces, ¿debería elegir una espera inteligente o una espera tonta?

Suponga que es una persona imprudente (CPU) y necesita esperar un archivo importante. Desafortunadamente, este archivo solo se puede entregar por expreso (E / S). Entonces elige no hacer nada y mirar a la puerta con afecto. ¿Al igual que Hani esperando por ti, esperando atentamente a este mensajero? ¿O no se preocupe por la entrega por ahora, simplemente juegue, vea una película, vea un video corto y espere a que llegue la entrega?

Obviamente, una mejor manera es hacer otras cosas primero, y hablemos de ello cuando llegue el expreso.

Por lo tanto, el punto clave aquí es que las cosas disponibles antes de la entrega urgente se pueden pausar primero, cambiar a otras tareas y volver cuando llega la entrega urgente .

Con este conocimiento, puede comprender lo que sucede en la parte inferior al realizar operaciones de E / S.

A continuación, tomemos la lectura de un archivo de disco como ejemplo para explicar este proceso.

Qué sucede en el nivel inferior cuando se realiza la E / S

En el último artículo, " Comprensión completa de subprocesos y grupos de subprocesos en alta concurrencia y alto rendimiento ", presentamos el concepto de procesos y subprocesos. En los sistemas operativos que admiten subprocesos, los subprocesos en realidad se programan en lugar de procesos. Para comprender el proceso de E / S más claramente, asumimos temporalmente que el sistema operativo solo tiene el concepto de procesos, y no consideramos los subprocesos primero, esto no afectará nuestra discusión.

Ahora hay dos procesos en la memoria, el proceso A y el proceso B. El proceso actual A se está ejecutando, como se muestra en la figura:

Hay un fragmento de código para leer el archivo en el proceso A, sin importar en qué idioma solemos definir un beneficio para cargar datos y luego llamar a funciones como leer, como esta:

read(buff);

Esta es una operación de E / S típica. Cuando la CPU ejecuta este código, enviará una solicitud de lectura al disco. Tenga en cuenta que, en comparación con la velocidad a la que la CPU ejecuta las instrucciones, las operaciones de E / S son muy lentas, por lo que la operación Es imposible que el sistema desperdicie los valiosos recursos informáticos de la CPU en esperas innecesarias. En este momento, el punto clave está aquí. Tenga en cuenta que el siguiente punto es el punto clave.

Debido a que el dispositivo externo realiza operaciones de E / S muy lentamente, el proceso no puede continuar avanzando hasta que se complete la operación de E / S. Este es el llamado bloqueo , que comúnmente se conoce como bloqueo. Una vez que el sistema operativo detecta que el proceso inicia una solicitud al dispositivo de E / S, suspende el proceso ¿Cómo suspenderlo? Muy simple, simplemente registre el estado de ejecución del proceso actual y apunte el registro de la PC de la CPU a las instrucciones de otros procesos.

Cuando el proceso está suspendido, seguirá ejecutándose. Por lo tanto, el sistema operativo debe guardar el proceso suspendido para su posterior ejecución. Obviamente podemos usar la cola para guardar el proceso suspendido. Como se muestra en la figura, el proceso A se suspende y se coloca En la cola de bloqueo (tenga en cuenta que los diferentes sistemas operativos tienen diferentes implementaciones, y cada dispositivo de E / S puede tener una cola de bloqueo correspondiente, pero esta diferencia en los detalles de implementación no afecta nuestra discusión).

En este momento, el sistema operativo ha enviado una solicitud de E / S al disco, por lo que el controlador de disco comienza a copiar los datos del disco al búfer del proceso A. Aunque el proceso A se ha suspendido en este momento, no impide que el disco envíe a la memoria. En copia de datos. Tenga en cuenta que los discos modernos no necesitan la ayuda de la CPU para copiar datos a la memoria. Esto se denomina DMA (Acceso directo a memoria). Este proceso se muestra en la figura:

Dejemos que el disco copie los datos primero y seguiremos hablando.

De hecho, además de la cola de bloqueo, también hay una cola lista en el sistema operativo . La llamada cola lista significa que los procesos en la cola están listos para ser ejecutados por la CPU. Puede preguntarse por qué debe haber una cola lista para la ejecución directa. La respuesta es simple, basta con dar vueltas , incluso si solo en una máquina central se pueden crear cientos de miles de procesos, la CPU es imposible para realizar tantos procesos simultáneamente, por lo que debe haber tal proceso, incluso si todo está listo. Tampoco puede asignarse a recursos informáticos , y dichos procesos se colocan en la cola de listas.

Ahora el proceso B está en la cola lista, todo está listo y solo debe CPU, como se muestra en la figura:

Cuando se suspende la ejecución del proceso A, la CPU no puede estar inactiva, porque todavía hay el proceso B esperando ser alimentado en la cola lista. En este momento, el sistema operativo comienza a encontrar el siguiente proceso ejecutable en la cola lista, que es el proceso B aquí.

En este momento, el sistema operativo saca el proceso B de la cola lista, encuentra la ubicación de la instrucción de la máquina ejecutada cuando el proceso B está suspendido, y luego apunta el registro de PC de la CPU a esta ubicación, de modo que el proceso B comienza a ejecutarse, como se muestra en la figura. :

Tenga en cuenta que el siguiente párrafo es el punto clave de la clave.

Preste atención a la imagen de arriba. En este momento, el proceso B está siendo ejecutado por la CPU y el disco está copiando datos en el espacio de memoria del proceso A. ¿Puede verlo? Todos están ocupados y nadie está inactivo. La copia de datos y la ejecución de instrucciones se están realizando al mismo tiempo Bajo la programación del sistema operativo, la CPU y el disco se utilizan por completo, aquí es donde reside la sabiduría del programador.

Ahora debe comprender por qué el sistema operativo es tan importante.

Después de eso, el disco finalmente copió todos los datos a la memoria del proceso A. En este momento, el disco notifica al sistema operativo que la tarea se completó ¿Puede preguntar cómo notificar? Esta es una interrupción.

Una vez que el sistema operativo recibe la interrupción del disco, encuentra que la copia de datos está completa y el proceso A recupera la calificación para continuar ejecutándose. En este momento, el sistema operativo coloca cuidadosamente el proceso A de la cola de bloqueo en la cola lista, como se muestra en la figura:

Tenga en cuenta que de la discusión anterior sobre el estado listo, sabemos que el sistema operativo no ejecutará directamente el proceso A, y el proceso A debe colocarse en la cola lista para esperar, lo cual es justo para todos.

Después de eso, el proceso B continúa ejecutándose y el proceso A continúa esperando. Después de que el proceso B se ejecuta por un tiempo, el sistema operativo piensa que el tiempo de ejecución del proceso B es lo suficientemente largo, por lo que coloca el proceso B en la cola de espera, saca el proceso A y continúa la ejecución.

Tenga en cuenta que el sistema operativo pone el proceso B en la cola lista, por lo que el proceso B se suspende solo porque el intervalo de tiempo ha terminado y no porque la solicitud de E / S está bloqueada, como se muestra en la figura:

El proceso A continúa ejecutándose. En este momento, el beneficio se llena con los datos deseados. El proceso A se ejecuta felizmente, como si nunca se hubiera suspendido. El proceso no sabe nada acerca de la suspensión. Esto es La magia del sistema operativo .

Ahora debe comprender qué tipo de proceso de E / S es.

De esta manera, el proceso realiza operaciones de E / S, y la ejecución suspendida se denomina bloqueo de E / S, bloqueo de E / S, que también es el método de E / S más común y fácil de entender. Hay E / S de bloqueo y no Al bloquear E / S, no consideraremos este método por ahora.

Al principio de esta sección, dijimos que solo consideramos procesos y no subprocesos por el momento. Ahora relajamos esta condición. En realidad, es muy simple. Solo necesitamos cambiar el proceso programado en la figura anterior a subprocesos. La discusión aquí es la misma para subprocesos. Establecido.

Copia cero

Lo último a tener en cuenta es que en la explicación anterior, copiamos directamente los datos del disco en el espacio de proceso, pero en general, los datos de E / S se copian primero en el sistema operativo y luego el sistema operativo se copia en el espacio de proceso . Por lo tanto, podemos ver que en realidad hay una capa de copia a través del sistema operativo. Para escenarios con requisitos de alto rendimiento, en realidad es posible omitir el sistema operativo y realizar directamente la copia de datos. Este es también el escenario descrito en este artículo, que pasa por alto el sistema operativo directamente. La tecnología para la copia de datos se llama Zero-copy , que es una tecnología comúnmente utilizada en escenarios de alta concurrencia y alto rendimiento.El principio es muy simple.

para resumir

Este artículo explica las E / S que utilizan los programadores. En general, como programadores, no es necesario que nos preocupemos por ello. Sin embargo, comprender los principios subyacentes detrás de las E / S es extremadamente beneficioso para diseñar sistemas de alto rendimiento y alta concurrencia. Espero que este artículo sea útil para todos. Es útil tener una comprensión más profunda de las E / S.


更多精彩推荐
☞一年翻 3 倍,装机量 6 亿台的物联网操作系统又放大招!
☞乘“峰”而上,聚生态之力共创软件产业新未来
☞腾讯微博即将关停,十年了,你用过吗?
☞Cognitive Inference:认知推理下的常识知识库资源、常识推理测试评估与中文实践项目索引
☞超详细 | 21张图带你领略集合的线程不安全
☞腾讯云区块链邀您参加2020腾讯全球数字生态大会
点分享点点赞点在看

Supongo que te gusta

Origin blog.csdn.net/csdnnews/article/details/108525813
Recomendado
Clasificación