← Planificación de la CPU Bloque 5 · Planificación por prioridades · Tema 18 de 44

Tema 18

Inanición y envejecimiento

La inanición (starvation) ocurre cuando un proceso espera indefinidamente porque siempre hay otros procesos que se ejecutan antes. Es el precio de optimizar: SJF y la planificación por prioridades favorecen a los procesos cortos o importantes, y los largos o de baja prioridad pueden quedar bloqueados para siempre. El envejecimiento (aging) es la solución: aumentar la prioridad de un proceso a medida que espera, hasta que finalmente se ejecute. En este tema verás cómo ocurre la inanición, por qué es un problema real y cómo se implementa el envejecimiento.

1. Qué es la inanición

La inanición (starvation) ocurre cuando un proceso está listo para ejecutarse pero nunca recibe la CPU, porque siempre hay otros procesos que tienen preferencia sobre él. El proceso espera indefinidamente: no termina, no progresa, no responde.

La inanición no es un bloqueo (deadlock): el proceso no está esperando un recurso que nunca se libera; está esperando la CPU, que se da a otros procesos. La CPU está disponible, pero el planificador nunca la elige.

La inanición es un problema de equidad (fairness): el sistema favorece a unos procesos a costa de otros. Es el precio de la optimización: SJF favorece a los cortos, la planificación por prioridades favorece a los importantes, y los largos o de baja prioridad pagan el costo.

Inanición vs bloqueo

En un bloqueo (deadlock), el proceso espera un recurso que nunca se libera. En la inanición, el proceso espera la CPU, que se da a otros. La diferencia es que en la inanición el sistema podría darle la CPU, pero elige no hacerlo.

2. Cuándo ocurre

La inanición ocurre en algoritmos que favorecen a ciertos procesos sobre otros:

La inanición NO ocurre en:

3. Un ejemplo desarrollado

Un proceso largo (P1, ráfaga 20) llega en 0. Después llegan procesos cortos (ráfaga 1) cada 1 unidad de tiempo:

ProcesoLlegadaRáfaga
P1020
P211
P321
P431
......1

En SJF no apropiativo, P1 se ejecuta primero (0-20). Los procesos cortos que llegan durante su ejecución esperan. Cuando P1 termina, se ejecutan los cortos en orden. No hay inanición porque P1 ya se ejecutó.

Pero si los procesos cortos llegan antes de que P1 empiece (todos en 0, o P1 llega después), la situación cambia. Supongamos que P1 (ráfaga 20) llega en 0, y P2, P3, ... (ráfaga 1) llegan en 0, 1, 2, ... En SJF, los cortos se ejecutan primero. Si llegan suficientes cortos, P1 espera indefinidamente.

En la planificación por prioridades, el caso es más claro: si P1 tiene prioridad 1 y los cortos tienen prioridad 5, P1 nunca se ejecuta mientras haya cortos listos. Y si los cortos llegan continuamente, P1 espera para siempre.

Inanición: P1 espera indefinidamente mientras los procesos cortos se ejecutan. CPU P2 P3 P4 P5 P6 … Pn … (infinito) P1 (ráfaga 20, prioridad baja) P1 espera indefinidamente
P1 nunca recibe la CPU porque siempre hay procesos más cortos o de mayor prioridad.

4. Consecuencias

La inanición tiene consecuencias graves:

La inanición es un problema de liveness (vivacidad): el sistema está activo, pero un proceso individual no progresa. Es distinto de un deadlock, donde todo el sistema se bloquea.

5. Qué es el envejecimiento

El envejecimiento (aging) es una técnica que aumenta gradualmente la prioridad de un proceso a medida que espera. Con el tiempo, un proceso de baja prioridad acumula suficiente prioridad para superar a los procesos nuevos y finalmente ejecutarse.

El envejecimiento garantiza que todo proceso que espera suficiente tiempo finalmente se ejecuta. Es la solución estándar a la inanición en la planificación por prioridades y en SJF.

La idea es simple: la prioridad de un proceso no es fija, sino que aumenta con el tiempo de espera. Un proceso que acaba de llegar tiene su prioridad base; uno que lleva esperando mucho tiene una prioridad mayor.

Envejecimiento garantiza progreso

Con envejecimiento, ningún proceso espera indefinidamente. Eventualmente, su prioridad supera a la de cualquier proceso nuevo y se ejecuta. Es la garantía de liveness que falta en SJF y en la planificación por prioridades.

6. Cómo se implementa

El envejecimiento se puede implementar de varias formas:

