Vamos a ver cómo un sistema operativo sencillo ejecuta varios programas y se mantiene ágil gracias al cambio de contexto. De la memoria virtual al temporizador, lo contamos de forma clara.
Imaginamos dos programas distintos, uno que calcula la secuencia de Fibonacci y otro que dibuja un conjunto de Mandelbrot. Cada uno cree que es el único dueño de la máquina, pero el sistema le ofrece su propia vista del mundo con memoria virtual. Usamos tablas de páginas para traducir direcciones lógicas a direcciones físicas y así aislamos a los procesos, evitamos pisar memoria y ganamos estabilidad.
Un proceso es la instancia en ejecución de un programa, con su espacio de direcciones, registros y pila. En multitarea cooperativa, cada proceso debe ceder el control por voluntad propia. Suena educado, pero si un proceso se queda colgado o decide no ceder, el resto se queda esperando y el sistema pierde respuesta.
La alternativa moderna es usar un temporizador que dispara interrupciones periódicas. Cuando suena, el procesador entra en el núcleo, guardamos los registros, el contador de programa, la pila y la referencia a la tabla de páginas del proceso actual, elegimos el siguiente en cola y cargamos su estado. Ese salto ordenado entre estados es el cambio de contexto, y nos permite repartir el tiempo entre muchos sin peleas.
Además de ese latido regular, reaccionamos a otros eventos como la entrada del teclado o la llegada de datos. Si un proceso espera entrada y salida, lo marcamos como bloqueado y damos paso a otro. Con un periodo típico de unos cien milisegundos parece que todo corre a la vez. En realidad, la mayoría de programas pasan buena parte del tiempo esperando, y ahí el planificador saca brillo usando cada hueco del procesador.
Interrumpir a mitad de una operación puede romper su atomicidad. Para evitar líos aplicamos secciones críticas pequeñas, desactivamos interrupciones lo justo en momentos delicados y usamos primitivas de sincronización como semáforos o bloqueos ligeros. Así prevenimos condiciones de carrera, mantenemos datos coherentes y dormimos tranquilos.
Propuesta para jugar y aprender: preparamos cartas de procesos con tiempos de procesador y eventos de entrada y salida, un reloj y una lista circular. Actuamos como planificador, cambiamos de proceso cada latido y anotamos cuándo bloquear y cuándo despertar.
Si queremos seguir explorando estas ideas con juegos y ejemplos, visitemos JeiJoLand.