Atlasingeniería

Arquitectura y sistemas operativosSistemas operativosTema 2

Planificación de CPU

Con más procesos listos que núcleos, alguien decide quién corre y por cuánto. Ningún algoritmo es el mejor: cada uno optimiza una métrica distinta y perjudica otra.

Para este tema conviene tener claro:Procesos e hilos

Hay cuatro núcleos y doscientos procesos listos. El planificador decide quién usa la CPU y por cuánto tiempo, cientos de veces por segundo. Es una de las decisiones más frecuentes del sistema, y no tiene una respuesta única porque no todos quieren lo mismo.

Las métricas se contradicen entre sí

Las métricas en juego se contradicen. El rendimiento es cuántos procesos se completan por unidad de tiempo. El tiempo de respuesta es cuánto tarda en reaccionar algo interactivo. El tiempo de retorno es cuánto tarda un trabajo completo. Y la equidad es que nadie quede postergado para siempre.

Optimizar respuesta implica cambiar de proceso seguido, y cada cambio cuesta: guardar y restaurar estado, y sobre todo perder el contenido útil de la caché. Optimizar rendimiento implica lo contrario.

Tres procesos que llegan juntos. A tarda 8 unidades, B tarda 2, C tarda 2.

1 / 7
Las tres planificaciones hacen el mismo trabajo total: lo único que cambia es el orden. Mirá el promedio de espera de cada una, y mirá también quién paga: con el más corto primero el proceso largo espera más que en FIFO, y si siguen llegando cortos, no arranca nunca.

Antes de seguir, predecí

Un proceso interactivo y uno de cálculo intensivo en un planificador de turnos iguales. ¿Quién sufre?

Los clásicos y el dilema que muestran

Los algoritmos clásicos muestran el dilema. FIFO es simple y sufre el efecto convoy: un proceso largo adelante retrasa a todos los cortos. El más corto primero minimiza el tiempo de espera promedio —es demostrable— pero requiere saber cuánto va a durar cada uno, que no se sabe, y puede postergar indefinidamente a los largos.

Round robin reparte turnos de duración fija. Es equitativo y bueno para interactividad, y todo depende del tamaño del turno: muy corto, se gasta en cambios de contexto; muy largo, degenera en FIFO.

Prioridades según el comportamiento observado

Los sistemas reales usan prioridades con múltiples colas. La idea central es distinguir por comportamiento observado: un proceso que se bloquea seguido esperando E/S es probablemente interactivo y conviene atenderlo rápido; uno que consume su turno entero es de cálculo y puede esperar.

Las colas multinivel con realimentación hacen eso automáticamente: quien agota su turno baja de prioridad, quien se bloquea antes la mantiene. Y para que los de baja prioridad no queden olvidados, se los sube periódicamente: eso es el envejecimiento, y es lo que evita la inanición.

Equidad proporcional en los planificadores modernos

Los planificadores modernos de propósito general apuntan a la equidad proporcional: cada tarea recibe una fracción del procesador según su peso, y el planificador elige siempre a la que menos tiempo acumuló en relación a lo que le corresponde.

El valor de nice ajusta ese peso. Y existen clases de tiempo real para tareas que necesitan garantías: ahí la prioridad es estricta y una tarea de esa clase puede monopolizar la CPU, que es justamente lo que se quiere en control industrial y lo que hay que evitar en un servidor común.

La inversión de prioridades

Un problema sutil y famoso: la inversión de prioridades. Una tarea de prioridad alta espera un recurso que tiene una de prioridad baja, y esa baja no avanza porque tareas intermedias la desplazan. La alta queda bloqueada por las intermedias sin relación directa.

Le pasó a la sonda Mars Pathfinder en 1997, que se reiniciaba sola en Marte. La solución es la herencia de prioridad: quien posee el recurso hereda temporalmente la prioridad del que espera.

Con varios núcleos aparecen decisiones nuevas

Con varios núcleos aparecen decisiones nuevas. Mover una tarea a otro núcleo pierde su caché caliente, así que conviene afinidad: mantenerla donde estaba. Pero si un núcleo se satura y otro está libre, hay que balancear.

Y en procesadores con núcleos de rendimiento y de eficiencia, el planificador además decide en qué tipo de núcleo conviene cada tarea. La regla de fondo sigue siendo la misma: toda política favorece una métrica y perjudica otra, y elegir es decidir qué importa en ese sistema.

Lo que se ve desde una aplicación

Las métricas que se contradicen

MétricaQué mideQué la mejoraQué empeora a cambio
Rendimientoprocesos completados por unidad de tiempoturnos largosel tiempo de respuesta
Tiempo de respuestacuánto tarda en reaccionar lo interactivoturnos cortosel rendimiento, por los cambios de contexto
Tiempo de retornocuánto tarda un trabajo completoel más corto primerola equidad
Equidadque nadie quede postergadoturnos rotativosel promedio de espera
Ninguna se puede optimizar sin empeorar otra, y por eso no hay un planificador correcto: hay uno que corresponde a para qué es la máquina.

Cierre

Rendimiento, respuesta, retorno y equidad no se optimizan juntos. Round robin da interactividad según el turno, las colas con realimentación clasifican por comportamiento y el envejecimiento evita la inanición. La inversión de prioridades se arregla heredando prioridad, y en multinúcleo se pelean afinidad y balanceo.

Autoevaluación

¿Lo entendiste?

¿Por qué no hay un algoritmo de planificación óptimo?
¿Qué es el efecto convoy?
«El más corto primero» minimiza el tiempo de espera promedio. ¿Cuál es el problema?
¿Cuál es el costo real de un cambio de contexto?