[Volver a publicar] Interruptor de contexto de CPU

Cambio de contexto de CPU

https: // www.jianshu.com/p/87b8ec445c9c

 

Linux es un sistema operativo multitarea que admite tareas que son mucho más grandes que la cantidad de CPU que se ejecutan al mismo tiempo. Por supuesto, estas tareas no se están ejecutando al mismo tiempo, sino porque el sistema les asigna CPU en poco tiempo, lo que provoca la ilusión de que se están ejecutando varias tareas al mismo tiempo.

Antes de que se ejecute cada tarea, la CPU necesita saber dónde se carga la tarea y dónde comenzar a ejecutarse, es decir, el sistema debe ayudarlo a configurar el registro de la CPU y el contador de programas (Contador de programas, PC) de antemano.

El registro de la CPU es una memoria de pequeña capacidad pero extremadamente rápida integrada en la CPU. El contador del programa se utiliza para almacenar la posición de la instrucción que ejecuta la CPU o la posición de la siguiente instrucción que se ejecutará. Son todos los que la CPU debe depender del entorno antes de ejecutar cualquier tarea, por lo que también se llama contexto de la CPU.

 

Sabiendo lo que es un contexto de CPU, creo que puedes entender fácilmente el cambio de contexto de CPU. El cambio de contexto de CPU es guardar el contexto de CPU (es decir, registros de CPU y contadores de programa) de la tarea anterior, luego cargar el nuevo contexto de tarea en estos registros y contadores de programa, y ​​finalmente saltar a la nueva ubicación señalada por el contador de programa Para ejecutar una nueva tarea.

Estos contextos guardados se almacenarán en el núcleo del sistema y se cargarán nuevamente cuando la tarea se reprograme para su ejecución. Esto asegurará que el estado original de la tarea no se vea afectado, haciendo que la tarea parezca ejecutarse continuamente.

Supongo que alguien dirá que el cambio de contexto de la CPU no es más que actualizar los valores de los registros de la CPU, pero estos registros están diseñados para tareas de ejecución rápida. ¿Por qué afecta el rendimiento de la CPU del sistema?

Antes de responder a esta pregunta, me pregunto si alguna vez pensó en cuáles son estas "tareas" administradas por el sistema operativo.

Se podría decir que las tareas son procesos, o las tareas son hilos. Sí, los procesos y los hilos son las tareas más comunes. Pero más allá de eso, ¿hay otras tareas?

No olvide que la señal de activación de hardware hará que se llame al controlador de interrupciones, que también es una tarea común.

Por lo tanto, dependiendo de la tarea, el cambio de contexto de la CPU se puede dividir en varios escenarios diferentes, a saber, cambio de contexto de proceso, cambio de contexto de subproceso y cambio de contexto de interrupción.

En esta lección, le mostraré cómo comprender estos diferentes cambios de contexto y por qué causan problemas relacionados con el rendimiento de la CPU.

Proceso de cambio de contexto

Según el nivel de privilegio, Linux divide el espacio de ejecución del proceso en el espacio del kernel y el espacio del usuario, que corresponden al Anillo 0 y el Anillo 3 del nivel de privilegio de la CPU en la figura a continuación.

  • El espacio del kernel (Anillo 0) tiene la máxima autoridad y puede acceder directamente a todos los recursos;
  • El espacio de usuario (Anillo 3) solo puede acceder a recursos restringidos, y no puede acceder directamente a dispositivos de hardware como la memoria. Debe quedar atrapado en el núcleo a través de llamadas del sistema para acceder a estos recursos privilegiados.
 

Desde otra perspectiva, es decir, el proceso puede ejecutarse tanto en el espacio del usuario como en el espacio del kernel. Cuando un proceso se ejecuta en el espacio del usuario, se denomina estado del usuario del proceso, y cuando cae en el espacio del núcleo, se denomina estado del núcleo del proceso.

La transición del modo de usuario al modo de núcleo debe completarse mediante llamadas al sistema. Por ejemplo, cuando vemos el contenido de un archivo, necesitamos que se completen varias llamadas al sistema: primero llame a open () para abrir el archivo, luego llame a read () para leer el contenido del archivo y llame a write () para escribir el contenido en la salida estándar, y finalmente Llame a close () para cerrar el archivo.

Entonces, ¿ha cambiado el contexto de la CPU durante la llamada al sistema? La respuesta es naturalmente sí.

La posición de instrucción del modo de usuario original en el registro de la CPU debe guardarse primero. Luego, para ejecutar el código de estado del núcleo, el registro de la CPU debe actualizarse a la nueva ubicación de la instrucción de estado del núcleo. Finalmente, salte al modo kernel para ejecutar la tarea kernel.

Una vez completada la llamada al sistema, el registro de la CPU necesita restaurar el estado de usuario original guardado y luego cambiar al espacio de usuario para continuar el proceso. Por lo tanto, en el proceso de una llamada al sistema, realmente ocurrieron dos cambios de contexto de CPU.

