← Planificación de la CPU Bloque 6 · Round Robin · Tema 22 de 44

Tema 22

Costo del cambio de contexto

Cada vez que el planificador cambia de proceso, la CPU gasta tiempo en guardar el estado del proceso saliente y restaurar el del entrante. Ese tiempo no se dedica a ningún proceso: es overhead puro. En este tema verás qué incluye un cambio de contexto, cómo se mide en Linux, cómo se incluye en la simulación y por qué es el factor que limita lo corto que puede ser un quantum.

1. Qué es un cambio de contexto

Un cambio de contexto (context switch) es el proceso de guardar el estado del proceso que se está ejecutando y restaurar el estado de otro proceso, para que este último pueda ejecutarse. Es la operación fundamental que permite la multiprogramación: la CPU pasa de un proceso a otro.

El cambio de contexto ocurre en varias situaciones:

Cada cambio de contexto consume tiempo de CPU que no se dedica a ningún proceso. Es overhead puro: trabajo que el sistema hace para poder hacer trabajo.

2. Qué incluye

Un cambio de contexto incluye los siguientes pasos:

  1. Guardar el estado del proceso saliente. Registros de la CPU (PC, SP, registros generales), estado de la FPU, registros de control. guardar
  2. Actualizar la PCB. Guardar el estado en la Process Control Block del proceso saliente (tiempo de CPU usado, estado, etc.). PCB
  3. Cambiar la tabla de páginas. Actualizar el registro CR3 (en x86) para que la MMU use la tabla de páginas del nuevo proceso. memoria
  4. Invalidar la caché TLB. La Translation Lookaside Buffer se invalida porque las traducciones de direcciones virtuales a físicas cambian. TLB
  5. Restaurar el estado del proceso entrante. Cargar los registros desde la PCB del nuevo proceso. restaurar
  6. Volver al modo usuario. La CPU pasa de modo núcleo a modo usuario y continúa la ejecución del nuevo proceso. usuario

Los pasos 3 y 4 (cambio de tabla de páginas e invalidación de TLB) son los más costosos, porque afectan a la memoria y a la caché de traducción de direcciones.

3. Costo directo e indirecto

El costo de un cambio de contexto se divide en dos partes:

TipoQué incluyeCómo se mide
DirectoTiempo de guardar/restaurar registros, actualizar PCB, cambiar tabla de páginas.Medible con perf, strace, etc.
IndirectoPérdida de caché (L1, L2, L3), invalidación de TLB, cold start del nuevo proceso.Difícil de medir directamente. Se estima por la degradación del rendimiento.

El costo directo es pequeño (microsegundos). El costo indirecto puede ser mucho mayor (milisegundos), porque la caché del procesador se llena con datos del nuevo proceso y los datos del anterior se pierden.

El costo indirecto es la razón por la que un quantum muy corto degrada el rendimiento: no es el tiempo de guardar registros, sino la pérdida de caché.

4. Cómo medirlo en Linux

Linux ofrece varias herramientas para medir el costo de un cambio de contexto:

HerramientaQué mideCómo usarla
perf statContadores de hardware: context-switches, cpu-migrations.perf stat -e context-switches ./programa
/proc/PID/statCambios de contexto voluntarios e involuntarios.grep ctxt /proc/PID/status
perf schedLatencia de planificación, duración de los turnos.perf sched record ./programa; perf sched latency
vmstatCambios de contexto por segundo del sistema.vmstat 1
strace -cSyscalls y su tiempo.strace -c ./programa

Ejemplo con perf stat:

terminal · medir cambios de contexto
$ perf stat -e context-switches,cpu-migrations,cycles,instructions ./trabajo 100 A

 Performance counter stats for './trabajo 100 A':

               123      context-switches
                 0      cpu-migrations
     1,234,567,890      cycles
       987,654,321      instructions

       0.345678901 seconds time elapsed

El programa trabajo (del tema 1) hizo 123 cambios de contexto involuntarios (el planificador lo interrumpió 123 veces al expirar el quantum). Con 100 unidades de trabajo (34 s de CPU), eso da un cambio cada 0,28 s, lo que corresponde a un quantum de ~4 ms.

5. Valores típicos

OperaciónTiempo típicoNotas
Cambio de contexto directo1-10 μsGuardar/restaurar registros, cambiar tabla de páginas.
Invalidación de TLB1-5 μsDepende del tamaño de la TLB.
Pérdida de caché L110-100 μsDepende del tamaño de la caché y del patrón de acceso.
Pérdida de caché L2/L3100 μs - 1 msDepende del tamaño de la caché y del patrón de acceso.
Overhead total5-50 μs (directo) + 10-1000 μs (indirecto)El indirecto domina.

El costo directo es pequeño (microsegundos), pero el indirecto puede ser mucho mayor. Por eso, el overhead total de un cambio de contexto puede ser de 10 a 100 veces el costo directo.

En sistemas modernos con cachés grandes (L3 de 32 MB), el costo indirecto puede ser de milisegundos si el nuevo proceso tiene un patrón de acceso muy diferente al anterior.

6. Incluirlo en la simulación

Los simuladores del curso (temas 12, 16, 19, 23) no incluyen el costo del cambio de contexto. Para incluirlo, se añade un tiempo c (costo del cambio) en cada transición entre procesos:

Tiempo de fin de Pi = tiempo de inicio + ráfaga + c (si hay cambio de contexto).

El primer proceso no paga costo de cambio (no hay proceso anterior). Los procesos que se ejecutan consecutivamente sin cambio (porque el anterior terminó y el siguiente empieza inmediatamente) tampoco pagan costo adicional, porque el cambio ya se contabilizó al empezar el anterior.

