Articulo de referencia

Cambio de contexto

En informática , un cambio de contexto es el proceso de almacenar el estado de un proceso o hilo para poder restaurarlo y reanudar su ejecución posteriormente, y luego restaurar...

En informática , un cambio de contexto es el proceso de almacenar el estado de un proceso o hilo para poder restaurarlo y reanudar su ejecución posteriormente, y luego restaurar un estado diferente, previamente guardado. [ 1 ] Esto permite que múltiples procesos compartan una única unidad central de procesamiento (CPU) y es una característica esencial de un sistema operativo multitarea o multiprogramación . En una CPU tradicional, cada proceso ( un programa en ejecución ) utiliza los distintos registros de la CPU para almacenar datos y mantener el estado actual del proceso en ejecución. Sin embargo, en un sistema operativo multitarea, el sistema operativo cambia entre procesos o hilos para permitir la ejecución simultánea de múltiples procesos. [ 2 ] Para cada cambio, el sistema operativo debe guardar el estado del proceso que se está ejecutando, seguido de la carga del estado del siguiente proceso, que se ejecutará en la CPU. Esta secuencia de operaciones que almacena el estado del proceso en ejecución y carga el siguiente proceso en ejecución se denomina cambio de contexto.  

El significado preciso de la frase "cambio de contexto" varía. En un contexto multitarea, se refiere al proceso de almacenar el estado del sistema para una tarea, de modo que esta pueda pausarse y otra reanudarse. Un cambio de contexto también puede ocurrir como resultado de una interrupción , por ejemplo, cuando una tarea necesita acceder al almacenamiento en disco , liberando tiempo de CPU para otras tareas. Algunos sistemas operativos también requieren un cambio de contexto para alternar entre tareas en modo usuario y en modo kernel . El proceso de cambio de contexto puede tener un impacto negativo en el rendimiento del sistema. [ 3 ] : 28

Costo

Los cambios de contexto suelen ser computacionalmente intensivos, y gran parte del diseño de los sistemas operativos se centra en optimizar su uso. Cambiar de un proceso a otro requiere cierto tiempo para realizar tareas administrativas : guardar y cargar registros y mapas de memoria, actualizar tablas y listas, etc. Lo que implica un cambio de contexto depende de la arquitectura, el sistema operativo y la cantidad de recursos compartidos (los subprocesos que pertenecen al mismo proceso comparten muchos más recursos que los procesos independientes que no cooperan entre sí). 

Por ejemplo, en el kernel de Linux , el cambio de contexto implica cargar el bloque de control de proceso (PCB) correspondiente, almacenado en la tabla PCB de la pila del kernel, para recuperar información sobre el estado del nuevo proceso. La información de estado de la CPU, incluidos los registros, el puntero de pila y el contador de programa , así como la información de gestión de memoria, como las tablas de segmentación y las tablas de páginas (a menos que el proceso anterior comparta la memoria con el nuevo), se cargan desde el PCB para el nuevo proceso. Para evitar una traducción de direcciones incorrecta en el caso de que los procesos anterior y actual utilicen memoria diferente, el búfer de traducción anticipada (TLB) debe vaciarse. Esto afecta negativamente al rendimiento porque cada referencia de memoria al TLB será un fallo, ya que está vacío después de la mayoría de los cambios de contexto. [ 4 ] [ 5 ]

Además, se produce un cambio de contexto análogo entre hilos de usuario , especialmente entre hilos ligeros , y suele ser muy eficiente, conservando y restaurando un contexto mínimo. En casos extremos, como al cambiar entre goroutines en Go , un cambio de contexto equivale a una operación de cesión de corrutina , que es solo ligeramente más costosa que una llamada a subrutina .

Cambio de casos

Existen tres posibles desencadenantes de un cambio de contexto:

Multitarea

Generalmente, en algunos esquemas de planificación , un proceso debe ser desconectado de la CPU para que otro pueda ejecutarse. Este cambio de contexto puede ser provocado por el propio proceso, que se vuelve inoperativo, por ejemplo, al esperar a que finalice una operación de E/S o de sincronización . En un sistema multitarea con prioridad , el planificador también puede desconectar procesos que aún están en ejecución. Para evitar que otros procesos se queden sin tiempo de CPU, los planificadores con prioridad suelen configurar una interrupción de temporizador que se activa cuando un proceso supera su intervalo de tiempo . Esta interrupción garantiza que el planificador tome el control para realizar el cambio de contexto.

Manejo de interrupciones

