← Planificación de la CPU Bloque 4 · Primero el trabajo más corto · Tema 13 de 44

Tema 13

SJF: el trabajo más corto primero

SJF (Shortest Job First) es el algoritmo que ejecuta primero el proceso con la ráfaga de CPU más corta. Es el algoritmo que minimiza el tiempo de espera promedio cuando todos los procesos llegan en cero, y en este tema verás por qué, con una demostración basada en intercambios de procesos adyacentes. También verás sus propiedades, sus desventajas y por qué, a pesar de ser óptimo en teoría, es difícil de usar en la práctica.

1. Qué es SJF

SJF (Shortest Job First) es el algoritmo de planificación que, cada vez que la CPU queda libre, elige el proceso listo con la rornecedor de CPU más corta. Si hay empate, se desempata por orden de llegada (FIFO).

SJF es el algoritmo «ideal» en el sentido de que minimiza el tiempo de espera promedio (y con él el de retorno) cuando todos los procesos llegan en cero. Es el algoritmo que cualquier planificador querría usar si pudiera, pero tiene un problema fundamental: para saber cuál es el proceso más corto, hay que conocer las ráfagas de CPU antes de ejecutarlas, y en la práctica eso es casi imposible.

SJF se conoce también como SPF (Shortest Process First) o, en su versión apropiativa, SRTF (Shortest Remaining Time First). En este tema nos centramos en la versión no apropiativa; la apropiativa se estudia en el tema 14.

SJF necesita conocer el futuro

Para elegir el proceso más corto, SJF debe saber cuánto va a durar cada proceso antes de ejecutarlo. En la práctica, las ráfagas no se conocen de antemano; se predicen (tema 15). Por eso SJF es un algoritmo teórico, no uno que se use directamente en sistemas reales.

2. Cómo funciona

SJF funciona así:

  1. Llega un proceso. Se añade a la cola de listos. Si la CPU está ociosa, se evalúa si este proceso es el más corto entre los listos. llegada
  2. La CPU queda libre. Se examina la cola de listos y se elige el proceso con la ráfaga más corta. decisión
  3. El proceso se ejecuta. Conserva la CPU hasta que termina su ráfaga (SJF no apropiativo) o hasta que se le acaba el turno (en SRTF). ejecución
  4. Se repite. Cuando el proceso termina, se vuelve al paso 2. bucle

La diferencia clave con FCFS es el paso 2: FCFS toma el primero de la cola (FIFO); SJF toma el más corto. La cola de listos ya no es FIFO: hay que buscar el mínimo cada vez que la CPU queda libre.

La búsqueda del mínimo tiene un costo: O(n) si se recorre la cola, o O(log n) si se mantiene un heap. En la práctica, ese costo es pequeño comparado con el tiempo de las ráfagas, pero es un overhead que FCFS no tiene.

3. Un ejemplo desarrollado

Cuatro procesos, todos llegando en 0, con ráfagas 8, 4, 2 y 1 (el mismo conjunto del tema 7):

ProcesoLlegadaRáfaga
P108
P204
P302
P401

SJF ejecuta primero el más corto (P4), luego el siguiente más corto (P3), luego P2, y finalmente P1:

Gantt SJF: P4 0-1, P3 1-3, P2 3-7, P1 7-15. P4 P3 P2 P1 013715
SJF: los procesos se ejecutan en orden creciente de ráfaga.

Las métricas:

ProcesoRáfagaInicioTerminaciónRespuestaEsperaRetorno
P4101001
P3213113
P2437337
P187157715
Promedio2,752,756,50

Comparado con FCFS para el mismo conjunto (ráfagas 8, 4, 2, 1 en ese orden), que daba espera promedio 8,50 y retorno 12,25, SJF reduce la espera a 2,75 (un 68 % menos) y el retorno a 6,50. El proceso largo (P1) espera 7 en lugar de 0, pero los tres cortos esperan mucho menos.

4. Por qué minimiza la espera: la demostración

SJF minimiza el tiempo de espera promedio (y con él el de retorno) cuando todos los procesos llegan en cero. La demostración se basa en un argumento de intercambio: si en una planificación hay dos procesos adyacentes donde el más largo va primero, intercambiarlos reduce (o no aumenta) la suma de esperas.

