← Planificación de la CPU Bloque 10 · El planificador de Linux · Tema 40 de 44

Tema 40

Simulador de CFS

En los temas anteriores viste CFS, el vruntime y la tabla de pesos. Este tema reúne todo en un simulador interactivo que reproduce el reparto de CFS con distintos valores de nice. El simulador muestra cómo el vruntime crece a diferente velocidad según el nice, y cómo el reparto resultante es proporcional a los pesos.

1. Por qué un simulador de CFS

CFS es más difícil de entender a mano que los algoritmos clásicos porque el vruntime se acumula continuamente y el reparto es proporcional. Un simulador permite ver cómo el vruntime crece a diferente velocidad según el nice, y cómo el reparto resultante es proporcional a los pesos.

Este simulador es el último del bloque 10 y cierra el estudio del planificador de Linux. A partir del bloque 11, se integran todos los algoritmos.

2. El modelo de CFS

El simulador simplifica CFS a sus elementos esenciales:

3. El algoritmo simplificado

El simulador ejecuta CFS de forma simplificada: en cada paso, elige el proceso con menor vruntime y lo ejecuta durante un quantum fijo. El vruntime se actualiza según el peso:

cfs.js
function cfs(procesos, quantum) {
    var p = procesos.map(function (x) {
        return { pid: x.pid, nice: x.nice, peso: peso(x.nice),
            rafaga: x.rafaga, restante: x.rafaga,
            vruntime: 0, inicio: 0, fin: 0, primera: true };
    });
    var t = 0;
    var terminados = 0;
    var n = p.length;
    while (terminados < n) {
        /* Elegir el de menor vruntime entre los listos. */
        var elegido = null;
        for (var i = 0; i < p.length; i++) {
            if (p[i].restante > 0) {
                if (elegido === null || p[i].vruntime < elegido.vruntime) {
                    elegido = p[i];
                }
            }
        }
        if (elegido === null) break;
        if (elegido.primera) { elegido.inicio = t; elegido.primera = false; }
        var duracion = Math.min(quantum, elegido.restante);
        t += duracion;
        elegido.restante -= duracion;
        /* Actualizar vruntime: tiempo_real * (1024 / peso). */
        elegido.vruntime += duracion * (1024 / elegido.peso);
        if (elegido.restante <= 0) {
            elegido.fin = t;
            terminados++;
        }
    }
    return p;
}

4. Gantt del reparto

El Gantt muestra los turnos de cada proceso. Con nice distintos, los procesos con nice más bajo (mayor peso) reciben turnos más largos (o más frecuentes).

5. La tabla de vruntime

La tabla muestra, para cada proceso, su nice, peso, vruntime acumulado, tiempo de CPU y fracción recibida:

6. Los controles

7. Simulador interactivo

Este simulador reproduce el reparto de CFS. Ajusta los nice y observa cómo cambia el vruntime y el reparto:

Simulador · CFS

ProcesoNicePesovruntimeTiempo CPUFracciónInicioFin

8. Verificación y casos de prueba

CasoEntradaResultado esperado
Nice igualesP1(0,10), P2(0,10), nice 0 y 0Reparto 50/50. vruntime iguales.
Nice distintosP1(0,10), P2(0,10), nice 0 y 5P1 recibe más CPU. vruntime de P2 crece más rápido.
Un procesoP1(0,5), nice 0Un bloque 0-5. vruntime = 5.
Quantum 1P1(0,5), P2(0,5), nice 0 y 0, q=110 bloques alternados.

9. Resumen

10. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué muestra el simulador?

El reparto de CPU de CFS con distintos valores de nice.

2. ¿Cómo se calcula el vruntime?

vruntime += tiempo_real × (1024 / peso).

3. ¿Qué proceso se ejecuta primero?

El que tiene menor vruntime.

4. ¿Cómo afecta el nice al vruntime?

Nice más bajo = mayor peso = acumulación más lenta = más CPU.

5. ¿Qué es el quantum en el simulador?

La duración de cada turno de CPU.

6. ¿Qué muestra la tabla?

Nice, peso, vruntime, tiempo de CPU, fracción, inicio y fin de cada proceso.

7. ¿Qué ocurre con nice iguales?

Reparto equitativo (50/50 para dos procesos).

8. ¿Qué bloque del curso cierra este simulador?

El bloque 10 (el planificador de Linux).

9. ¿Por qué el vruntime de un proceso con nice +5 crece más rápido?

Porque su peso es menor (335), así que el factor 1024/335 = 3,06 es mayor.

10. ¿Qué es la fracción de CPU?

El porcentaje de tiempo de CPU que recibe cada proceso.

Para practicar

  1. Ejecuta el simulador con nice 0 y 0, y verifica el reparto 50/50.
  2. Cambia el nice de P2 a +10 y observa cómo cambia el reparto.
  3. Modifica el simulador para añadir un cuarto proceso con nice distinto.
  4. Calcula el vruntime final de cada proceso.
  5. Compara el simulador con el comportamiento real de Linux (nice y top).
  6. Investiga cómo se implementa el árbol rojinegro en CFS.