Cambio de contexto


En informática , un cambio de contexto es el proceso de almacenar el estado de un proceso o hilo , para que pueda restaurarse y reanudar la ejecución en un momento posterior, 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 multiprogramación o multitarea.. In a traditional CPU, each process - a program in execution - utilizes the various CPU registers to store data and hold the current state of the running process. However, in a multitasking operating system, the operating system switches between processes or threads to allow the execution of multiple processes simultaneously. For every switch, the operating system must save the state of the currently running process, followed by loading the next process state, which will run on the CPU. This sequence of operations that stores the state of the running process and the loading of the following running process is called a context switch.

El significado preciso de la frase "cambio de contexto" varía. En un contexto de multitarea, se refiere al proceso de almacenar el estado del sistema para una tarea, de modo que esa tarea pueda pausarse y reanudarse otra. Un cambio de contexto también puede ocurrir como resultado de una interrupción , como 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 pasar del modo de usuario al modo de kernel . El proceso de cambio de contexto puede tener un impacto negativo en el rendimiento del sistema. [2] : 28 

Los cambios de contexto suelen ser intensivos en términos computacionales y gran parte del diseño de los sistemas operativos tiene como objetivo optimizar el uso de los cambios de contexto. Cambiar de un proceso a otro requiere una cierta cantidad de tiempo para realizar la administración: guardar y cargar registros y mapas de memoria, actualizar varias tablas y listas, etc. Lo que realmente implica un cambio de contexto depende de las arquitecturas, los sistemas operativos y la cantidad de recursos compartidos (los subprocesos que pertenecen al mismo proceso comparten muchos recursos en comparación con procesos no relacionados que no cooperan).

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 de PCB en la pila del kernel para recuperar información sobre el estado del nuevo proceso. La información del estado de la CPU, incluidos los registros, el puntero de la pila y el contador del programa , así como información de administración de la memoria, como tablas de segmentación y tablas de páginas (a menos que el proceso anterior comparta la memoria con el nuevo), se cargan desde la PCB para el nuevo proceso. Para evitar una traducción incorrecta de direcciones en el caso de que los procesos anterior y actual utilicen memoria diferente, el búfer de búsqueda de traducción(TLB) debe lavarse. Esto afecta negativamente al rendimiento porque cada referencia de memoria al TLB se perderá porque estará vacía después de la mayoría de los cambios de contexto. [3] [4]

Además, el cambio de contexto análogo ocurre entre hilos de usuario , en particular hilos verdes , y a menudo es muy liviano, ya que ahorra y restaura un contexto mínimo. En casos extremos, como el cambio entre gorutinas en Go , un cambio de contexto es equivalente a un rendimiento de corrutina , que es sólo marginalmente más caro que una llamadaa subrutina .

Lo más habitual es que, dentro de algún esquema de programación , se deba desconectar un proceso de la CPU para que pueda ejecutarse otro proceso. Este cambio de contexto puede desencadenarse cuando el proceso se vuelve inejecutable, como al esperar a que se complete una operación de E/S o de sincronización . En un sistema multitarea preventivo , el programador también puede desactivar procesos que aún son ejecutables. Para evitar que otros procesos se vean privados de tiempo de CPU, los programadores preventivos a menudo configuran una interrupción del temporizador para que se active cuando un proceso excede su intervalo de tiempo . Esta interrupción garantiza que el programador obtendrá el control para realizar un cambio de contexto.