Sin embargo, debe tenerse en cuenta que durante la llamada al sistema, no habrá recursos en modo de usuario como la memoria virtual, ni cambiará los procesos. Esto es diferente de lo que generalmente llamamos cambio de contexto de proceso:

  • El cambio de contexto de proceso se refiere al cambio de un proceso a otro.
  • El mismo proceso siempre se ejecuta durante la llamada al sistema.

Por lo tanto, el proceso de llamada del sistema generalmente se llama conmutación de modo de privilegio, en lugar de conmutación de contexto. Pero, de hecho, durante la llamada al sistema, el cambio de contexto de la CPU sigue siendo inevitable.

Entonces, ¿cuál es la diferencia entre un cambio de contexto de proceso y una llamada al sistema?

En primer lugar, debe saber que los procesos son gestionados y programados por el kernel, y el cambio de procesos solo puede ocurrir en modo kernel. Por lo tanto, el contexto del proceso incluye no solo recursos de espacio de usuario, como memoria virtual, pila y variables globales, sino también el estado del espacio del núcleo, como la pila y los registros del núcleo.

Por lo tanto, el cambio de contexto del proceso es un paso más que cuando se llama al sistema: antes de guardar el estado del núcleo y el registro de la CPU del proceso actual, la memoria virtual y la pila del proceso deben guardarse primero; y el núcleo del siguiente proceso se carga Después del estado, también debe actualizar la memoria virtual y la pila de usuarios del proceso.

Como se muestra en la figura a continuación, el proceso de guardar y restaurar el contexto no es "libre" y requiere que el núcleo se ejecute en la CPU para completarse.

 

Según el informe de prueba de Tsuna, cada cambio de contexto requiere decenas de nanosegundos a microsegundos de tiempo de CPU. Este tiempo es bastante considerable, especialmente en el caso de una gran cantidad de cambios de contexto de proceso, es fácil hacer que la CPU dedique mucho tiempo al almacenamiento y restauración de recursos como registros, pilas de kernel y memoria virtual, lo que acorta en gran medida la operación real. El tiempo del proceso. Esto es exactamente de lo que hablamos en la sección anterior, que es un factor importante que conduce a un aumento en la carga promedio.

Además, sabemos que Linux usa TLB (Traducción Lookaside Buffer) para administrar la relación de mapeo entre la memoria virtual y la memoria física. Después de actualizar la memoria virtual, el TLB también debe actualizarse, y el acceso a la memoria también se ralentizará en consecuencia. Especialmente en un sistema multiprocesador, la memoria caché es compartida por varios procesadores. La actualización de la memoria caché no solo afectará el proceso actual del procesador, sino que también afectará los procesos de otros procesadores que comparten la memoria caché.

Después de conocer los posibles problemas de rendimiento del cambio de contexto del proceso, veamos cuándo cambiar el contexto del proceso. Obviamente, el contexto debe cambiarse cuando se cambia el proceso, en otras palabras, el contexto debe cambiarse solo cuando el proceso está programado. Linux mantiene una cola lista para cada CPU, ordena los procesos activos (es decir, los procesos que se ejecutan y esperan la CPU) según la prioridad y el tiempo de espera de la CPU, y luego selecciona el proceso que necesita la mayor cantidad de CPU, es decir, la prioridad más alta y Espere a que se ejecute el proceso con el mayor tiempo de CPU.

Entonces, ¿cuándo se programará el proceso para ejecutarse en la CPU?

Uno de los momentos más fáciles de pensar es cuando el proceso finaliza la ejecución y finaliza. Se lanzará la CPU que usaba antes. En este momento, tomará un nuevo proceso de la cola lista y lo ejecutará. De hecho, hay muchos otros escenarios que también desencadenarán la programación del proceso. Aquí los resolveré por usted.

  • Primero, para garantizar que todos los procesos se puedan programar de manera justa, el tiempo de CPU se divide en segmentos de segmentos de tiempo, y estos segmentos de tiempo se asignan a cada proceso a su vez. De esta manera, cuando se agota el intervalo de tiempo de un proceso, el sistema lo suspenderá y cambiará a otros procesos que están esperando que se ejecute la CPU.

  • En segundo lugar, cuando el sistema tiene recursos del sistema insuficientes (como memoria insuficiente), el proceso no se puede ejecutar hasta que se satisfagan los recursos. En este momento, el proceso también se suspenderá y el sistema programará otros procesos para ejecutarse.

  • En tercer lugar, cuando el proceso se suspende activamente a través de la función de sueño, se reprogramará naturalmente.
  • Cuarto, cuando se ejecuta un proceso con una prioridad más alta, para garantizar el funcionamiento del proceso de alta prioridad, el proceso actual será suspendido y ejecutado por el proceso de alta prioridad.

  • Finalmente, cuando ocurre una interrupción de hardware, el proceso en la CPU será suspendido por la interrupción, y la rutina de servicio de interrupción en el núcleo se ejecutará en su lugar.

