¿Cuál es la diferencia entre el cambio de contexto y el manejo de interrupciones?

Esa es una pregunta perspicaz: hay similitudes y diferencias. Es importante entender qué es cada uno y por qué existen.

El cambio de contexto es el proceso de cambiar un proceso de trabajar en una tarea a trabajar en otra incluso antes de que se complete la tarea anterior. Esto implica guardar el estado de todos los datos volátiles como registros, contador de programas, memoria, etc. (en otras palabras, el “contexto”) en un almacenamiento persistente y luego cargar el contexto de un nuevo proceso. O simplemente iniciando un nuevo proceso desde cero que tendrá su propio contexto. Esta técnica permite que un proceso funcione simultáneamente en múltiples tareas sin la necesidad de requerir que una se ejecute hasta su finalización.

El manejo de interrupciones es el proceso de un procesador o proceso que recibe una señal asincrónica que generalmente requiere que “caiga” lo que sea que esté haciendo y trabaje en esta interrupción de inmediato. Por definición, requiere un cambio de contexto para lograr esto. Una vez que se repara la interrupción, la tarea anterior puede reanudarse. Las interrupciones pueden ser hardware (que parece ser a lo que se refiere) o software (como señales UNIX).

Entonces, el manejo de interrupciones requiere un cambio de contexto y su pregunta real probablemente fue: ¿son intercambiables los términos? No, porque puede tener un cambio de contexto que no esté impulsado por una interrupción asincrónica impredecible. El uso más obvio sería en un sistema operativo multitarea que permita que múltiples procesos se ejecuten simultáneamente en el mismo procesador (que no debe confundirse con el procesamiento paralelo en diferentes procesadores). Para hacer esto, el sistema operativo necesita la capacidad de ejecutar parte de un proceso, guardar su estado y luego ejecutar otro proceso. En un sistema operativo de tiempo compartido, esto se haría dando un intervalo de tiempo fijo compartido en una operación por turnos entre procesos. También hay otras formas, basadas en la sincronización de condiciones, etc.

En pocas palabras, el manejo de interrupciones es solo un ejemplo de por qué necesitaría un cambio de contexto. Como algunos comentarios menores sobre su pregunta, es poco probable que el estado del procesador se guarde en una pila, probablemente esté en un montón. Porque el patrón no tiene que ser LIFO. También un controlador tiene mucho un sistema operativo. Simplemente no es un gran sistema operativo famoso como Windows o Linux. Por definición, tiene un sistema operativo porque eso es lo que está haciendo el cambio de contexto. Simplemente es un sistema operativo integrado relativamente simple.

Varias preguntas para responder aquí:

A) ¿Qué es un contexto?

Un contexto es el estado de la máquina correspondiente a un solo hilo de ejecución. Por lo tanto, el cambio de contexto implica detener la ejecución de un subproceso en una CPU e iniciar la ejecución de otro subproceso. La semántica del cambio de contexto generalmente requiere que todo el proceso sea transparente para los subprocesos, por lo que, para implementar un cambio de contexto, el planificador debe hacer una copia de seguridad de la mayoría de las cosas (al menos aquellas que no deben cambiar para que el proceso continúe ejecutar correctamente en el futuro) cuyo estado ha afectado el hilo en ejecución antes de sacarlo de la CPU. Luego, cuando el planificador decide volver a ejecutar el mismo subproceso, el estado de los elementos de la CPU se restaura a partir de la copia de seguridad.

B) ¿Qué es una interrupción?

Una interrupción es algo que hace que la CPU comience a ejecutar la rutina de servicio de interrupción [ISR] . El ISR es un procedimiento de núcleo predeterminado que maneja todo tipo de cosas, desde trampas de dispositivo / bus hasta accesos no válidos a la memoria y hasta instrucciones especializadas como las que se usan para hacer llamadas al sistema. El propósito del ISR es una decisión general para decidir el próximo curso de acción en un escenario en el que no se puede confiar en la lógica del hardware para hacer lo correcto. Esto hace que las partes síncronas del manejo de interrupciones caigan fuera del control del planificador y, por lo tanto, no se considera realmente un proceso. Al igual que el cambio de contexto, se requiere que el servicio de interrupción sea transparente para el proceso que se ejecuta en la CPU justo antes de que llegue la interrupción, por lo que una vez más, guardamos el contexto antes de manejar la interrupción y luego restauramos el contexto una vez más cuando el controlador de interrupciones tiene correr.