Sea una planificación donde dos procesos adyacentes A y B se ejecutan en ese orden, con ráfagas a y b, y a > b. Supongamos que antes de ellos ya se han ejecutado procesos que suman T unidades de tiempo. Entonces:

Como b < a, la suma en el segundo caso es menor: 2T + b < 2T + a. Los demás procesos no se ven afectados porque la suma de las ráfagas de A y B es la misma en ambos órdenes. Por lo tanto, intercambiar A y B (poner el más corto primero) reduce la suma de esperas.

Si en una planificación hay algún par de procesos adyacentes con el más largo primero, se puede intercambiarlos y reducir la suma. Repitiendo este proceso, se llega a la planificación donde los procesos están ordenados por ráfaga creciente: SJF. Y como cada intercambio reduce (o no aumenta) la suma, SJF es óptimo.

El intercambio no afecta a los demás

Intercambiar dos procesos adyacentes no cambia la suma de sus ráfagas, así que los procesos que van después empiezan en el mismo instante. Solo cambian las esperas de los dos procesos intercambiados.

5. El argumento de intercambio en detalle

La demostración anterior se puede expresar como un algoritmo que convierte cualquier planificación en SJF:

  1. Busca un par adyacente invertido. Recorre la planificación de izquierda a derecha buscando dos procesos consecutivos donde el primero tenga ráfaga mayor que el segundo. buscar
  2. Intercámbialos. Pon el más corto primero. La suma de esperas disminuye (o se mantiene si son iguales). intercambiar
  3. Repite. Sigue buscando pares invertidos. Cada intercambio reduce la suma, así que el proceso termina. iterar
  4. Resultado: SJF. Cuando no hay más pares invertidos, los procesos están ordenados por ráfaga creciente. SJF

Este proceso es similar al ordenamiento por burbuja (bubble sort): cada intercambio reduce el número de inversiones, y el resultado final es la lista ordenada. Por eso SJF también se llama «ordenamiento por ráfaga».

La optimalidad se refiere al tiempo de espera promedio (y al de retorno, que difiere por una constante). No se refiere al tiempo de respuesta (que puede ser peor que Round Robin) ni a la equidad (que puede ser muy mala para procesos largos).

6. Propiedades de SJF

Propiedad¿La cumple?Comentario
Minimiza espera promedioSíCuando todos llegan en 0 y se conocen las ráfagas.
Minimiza retorno promedioSíPorque retorno = espera + ráfaga, y la ráfaga es constante.
SimplicidadParcialMás complejo que FCFS: hay que buscar el mínimo en cada decisión.
Justicia (fairness)NoLos procesos largos pueden esperar mucho (inanición).
Ausencia de inaniciónNoUn flujo continuo de procesos cortos puede postergar indefinidamente a uno largo.
PredecibilidadParcialEl orden depende de las ráfagas, que pueden no conocerse.
OverheadBajoBúsqueda del mínimo: O(n) o O(log n) con heap.

SJF es óptimo para el promedio, pero no es justo ni evita la inanición. Es un algoritmo que optimiza una métrica a costa de otras.

7. Ventajas

8. Desventajas

SJF no se usa directamente

Ningún sistema operativo usa SJF puro, porque no se conocen las ráfagas de antemano. Se usa en combinación con predicción (promedio exponencial, tema 15) y con apropiación (SRTF, tema 14).

9. Inanición

La inanición (starvation) ocurre cuando un proceso espera indefinidamente porque siempre hay otros procesos más cortos que se ejecutan antes. En SJF, un proceso largo puede esperar para siempre si llega un flujo continuo de procesos cortos.

Ejemplo: un proceso con ráfaga 100 llega en 0. Después llegan procesos con ráfaga 1 cada 0,5 unidades. Cada vez que el proceso largo va a ejecutarse, hay un proceso corto nuevo que se ejecuta antes. El proceso largo espera indefinidamente.

La solución es el envejecimiento (aging): aumentar la prioridad (o reducir la ráfaga estimada) de los procesos que llevan mucho tiempo esperando. Con envejecimiento, un proceso largo que espera suficiente tiempo se vuelve «más corto» que los nuevos y se ejecuta. El envejecimiento se estudia en el tema 18.