Es muy necesario comprender estos pocos escenarios, porque una vez que se produce el problema de rendimiento del cambio de contexto, son los asesinos detrás de escena.

Cambio de contexto de subproceso

Después de hablar sobre el cambio de contexto del proceso, echemos un vistazo a los problemas relacionados con el hilo.

La mayor diferencia entre hilos y procesos es que los hilos son la unidad básica de programación, mientras que los procesos son la unidad básica de propiedad de los recursos. Para decirlo sin rodeos, la llamada programación de tareas en el núcleo, el objeto de programación real es un hilo; y el proceso solo proporciona recursos como la memoria virtual y las variables globales al hilo. Entonces, para hilos y procesos, podemos entender esto:

  • Cuando el proceso tiene un solo hilo, el proceso puede considerarse igual al hilo.

  • Cuando un proceso tiene múltiples hilos, estos hilos compartirán la misma memoria virtual y variables globales y otros recursos. No es necesario modificar estos recursos durante el cambio de contexto.

  • Además, los subprocesos también tienen sus propios datos privados, como pilas y registros, que también deben guardarse durante el cambio de contexto.

De esta manera, el cambio de contexto del hilo puede dividirse en dos situaciones:

  • Primero, los dos hilos antes y después pertenecen a diferentes procesos. En este momento, debido a que los recursos no se comparten, el proceso de cambio es el mismo que el cambio de contexto del proceso.
  • Segundo, los dos hilos antes y después pertenecen al mismo proceso. En este momento, debido a que la memoria virtual se comparte, al cambiar, los recursos de la memoria virtual permanecen sin cambios, y solo los datos no compartidos, como los datos privados y los registros del hilo, deben cambiarse.

Aquí también debería encontrar que, aunque la misma conmutación de contexto, la conmutación de subprocesos en el mismo proceso consume menos recursos que la conmutación entre múltiples procesos, y esto también es una ventaja de multiproceso en lugar de multiprocesos.

Interrupción de contexto de interrupción

Además de los dos cambios de contexto anteriores, también hay un escenario que también cambia el contexto de la CPU, es decir, las interrupciones.

Para responder rápidamente a los eventos de hardware, el procesamiento de interrupción interrumpe la programación y ejecución normales del proceso y, en su lugar, llama a un controlador de interrupciones para responder a los eventos del dispositivo. Al interrumpir otros procesos, debe guardar el estado actual del proceso, de modo que después de la interrupción, el proceso pueda continuar ejecutándose desde el estado original.

A diferencia del contexto del proceso, la conmutación del contexto de interrupción no involucra el estado del usuario del proceso. Por lo tanto, incluso si el proceso de interrupción interrumpe un proceso que está actualmente en modo de usuario, no hay necesidad de guardar y restaurar los recursos del proceso del usuario, como la memoria virtual y las variables globales del proceso. El contexto de interrupción en realidad incluye solo los estados necesarios para la ejecución del programa de servicio de interrupción en modo kernel, incluidos los registros de CPU, la pila de kernel y los parámetros de interrupción de hardware.

Para la misma CPU, el procesamiento de interrupción tiene una prioridad más alta que los procesos, por lo que la conmutación de contexto de interrupción no ocurre simultáneamente con la conmutación de contexto de proceso. . Del mismo modo, debido a que las interrupciones interrumpen la programación y ejecución de los procesos normales, la mayoría de los manejadores de interrupciones son breves y concisos, de modo que la ejecución puede finalizar lo antes posible.

Además, al igual que la conmutación de contexto de proceso, la conmutación de contexto de interrupción también consume CPU. Demasiados tiempos de conmutación consumirán una gran cantidad de CPU e incluso reducirán seriamente el rendimiento general del sistema. Por lo tanto, cuando descubra que hay demasiadas interrupciones, debe prestar atención para verificar si traerá serios problemas de rendimiento a su sistema.

Resumen

En resumen, no importa qué tipo de escenario provoque el cambio de contexto, debe saber:

  1. El cambio de contexto de la CPU es una de las funciones principales para garantizar el funcionamiento normal del sistema Linux, y generalmente no requiere nuestra atención especial.

2. Sin embargo, demasiados cambios de contexto consumirán tiempo de CPU en el almacenamiento y restauración de datos como registros, pilas de kernel y memoria virtual, acortando así el tiempo real de ejecución del proceso y haciendo que el rendimiento general del sistema disminuya significativamente.

Texto original

https://time.geekbang.org/column/article/69859

Supongo que te gusta

Origin www.cnblogs.com/jinanxiaolaohu/p/12687849.html
Recomendado
Clasificación