En la práctica, el costo del cambio de contexto se añade al tiempo total de la simulación, lo que aumenta las métricas de todos los procesos.

roundRobinConCosto.js
function roundRobinConCosto(procesos, quantum, costoCambio) {
    var p = procesos.map(function (x) {
        return { pid: x.pid, llegada: x.llegada, rafaga: x.rafaga,
            restante: x.rafaga, inicio: 0, fin: 0, respuesta: 0,
            espera: 0, retorno: 0, primera: true };
    });
    p.sort(function (a, b) {
        if (a.llegada !== b.llegada) return a.llegada - b.llegada;
        return a.pid - b.pid;
    });
    var cola = [];
    var t = 0;
    var idx = 0;
    var terminados = 0;
    var n = p.length;
    while (idx < n && p[idx].llegada <= t) { cola.push(p[idx]); idx++; }
    while (terminados < n) {
        if (cola.length === 0) {
            t = p[idx].llegada;
            while (idx < n && p[idx].llegada <= t) { cola.push(p[idx]); idx++; }
            continue;
        }
        var proc = cola.shift();
        if (proc.primera) { proc.inicio = t; proc.primera = false; }
        /* Costo de cambio de contexto (si no es el primer proceso). */
        if (t > 0) t += costoCambio;
        var duracion = Math.min(quantum, proc.restante);
        t += duracion;
        proc.restante -= duracion;
        while (idx < n && p[idx].llegada <= t) { cola.push(p[idx]); idx++; }
        if (proc.restante <= 0) {
            proc.fin = t;
            proc.respuesta = proc.inicio - proc.llegada;
            proc.retorno = proc.fin - proc.llegada;
            proc.espera = proc.retorno - proc.rafaga;
            terminados++;
        } else {
            cola.push(proc);
        }
    }
    return p;
}

El costo del cambio se añade al tiempo total, lo que aumenta las métricas de todos los procesos. El impacto es mayor cuanto más corto sea el quantum (más cambios de contexto).

7. Impacto en el quantum

El costo del cambio de contexto es el factor que limita lo corto que puede ser un quantum. Si el cambio tarda c y el quantum es q, el overhead es:

Overhead = c / (c + q) × 100 %

Para que el overhead sea aceptable (por ejemplo, menos del 5 %), se necesita:

q > c / 0,05 − c ≈ 20·c

Si el cambio de contexto tarda 10 μs (costo directo), el quantum mínimo para un overhead del 5 % es 200 μs. Si se incluye el costo indirecto (100 μs), el quantum mínimo es 2000 μs (2 ms).

Esta es la razón por la que los quantums típicos son de 1-10 ms: un quantum más corto tendría un overhead inaceptable.

El quantum no puede ser arbitrariamente corto

El costo del cambio de contexto (especialmente el indirecto) impone un límite inferior al quantum. Un quantum de 100 μs tendría un overhead del 50 % o más, lo que haría a Round Robin ineficiente.

8. Cómo minimizarlo

Los sistemas operativos usan varias técnicas para minimizar el costo del cambio de contexto:

Linux usa afinidad de CPU y quantum adaptativo (en CFS, el tiempo de ejecución se calcula dinámicamente) para minimizar el overhead.

9. Simulador interactivo

Este simulador ejecuta Round Robin con un costo de cambio de contexto configurable. Cambia el costo y observa cómo afecta a las métricas:

Simulador · Round Robin con costo de contexto

ProcesoLlegadaRáfagaInicioFinRespuestaEsperaRetorno

10. Resumen

11. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué es un cambio de contexto?

Guardar el estado del proceso que se ejecuta y restaurar el estado de otro proceso para que este último pueda ejecutarse.

2. ¿Qué incluye un cambio de contexto?

Guardar registros, actualizar PCB, cambiar tabla de páginas, invalidar TLB, restaurar registros, volver a modo usuario.

3. ¿Cuál es la diferencia entre costo directo e indirecto?

El directo es el tiempo de guardar/restaurar (medible). El indirecto es la pérdida de caché (difícil de medir).

4. ¿Cuál es el costo típico de un cambio de contexto directo?

1-10 μs.

5. ¿Cuál es el costo típico del overhead indirecto?

10-1000 μs, dependiendo del tamaño de la caché y del patrón de acceso.

6. ¿Cómo se mide el costo del cambio de contexto en Linux?

Con perf stat, /proc/PID/status, perf sched y vmstat.

7. ¿Por qué el costo del cambio limita el quantum?

Porque un quantum muy corto produce demasiados cambios de contexto y el overhead se dispara.

8. ¿Qué fórmula relaciona el overhead con el quantum?

Overhead = c / (c + q) × 100 %.

9. ¿Qué técnica usa Linux para minimizar el costo del cambio?

Afinidad de CPU (mantener el proceso en el mismo núcleo) y quantum adaptativo.

10. ¿Por qué el costo indirecto es mayor que el directo?

Porque la pérdida de caché afecta a todos los accesos a memoria del nuevo proceso, no solo a la operación de cambio.

Para practicar

  1. Mide el número de cambios de contexto de un programa con perf stat.
  2. Calcula el overhead para c = 5 μs y q = 1 ms, 5 ms, 10 ms.
  3. Modifica el simulador para incluir el costo indirecto (multiplicador).
  4. Compara las métricas con y sin costo de cambio para el mismo conjunto.
  5. Investiga cómo vmstat muestra los cambios de contexto del sistema.
  6. Explica por qué la afinidad de CPU reduce el costo indirecto.