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

Tema 17

Prioridades estáticas y dinámicas

La planificación por prioridades asigna a cada proceso un número de prioridad y ejecuta primero el de mayor prioridad. Es el mecanismo que usan los sistemas reales para favorecer a los procesos importantes. En este tema verás cómo se asignan las prioridades, la diferencia entre estáticas y dinámicas, las versiones con y sin apropiación, cómo se desempatan los procesos con la misma prioridad y cómo se implementa en la práctica.

1. Qué es la planificación por prioridades

La planificación por prioridades asigna a cada proceso un número de prioridad (un entero). La CPU se da al proceso listo con la mayor prioridad (el número más alto o más bajo, según la convención). Si hay varios con la misma prioridad, se desempata por FCFS o por otro criterio.

La planificación por prioridades es más general que SJF: SJF es un caso particular donde la prioridad es la ráfaga inversa (más corta = mayor prioridad). Las prioridades permiten expresar criterios arbitrarios: importancia del usuario, tipo de proceso, tiempo de espera, etc.

Las prioridades se usan en todos los sistemas operativos reales. En Linux, por ejemplo, los procesos tienen una prioridad interna (prio) que depende del valor nice y de la clase de planificación. Las políticas de tiempo real (SCHED_FIFO, SCHED_RR) usan prioridades del 1 al 99.

Prioridad alta = número bajo o alto?

La convención varía. En Unix/Linux, una prioridad más baja (menor número) significa mayor prioridad. En Windows, una prioridad más alta (mayor número) significa mayor prioridad. En este curso usaremos la convención de que mayor número = mayor prioridad, que es la más intuitiva.

2. Cómo se asignan las prioridades

Las prioridades se pueden asignar de varias formas:

En la práctica, las prioridades suelen ser una combinación: el sistema asigna una prioridad base según el tipo de proceso, y el usuario o el proceso puede ajustarla dentro de un rango.

3. Prioridades estáticas

Las prioridades estáticas se asignan al crear el proceso y no cambian durante su vida. El proceso mantiene la misma prioridad desde que nace hasta que muere.

Ventajas:

Desventajas:

Las prioridades estáticas se usan en sistemas de tiempo real (SCHED_FIFO, SCHED_RR en Linux), donde la prioridad es fija y el programador es responsable de asignarla correctamente.

4. Prioridades dinámicas

Las prioridades dinámicas cambian durante la vida del proceso, según su comportamiento o según parámetros del sistema. El planificador ajusta la prioridad automáticamente.

Ejemplos de ajuste dinámico:

Las prioridades dinámicas resuelven el problema de la inanición (con envejecimiento) y se adaptan al comportamiento del proceso. Son más complejas de implementar pero más justas y eficientes.

Linux usa prioridades dinámicas en la clase normal (SCHED_OTHER): la prioridad interna cambia según el uso de CPU y el nice. Los procesos que usan mucha CPU bajan su prioridad; los interactivos suben.

5. Versión no apropiativa

En la versión no apropiativa, una vez que un proceso recibe la CPU, la conserva hasta que termina su ráfaga o se bloquea en E/S. El planificador no interrumpe al proceso en ejecución, aunque llegue un proceso con mayor prioridad.

El algoritmo es:

  1. Llega un proceso. Se añade a la cola de listos con su prioridad. llegada
  2. La CPU queda libre. Se busca el proceso listo con la mayor prioridad. decisión
  3. El proceso se ejecuta. Conserva la CPU hasta que termina o se bloquea. ejecución
  4. Se repite. bucle

La versión no apropiativa es más simple (no hay que manejar interrupciones), pero menos responsive: un proceso de alta prioridad que llega mientras uno de baja prioridad se ejecuta debe esperar.

6. Versión apropiativa

En la versión apropiativa, si llega un proceso con mayor prioridad que el que se está ejecutando, el planificador interrumpe al proceso en curso y le da la CPU al nuevo.

El algoritmo es:

  1. Llega un proceso. Se añade a la cola de listos. llegada
  2. Se compara. Si la prioridad del nuevo proceso es mayor que la del proceso en ejecución, se interrumpe al proceso en curso. comparar
  3. Se cambia de contexto. El proceso interrumpido vuelve a la cola con su tiempo restante. El nuevo proceso recibe la CPU. contexto
  4. Se repite. bucle

La versión apropiativa es más responsive (un proceso de alta prioridad se ejecuta inmediatamente), pero tiene más overhead (cambios de contexto) y es más compleja.