C) ¿Quién hace posible un cambio de contexto?

El planificador (parte del núcleo) es responsable de decidir qué proceso debe ejecutarse en la CPU en un momento dado.

D) ¿Cuándo ocurren los cambios de contexto?

Una vez que se ha programado el primer proceso de usuario en la CPU, los cambios de contexto solo pueden ocurrir cuando se llama a la rutina de servicio de interrupción. La rutina de servicio de interrupción invoca al planificador que luego decide qué debe ejecutarse a continuación. El planificador generalmente se invoca periódicamente configurando temporizadores de hardware (basados ​​en decrementadores) que interrumpen la CPU cuando caducan. Sin embargo, otros escenarios son posibles. Por ejemplo, el proceso del usuario puede haber invocado al programador al hacer una llamada al sistema o una acción no permitida, como un acceso deficiente a la memoria al ejecutar una instrucción privilegiada, etc. (excepciones).

E) ¿Qué sucede durante un cambio de contexto?

Los registros de la CPU que se vieron afectados por el subproceso que se está moviendo deben respaldarse (y restaurarse más adelante). Los cachés de hardware y los TLB solo tienen sentido en el contexto del proceso en ejecución, por lo que durante un cambio de contexto, estos se vacían / ​​invalidan. Además, las páginas de memoria utilizadas por el proceso pueden haberse vaciado al disco y asignado al nuevo proceso para darle espacio a este último.

En resumen, se ven iguales porque a) el cambio de contexto es realmente una de las cosas que puede hacer cuando se produce una interrupción, yb) porque ambos requieren que los procesos de espacio de usuario en ejecución no sepan nada sobre ellos.

Un concepto estrechamente relacionado en Linux es un cambio de modo. Se sabe que cosas como la caché y las entradas TLB son demasiado valiosas para descartarlas en un abrir y cerrar de ojos, por lo que la parte asincrónica del controlador de excepciones se ejecuta en el mismo contexto que el proceso que desencadenó la excepción. En este caso, en lugar de decir que se está ejecutando un hilo separado del kernel, preferimos decir que el proceso se ejecuta en modo kernel, y el acto se llama cambio de modo.

Como conceptos, no son de ninguna manera similares, pero juegan un papel en algunas operaciones comunes. En primer lugar, debe comprender que, si bien funcionan de manera similar en todas las arquitecturas, los detalles de implementación reales y las operaciones exactas que realizan difieren de una arquitectura a otra.

En primer lugar, cuando se habla de cambio de contexto, hay múltiples escenarios. La más simple, que ocurre incluso en las MCU más simples y sin la presencia de un sistema operativo, es cuando hay una interrupción pendiente y el procesador comienza a manejarla. Parte de los registros se guardan y la ejecución se mueve a la rutina de manejo de interrupciones. Esta operación es un cambio de contexto a ‘interrumpir contexto’. Entonces, sí, un cambio de contexto también ocurre cuando se da servicio a una interrupción. En los sistemas que ejecutan un sistema operativo, también es necesario cambiar entre tareas / procesos. El planificador del sistema operativo lo hace e implica: guardar los registros de la tarea actual en la estructura del sistema operativo de esa tarea, actualizar las listas del sistema operativo y los datos internos y, en los sistemas con una MMU (Unidad de gestión de memoria), el procesador también debe tener su tabla de páginas actualizado. Obviamente, esto solo está rascando la superficie, ya que el sistema operativo puede decidir no actualizar la tabla de páginas si el cambio es entre hilos del mismo proceso.

Para concluir, el procesador necesita cambiar el contexto para manejar una interrupción y luego volver a cambiar el contexto cuando haya terminado, pero ese es prácticamente el único vínculo entre los dos conceptos.

  1. Un cambio de contexto (también denominado a veces cambio de proceso o cambio de tarea ) es el cambio de la CPU (unidad central de procesamiento) de un proceso o subproceso a otro.
  2. Un contexto es el contenido de los registros de la CPU y el contador del programa en cualquier momento.
  3. Un cambio de contexto se puede describir como:
  • (1) suspender la progresión de un proceso y almacenar el estado de la CPU (es decir, el contexto) para ese proceso en algún lugar de la memoria ,
  • (2) recuperar el contexto del siguiente proceso de la memoria y restaurarlo en los registros de la CPU y
  • (3) volver a la ubicación indicada por el contador del programa (es decir, volver a la línea de código en la que se interrumpió el proceso) para reanudar el proceso.