Las arquitecturas modernas se basan en interrupciones . Esto significa que si la CPU solicita datos de un disco, por ejemplo, no necesita esperar activamente hasta que finalice la lectura; puede enviar la solicitud (al dispositivo de E/S) y continuar con otra tarea. Cuando finaliza la lectura, la CPU puede ser interrumpida (en este caso por un hardware, que envía una solicitud de interrupción al PIC ) y recibir los datos leídos. Para las interrupciones, se instala un programa llamado controlador de interrupciones , que es el encargado de gestionar la interrupción proveniente del disco.

Cuando se produce una interrupción, el hardware cambia automáticamente parte del contexto (al menos lo suficiente para que el controlador pueda volver al código interrumpido). El controlador puede guardar contexto adicional, dependiendo de las características específicas del hardware y el software. A menudo, solo se modifica una parte mínima del contexto para minimizar el tiempo dedicado a gestionar la interrupción. El núcleo no crea ni programa un proceso especial para gestionar las interrupciones, sino que el controlador se ejecuta en el contexto (a menudo parcial) establecido al inicio de la gestión de la interrupción. Una vez finalizada la gestión de la interrupción, se restaura el contexto vigente antes de que ocurriera, de modo que el proceso interrumpido pueda reanudar su ejecución en su estado correcto.

Cambio de modo de usuario y de kernel

Cuando el sistema realiza la transición entre el modo de usuario y el modo kernel , no es necesario un cambio de contexto; una transición de modo no constituye en sí misma un cambio de contexto. Sin embargo, dependiendo del sistema operativo, también puede producirse un cambio de contexto en ese momento.

Pasos

Es necesario guardar el estado del proceso que se está ejecutando actualmente para poder restaurarlo cuando se vuelva a programar su ejecución.

El estado del proceso incluye todos los registros que el proceso pueda estar utilizando, especialmente el contador de programa , además de cualquier otro dato específico del sistema operativo que pueda ser necesario. Esto generalmente se almacena en una estructura de datos llamada bloque de control de proceso (PCB) o marco de conmutación .

El PCB podría almacenarse en una pila por proceso en la memoria del kernel (a diferencia de la pila de llamadas en modo usuario ), o podría existir alguna estructura de datos específica definida por el sistema operativo para esta información. Se agrega un identificador al PCB a una cola de procesos que están listos para ejecutarse, a menudo llamada cola de listos .

Dado que el sistema operativo ha suspendido la ejecución de un proceso, puede cambiar de contexto seleccionando un proceso de la cola de procesos listos y restaurando su PCB. Al hacerlo, se carga el contador de programa del PCB, permitiendo así que la ejecución continúe en el proceso seleccionado. La prioridad del proceso y del hilo puede influir en la selección del proceso de la cola de procesos listos (es decir, puede tratarse de una cola de prioridad ).

Ejemplos

Los detalles varían según la arquitectura y el sistema operativo, pero estos son escenarios comunes.

No se necesita cambiar de contexto

Consideremos la suma aritmética general A = B + 1. La instrucción se almacena en el registro de instrucciones y se incrementa el contador de programa . A y B se leen de la memoria y se almacenan en los registros R1 y R2, respectivamente. En este caso, se calcula B + 1 y se escribe en R1 como resultado final. Esta operación solo requiere lecturas y escrituras secuenciales, y no se utilizan esperas para las llamadas a funciones ; por lo tanto, no se produce ningún cambio de contexto ni espera.

Cambio de contexto provocado por una interrupción

Supongamos que un proceso A se está ejecutando y se produce una interrupción del temporizador. Los registros de usuario  (contador de programa, puntero de pila y registro de estado  ) del proceso A son guardados implícitamente por la CPU en la pila del kernel de A. A continuación, el hardware cambia al modo kernel y salta al manejador de interrupciones para que el sistema operativo tome el control. El sistema operativo llama entonces a la switch()rutina para guardar primero los registros de usuario de propósito general de A en la pila del kernel de A, luego guarda los valores actuales de los registros del kernel de A en el PCB de A, restaura los registros del kernel desde el PCB del proceso B y cambia de contexto, es decir, cambia el puntero de la pila del kernel para que apunte a la pila del kernel del proceso B. El sistema operativo regresa entonces de la interrupción. El hardware carga entonces los registros de usuario desde la pila del kernel de B, cambia al modo usuario y comienza a ejecutar el proceso B desde el contador de programa de B. [ 6 ]

Actuación

El cambio de contexto en sí mismo tiene un costo en el rendimiento, debido a la ejecución del planificador de tareas , los vaciados de la TLB e indirectamente debido a que se comparte la caché de la CPU entre varias tareas. [ 7 ] Cambiar entre hilos de un solo proceso puede ser más rápido que entre dos procesos separados porque los hilos comparten los mismos mapas de memoria virtual , por lo que no es necesario vaciar la TLB. [ 8 ]