Apropiación por prioridad vs SRTF

La apropiación por prioridad interrumpe cuando llega un proceso de mayor prioridad. SRTF interrumpe cuando llega un proceso con menos tiempo restante. Son criterios distintos: uno se basa en la importancia, el otro en la duración.

7. Desempate entre prioridades iguales

Cuando varios procesos tienen la misma prioridad, hay que desempatar. Las opciones más comunes son:

Método de desempateCómo funcionaVentajaDesventaja
FCFSEl que llegó primero se ejecuta primero.Justo, simple.Puede causar efecto convoy entre procesos de la misma prioridad.
SJFEl más corto se ejecuta primero.Minimiza la espera.Necesita conocer las ráfagas.
Round RobinSe reparten la CPU en turnos.Buena respuesta.Más cambios de contexto.
Prioridad secundariaSe usa otro criterio (por ejemplo, el pid).Determinista.Arbitrario.

En la práctica, Linux usa Round Robin para desempatar procesos de la misma prioridad en la clase de tiempo real (SCHED_RR), y FCFS en la clase normal (SCHED_OTHER, donde la prioridad es dinámica y rara vez hay empates exactos).

8. Cómo se implementa

La implementación de la planificación por prioridades depende de cómo se representan las colas de listos:

Linux usa una implementación con varias colas: cada prioridad tiene su propia cola, y un bitmap indica qué colas tienen procesos. Esto permite seleccionar el proceso de mayor prioridad en O(1).

9. Propiedades

Propiedad¿La cumple?Comentario
FlexibilidadSíPermite expresar criterios arbitrarios.
JusticiaDependeDepende de cómo se asignen las prioridades.
Ausencia de inaniciónNo (sin envejecimiento)Los procesos de baja prioridad pueden esperar indefinidamente.
Minimiza espera promedioNoSJF es mejor para eso.
Minimiza respuestaNoRound Robin es mejor.
PredecibilidadSíEl orden depende de las prioridades, que son conocidas.

10. Ventajas

11. Desventajas

12. Simulador interactivo

Este simulador ejecuta la planificación por prioridades (no apropiativa) sobre una carga de trabajo. Cada proceso tiene una prioridad; el de mayor prioridad se ejecuta primero:

Simulador · prioridades (no apropiativo)

ProcesoLlegadaRáfagaPrioridadInicioFinRespuestaEsperaRetorno

13. Resumen

14. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué es la planificación por prioridades?

Asignar a cada proceso un número de prioridad y ejecutar primero el de mayor prioridad.

2. ¿Cuál es la diferencia entre prioridades estáticas y dinámicas?

Las estáticas no cambian durante la vida del proceso; las dinámicas se ajustan según el comportamiento.

3. ¿En qué se diferencia la versión apropiativa de la no apropiativa?

La apropiativa interrumpe al proceso en curso si llega uno de mayor prioridad; la no apropiativa no.

4. ¿Cómo se desempatan procesos con la misma prioridad?

Por FCFS, SJF, Round Robin o prioridad secundaria.

5. ¿Qué es la inanición en la planificación por prioridades?

Un proceso de baja prioridad espera indefinidamente porque siempre hay procesos de mayor prioridad.

6. ¿Cómo se evita la inanición?

Con envejecimiento: aumentar la prioridad de los procesos que llevan mucho tiempo esperando.

7. ¿Qué es la inversión de prioridades?

Un proceso de alta prioridad se bloquea esperando un recurso que tiene un proceso de baja prioridad.

8. ¿Cómo implementa Linux la planificación por prioridades?

Con una cola por prioridad y un bitmap de colas no vacías, para seleccionar en O(1).

9. ¿Qué prioridades usan SCHED_FIFO y SCHED_RR?

Prioridades del 1 al 99 (mayor número = mayor prioridad).

10. ¿Es SJF un caso particular de planificación por prioridades?

Sí: la prioridad es la ráfaga inversa (más corta = mayor prioridad).

Para practicar

  1. Modifica el simulador para añadir la versión apropiativa y compara.
  2. Diseña un conjunto de procesos donde la inanición sea evidente.
  3. Implementa el envejecimiento en el simulador y verifica que evita la inanición.
  4. Compara la planificación por prioridades con SJF para el mismo conjunto.
  5. Explica cómo Linux combina prioridades con nice y CFS.
  6. Diseña un esquema de prioridades dinámicas basado en el tiempo de espera.