Un cambio de contexto también puede ocurrir como resultado de una interrupción de hardware.

La mayoría de los sistemas operativos modernos realizan el cambio de contexto de software

En interrupción:

Cuando se produce una interrupción, el hardware cambia automáticamente una parte del contexto (al menos lo suficiente como para permitir que el controlador vuelva al código interrumpido). El controlador puede guardar contexto adicional, dependiendo de los detalles de los diseños particulares de hardware y software. A menudo, solo se modifica una parte mínima del contexto para minimizar la cantidad de tiempo dedicado a manejar la interrupción.

El manejo de interrupciones y el cambio de contexto son similares pero no iguales. El cambio de contexto ocurre cada vez que el procesador requiere intercambiar el proceso en ejecución desde la CPU. El cambio de contexto guarda los valores de registro como Registro de instrucciones, Contador de programas y registros similares del proceso en ejecución en una pila; cambia el estado del proceso en ejecución de listo a bloqueado (si va para E / S); empujarlo y elimina el proceso en ejecución de la CPU. Se necesita el siguiente proceso para ejecutarse y ponerlo en la CPU después de volver a cargar el valor de los registros de la pila del proceso a ejecutar en los registros, cambiando su estado de listo para ejecutarse. Aquí tanto el proceso son procesos de usuario.

Donde como en una interrupción, el proceso se inicia desde el Kernel. Tiene la máxima prioridad. Hay ciertas situaciones en las que el proceso del kernel tiene que ejecutarse, como cuando el proceso del usuario accede a ubicaciones de memoria fuera de su alcance, tiene que terminar el proceso del usuario sin hacer más preguntas, solicitudes de E / S de memoria y cosas similares. Aquí, la CPU lo considerará como una interrupción y pondrá el proceso en ejecución en estado listo, realiza el proceso de CONTEXT SWITCHING pero aquí ejecuta un PROCESO KERNEL a continuación, en lugar del proceso del usuario y después del servicio, la CPU dirige su atención hacia el proceso del usuario . La prioridad del proceso del usuario y del núcleo es la diferencia esencial entre los dos. Por lo tanto, la CONMUTACIÓN DE CONTEXTO ocurre incluso en caso de SOLICITUD DE INTERRUPCIÓN.

Ambos son conceptos diferentes y no hay comparación. El cambio de contexto es guardar el contexto de una tarea / subproceso y cargar y ejecutar la otra tarea / subproceso de alta prioridad. El manejo de interrupciones está respondiendo al evento / interrupción. Escribimos el código del controlador de interrupciones para una interrupción particular y nos registramos en la tabla de vectores. Entonces, cuando el procesador recibe la interrupción, el procesador salta a un índice particular en la tabla de vectores y llama al manejador de interrupciones.

Procesos de programación del sistema operativo (cuando los sistemas operativos son “tiempo compartido”).

Entonces, hay una cola “lista” (significa lista para ejecutarse) y una cola “en espera de E / S”, que es, bueno, los procesos que intentaron hacer E / S y esperan que la E / S termine.

Si un proceso está en la cola lista, la CPU lo toma, lo ejecuta y cuando el proceso realiza E / S, lo coloca en la cola “esperando E / S” mientras el sistema operativo programa internamente todas las operaciones de E / S.

¿Qué sucede si un proceso no hace E / S?

El hardware ejecuta un controlador de interrupciones para programar otro proceso. Esto puede suceder varias veces por segundo, pero generalmente cada 100 ms una vez que un proceso se toma de la cola lista al estado de “ejecución”.

Por lo tanto, el “cambio de contexto” consiste en colocar todos los valores de los registros en un solo lugar (guardarlo) para que cuando se reanude el proceso, los valores sean exactamente como antes. Normalmente, ese lugar podría ser la pila de procesos, porque cada proceso tiene su propia pila, y la pila no se utilizará hasta que se reanude el proceso.