El tiempo que tarda en cambiarse entre dos procesos distintos se denomina latencia de cambio de proceso . El tiempo que tarda en cambiarse entre dos hilos del mismo proceso se denomina latencia de cambio de hilo . El tiempo que transcurre desde que se genera una interrupción de hardware hasta que se atiende se denomina latencia de interrupción .

Cambiar entre dos procesos en un sistema operativo con un único espacio de direcciones puede ser más rápido que cambiar entre dos procesos en un sistema operativo con espacios de direcciones privados por proceso. [ 9 ]

Hardware frente a software

El cambio de contexto puede realizarse principalmente por software o hardware. Algunos procesadores, como el Intel 80386 y sus sucesores, [ 10 ] cuentan con soporte de hardware para cambios de contexto, mediante el uso de un segmento de datos especial denominado segmento de estado de tarea (TSS). Un cambio de tarea puede activarse explícitamente con una instrucción CALL o JMP dirigida a un descriptor TSS en la tabla de descriptores global . También puede ocurrir implícitamente cuando se activa una interrupción o excepción si existe una puerta de tarea en la tabla de descriptores de interrupción (IDT). Cuando se produce un cambio de tarea, la CPU puede cargar automáticamente el nuevo estado desde el TSS.

Al igual que con otras tareas realizadas en hardware, cabría esperar que esto fuera bastante rápido; sin embargo, los sistemas operativos más comunes, incluidos Windows y Linux , [ 11 ] no utilizan esta función. Esto se debe principalmente a dos razones:

  • El cambio de contexto de hardware no guarda todos los registros (solo los registros de propósito general, no los de punto flotante ; aunque el TSbit se activa automáticamente en el CR0registro de control , lo que provoca un fallo al ejecutar instrucciones de punto flotante y le da al sistema operativo la oportunidad de guardar y restaurar el estado de punto flotante según sea necesario).
  • Los problemas de rendimiento asociados, por ejemplo, permiten que el cambio de contexto por software sea selectivo y almacene solo los registros necesarios, mientras que el cambio de contexto por hardware almacena casi todos los registros, sean necesarios o no.

Véase también

Referencias

  1. Douglas Comer; Timmothy V. Fossum (1988). "4 Planificación y cambio de contexto". Diseño de sistemas operativos . Vol.  I: El enfoque XINU (Edición para PC). Prentice Hall. pág.  67. ISBN 0-13-638180-4El cambio de contexto es fundamental para la gestión de procesos. Consiste en detener el cálculo actual, guardar suficiente información para poder reiniciarlo posteriormente y reiniciar otro proceso .
  2. O de forma tan rápida y secuencial que parecen ser simultáneas.
  3. Tanenbaum, Andrew S.; Bos, Herbert (20 de marzo de 2014). Sistemas operativos modernos (4.ª ed.). Pearson. ISBN  978-0133591620.
  4. Núcleo Linux IA-64: Diseño e implementación , 4.7 Cambio de espacios de direcciones
  5. Sistemas Operativos , 5.6 El cambio de contexto, pág. 118
  6. Arpaci-Dusseau, Remzi; Arpaci-Dusseau, Andrea (2015). Sistemas operativos: tres piezas fáciles . Archivado del original el 25 de julio de 2016. Recuperado el 25 de julio de 2016 .
  7. Chuanpeng Li; Chen Ding; Kai Shen. Cuantificación del coste del cambio de contexto (PDF) . Conferencia de Investigación en Computación Federada de la ACM , San Diego, 13-14 de junio de 2007. Archivado (PDF) del original el 13 de agosto de 2017.
  8. Ulrich Drepper (9 de octubre de 2014). "Memoria parte 3: Memoria virtual" . LWN.net .
  9. DL Sims. "Espacios de direcciones múltiples y únicos: hacia un punto intermedio". 1993. doi : 10.1109/IWOOOS.1993.324906
  10. "Definición de cambio de contexto" . Linfo.org. Archivado del original el 18 de febrero de 2010. Consultado el 8 de septiembre de 2013 .
  11. ^ Bovet, Daniel Pierre; Cesati, Marco (2006). Comprensión del kernel de Linux, tercera edición . Medios O'Reilly . pag. 104.ISBN  978-0-596-00565-8. Consultado el 23 de noviembre de 2009 .
  • Cambio de contexto en OSDev.org
  • Definición de cambio de contexto según el Proyecto de Información de Linux (LINFO)
  • Cambios de contexto de la Red de Desarrolladores de Microsoft (MSDN)
  • Arquitectura y diseño general - Manejo de interrupciones en FreeBSD.org
  • Cambio de contexto del sistema operativo - Computerphile