10. SJF no apropiativo

En este tema nos hemos centrado en SJF no apropiativo: una vez que un proceso recibe la CPU, la conserva hasta que termina su ráfaga. El planificador no puede interrumpirlo.

Esto tiene una consecuencia importante: si un proceso largo ya se está ejecutando y llega un proceso más corto, SJF no apropiativo no puede interrumpir al largo. El proceso corto debe esperar. Por eso, SJF no apropiativo no es tan bueno como SRTF (con apropiación) cuando las llegadas son distintas.

En el tema 14 se estudia SRTF, que sí interrumpe al proceso largo cuando llega uno más corto. SRTF es todavía mejor que SJF no apropiativo en términos de tiempo de espera promedio, pero tiene más overhead (más cambios de contexto).

11. SJF vs FCFS

AspectoFCFSSJF
Criterio de selecciónPrimero en llegarRáfaga más corta
Conocimiento de ráfagasNo necesitaNecesita conocerlas
Tiempo de espera promedioNo óptimoÓptimo (con llegadas en 0)
Efecto convoySíNo
InaniciónNoSí (sin envejecimiento)
JusticiaParcialNo
ComplejidadO(1) por decisiónO(n) o O(log n) por decisión
Uso realComponente de algoritmosCon predicción y apropiación

FCFS es más simple y más justo, pero SJF es más eficiente. La elección depende de si se conocen las ráfagas y de si la optimización del promedio es más importante que la equidad.

12. Simulador interactivo

Este simulador ejecuta SJF sobre una carga de trabajo generada aleatoriamente. Compara las métricas con las de FCFS para el mismo conjunto:

Simulador · SJF

ProcesoLlegadaRáfagaInicioFinRespuestaEsperaRetorno

13. Resumen

14. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué criterio usa SJF para elegir el siguiente proceso?

La ráfaga de CPU más corta entre los procesos listos.

2. ¿Qué métrica minimiza SJF?

El tiempo de espera promedio (y con él el de retorno), cuando todos los procesos llegan en cero y se conocen las ráfagas.

3. ¿En qué consiste el argumento de intercambio?

Si dos procesos adyacentes tienen el más largo primero, intercambiarlos reduce la suma de esperas. Repitiendo, se llega a SJF.

4. ¿Por qué el intercambio no afecta a los procesos que van después?

Porque la suma de las ráfagas de los dos procesos es la misma en ambos órdenes, así que los procesos posteriores empiezan en el mismo instante.

5. ¿Qué es la inanición en SJF?

Un proceso largo espera indefinidamente porque siempre hay procesos más cortos que se ejecutan antes.

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

Con envejecimiento: aumentar la prioridad (o reducir la ráfaga estimada) de los procesos que llevan mucho tiempo esperando.

7. ¿Necesita SJF conocer las ráfagas de antemano?

Sí. Es su principal limitación: en la práctica las ráfagas no se conocen y hay que predecirlas.

8. ¿Qué ocurre si un proceso largo ya se está ejecutando y llega uno más corto en SJF no apropiativo?

El proceso corto debe esperar. SJF no apropiativo no puede interrumpir al proceso largo.

9. ¿Minimiza SJF el tiempo de respuesta?

No. Round Robin es mejor para tiempo de respuesta. SJF optimiza el tiempo de espera y de retorno.

10. ¿En qué se diferencia SJF de FCFS en la cola de listos?

FCFS usa una cola FIFO (toma el primero). SJF busca el mínimo (toma el más corto). La cola de SJF no es FIFO.

Para practicar

  1. Calcula las métricas para ráfagas 6, 4, 2, 1 en SJF y compara con FCFS.
  2. Demuestra el argumento de intercambio con un ejemplo de tres procesos adyacentes.
  3. Dibuja el Gantt de SJF para P1(0,8), P2(1,4), P3(2,2), P4(3,1) y compara con FCFS.
  4. Explica por qué SJF no minimiza el tiempo de respuesta.
  5. Diseña un conjunto de procesos donde SJF sufra inanición y explica cómo el envejecimiento la evita.
  6. Modifica el simulador para mostrar SJF y FCFS uno encima del otro para la misma carga.