MétodoCómo funcionaVentajaDesventaja
Prioridad dinámica por esperaLa prioridad aumenta en 1 cada unidad de tiempo que el proceso espera.Simple, garantiza progreso.Los procesos largos se ejecutan antes de tiempo.
Ráfaga estimada decrecienteLa ráfaga estimada disminuye en 1 cada unidad de tiempo que el proceso espera.Se integra con SJF.Complejo de implementar.
Umbral de esperaSi un proceso espera más de T unidades, se ejecuta inmediatamente.Simple, límite claro.Discontinuo: todos los procesos que superan el umbral se ejecutan juntos.
Prioridad por tiempo de esperaLa prioridad es una función del tiempo de espera (por ejemplo, prioridad = base + espera / 10).Suave, ajustable.Hay que elegir la función.

En la práctica, el método más común es el primero: aumentar la prioridad en 1 cada unidad de tiempo. Es simple y garantiza que todo proceso se ejecute en un tiempo acotado.

El envejecimiento se puede implementar en el planificador de dos formas:

7. El compromiso del envejecimiento

El envejecimiento resuelve la inanición, pero introduce un compromiso:

El parámetro clave es la velocidad de envejecimiento: cuánto aumenta la prioridad por unidad de tiempo. Un valor típico es 1 punto de prioridad por segundo de espera. Con este valor, un proceso de prioridad 1 que espera 10 segundos alcanza prioridad 11, superando a un proceso de prioridad 10 que acaba de llegar.

Envejecimiento rompe la optimalidad

Con envejecimiento, un proceso largo puede ejecutarse antes que un proceso corto si ha esperado suficiente tiempo. Esto rompe la optimalidad de SJF, pero es un compromiso necesario para garantizar la equidad.

8. Envejecimiento en Linux

Linux implementa una forma de envejecimiento en la clase normal (SCHED_OTHER). El planificador CFS/EEVDF usa el vruntime (tiempo virtual): un proceso que espera acumula vruntime lentamente, y cuando recibe la CPU, su vruntime aumenta. Los procesos que han esperado más tienen menos vruntime y se ejecutan antes. Esto es, en esencia, una forma de envejecimiento.

En las clases de tiempo real (SCHED_FIFO, SCHED_RR), no hay envejecimiento: la prioridad es fija. El programador es responsable de evitar la inanición asignando prioridades correctamente.

En el planificador CFS, el envejecimiento está integrado en el algoritmo: no hay un mecanismo separado, sino que el vruntime garantiza que los procesos que esperan más reciben la CPU antes.

9. Alternativas al envejecimiento

Además del envejecimiento, hay otras técnicas para evitar la inanición:

En la práctica, la combinación de prioridades dinámicas + envejecimiento + Round Robin para desempatar es la solución más común.

10. Simulador interactivo

Este simulador muestra la inanición y cómo el envejecimiento la evita. Un proceso largo de baja prioridad espera mientras llegan procesos cortos de alta prioridad. Con el envejecimiento activado, el proceso largo finalmente se ejecuta:

Simulador · inanición y envejecimiento

Sin envejecimiento (velocidad 0)

Con envejecimiento

11. Resumen

12. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué es la inanición?

Un proceso listo que nunca recibe la CPU porque siempre hay otros con preferencia sobre él.

2. ¿En qué algoritmos ocurre la inanición?

En SJF, SRTF y la planificación por prioridades.

3. ¿En qué algoritmos NO ocurre la inanición?

En FCFS y Round Robin.

4. ¿Qué es el envejecimiento?

Aumentar la prioridad de un proceso a medida que espera, hasta que finalmente se ejecuta.

5. ¿Qué garantiza el envejecimiento?

Que todo proceso que espera suficiente tiempo finalmente se ejecuta.

6. ¿Qué compromiso introduce el envejecimiento?

Rompe la optimalidad: un proceso largo puede ejecutarse antes que un corto si ha esperado suficiente tiempo.

7. ¿Cómo implementa Linux el envejecimiento?

En CFS, mediante el vruntime: los procesos que esperan más tienen menos vruntime y se ejecutan antes.

8. ¿Las clases de tiempo real de Linux tienen envejecimiento?

No. La prioridad es fija. El programador es responsable de evitar la inanición.

9. ¿Qué es la diferencia entre inanición y deadlock?

En la inanición, el proceso espera la CPU que se da a otros. En el deadlock, el proceso espera un recurso que nunca se libera.

10. ¿Qué alternativa a el envejecimiento garantiza que todos reciban CPU?

Round Robin: todos los procesos reciben turnos periódicos.

Para practicar

  1. Diseña un conjunto de procesos donde la inanición sea evidente en SJF.
  2. Implementa el envejecimiento con velocidad 1 y verifica que el proceso largo se ejecuta.
  3. Compara el envejecimiento con velocidad 0,5 y 2 para el mismo conjunto.
  4. Explica por qué el envejecimiento rompe la optimalidad de SJF.
  5. Diseña un esquema de envejecimiento basado en la ráfaga estimada decreciente.
  6. Investiga cómo el vruntime de CFS implementa el envejecimiento.