← Planificación de la CPU Bloque 2 · Las métricas de la planificación · Tema 7 de 44

Tema 7

Tiempo de retorno y tiempo de espera

Son las dos métricas que más se usan para juzgar un algoritmo de planificación. El tiempo de retorno mide cuánto tarda un proceso en salir del sistema; el tiempo de espera mide cuánto de ese tiempo se pasó en la cola sin CPU. En este tema verás las fórmulas exactas, el significado de cada término, un método para calcularlas paso a paso y varios ejemplos resueltos, incluyendo llegadas en distintos instantes y procesos con entrada/salida.

1. Por qué estas dos métricas son las centrales

En el tema 6 viste cinco criterios. De ellos, dos dominan la comparación de algoritmos: el tiempo de retorno (turnaround) y el tiempo de espera (waiting). La razón es que son las únicas que dependen directamente del orden en que el planificador da la CPU. El uso de la CPU y el throughput dependen sobre todo de cuántos procesos hay en memoria y de si se bloquean en E/S; el tiempo de respuesta depende de cuándo se da el primer turno. El turnaround y el waiting, en cambio, resumen toda la experiencia de un proceso con la cola de listos.

Además, las dos están ligadas por una identidad sencilla: para un proceso que no hace entrada/salida, el tiempo de retorno es exactamente el tiempo de espera más el tiempo que usó la CPU. Eso significa que, cuando el trabajo de cada proceso es fijo, minimizar el tiempo de espera promedio es lo mismo que minimizar el tiempo de retorno promedio. El planificador no puede reducir el trabajo, pero sí puede reducir la espera.

La identidad que usaremos todo el curso

Para un proceso sin entrada/salida: tiempo de retorno = tiempo de espera + tiempo de CPU. El segundo sumando lo fija el programa; el primero lo fija el planificador.

Por eso, cuando en un examen o en un artículo se dice «este algoritmo es mejor», casi siempre se refiere a que baja el tiempo de espera (y con él el de retorno) promedio, o a que lo baja para los procesos cortos. Las secciones siguientes te enseñan a calcularlo sin ambigüedad.

2. Definiciones y fórmulas

El tiempo de retorno (turnaround time) de un proceso es el tiempo total que pasa en el sistema, desde que llega hasta que termina. El tiempo de espera (waiting time) es la parte de ese tiempo que el proceso pasa en la cola de listos, listo para ejecutarse pero sin CPU.

Para un proceso Pi se usan estos símbolos:

SímboloNombreSignificado
AiLlegada (arrival)Instante en que el proceso entra en el sistema y queda listo.
BiRáfaga de CPU (burst)Tiempo total de CPU que necesita el proceso.
IiEspera de E/STiempo total que el proceso pasa bloqueado esperando entrada/salida (si la tiene).
SiPrimera ejecuciónInstante en que recibe la CPU por primera vez.
FiTerminación (finish)Instante en que el proceso acaba.
TiTiempo de retornoFi − Ai.
WiTiempo de esperaTiempo en la cola de listos (ver fórmulas).

Las fórmulas son:

Tiempo de retorno: Ti = Fi − Ai.

Tiempo de espera (un solo bloque de CPU, sin E/S): Wi = Ti − Bi = Si − Ai.

Tiempo de espera (caso general, con E/S): Wi = Ti − Bi − Ii.

Y los promedios, que son los que se comparan entre algoritmos:

Promedio de retorno: T̄ = (Σ Ti) / n.   Promedio de espera: W̄ = (Σ Wi) / n.

Observa que la fórmula del caso general se reduce a la del caso simple cuando Ii = 0. En los temas de algoritmos clásicos (bloques 3 a 7) se trabaja casi siempre con un solo bloque de CPU por proceso, así que Wi = Si − Ai es la forma más usada.

3. El significado de cada término

Es fácil memorizar las fórmulas y equivocarse al aplicarlas. Estas son las confusiones más frecuentes y cómo evitarlas:

Cuidado con los procesos que llegan tarde

Si un proceso llega en t = 5 y termina en t = 10, su turnaround es 5, no 10. La fórmula usa Fi − Ai, no Fi. Olvidar restar la llegada es el error más común al calcular a mano.

4. Cómo se calculan paso a paso

El método es siempre el mismo, sea cual sea el algoritmo. Lo único que cambia es el orden en que se ejecutan los procesos:

  1. Anota los datos de cada proceso. Para cada uno: llegada Ai y ráfaga Bi (y Ii si tiene E/S). datos
  2. Decide el orden de ejecución. FCFS por llegada, SJF por ráfaga más corta entre los que ya llegaron, por prioridad, Round Robin en turnos... algoritmo
  3. Recorre la línea de tiempo. Mantén un reloj t. Para cada proceso en orden: si t < Ai, la CPU está ociosa y t salta a Ai; el inicio es Si = t; la terminación es Fi = t + Bi; avanza t = Fi. timeline
  4. Calcula Ti y Wi. Ti = Fi − Ai; Wi = Ti − Bi (o − Bi − Ii si hay E/S). métricas
  5. Suma y divide por n. Obtienes los promedios que se comparan entre algoritmos. promedios
La CPU ociosa cuenta

Si ningún proceso ha llegado todavía, la CPU se queda ociosa y el reloj salta hasta la próxima llegada. Ese tiempo no es espera de ningún proceso (nadie estaba listo), pero sí retrasa las terminaciones posteriores. En los ejemplos de examen suele evitarse haciendo que todos lleguen en 0.

5. Ejemplo 1: todos llegan en cero

Es el caso más sencillo y el más frecuente en los ejercicios. Cuatro procesos, todos listos en t = 0, con ráfagas 8, 4, 2 y 1:

ProcesoLlegadaRáfaga
P108
P204
P302
P401

5.1 Orden FCFS: P1, P2, P3, P4

ProcesoInicioTerminaciónTurnaround (F − A)Espera (T − B)
P10880
P2812128
P312141412
P414151514
Promedio12,258,50

El proceso largo va primero y hace esperar a todos los demás: P4, que solo necesitaba 1 unidad, espera 14. Es el efecto convoy, que se estudia en el tema 11.

5.2 Orden SJF: P4, P3, P2, P1

ProcesoInicioTerminaciónTurnaroundEspera
P40110
P31331
P23773
P1715157
Promedio6,502,75

El mismo trabajo total (15 unidades) termina en el mismo instante, pero el promedio de espera baja de 8,50 a 2,75. Los procesos cortos salen primero; solo el largo espera (7 unidades). Este es el motivo por el que SJF minimiza el tiempo de espera promedio cuando todos llegan en cero: se demuestra intercambiando dos procesos adyacentes y viendo que poner el más corto antes siempre reduce (o no aumenta) la suma de esperas.

6. Ejemplo 2: llegadas distintas

Cuando los procesos no llegan todos en cero, hay que respetar la llegada: no se puede ejecutar un proceso antes de que exista. Tomemos este conjunto:

ProcesoLlegadaRáfaga
P105
P213
P324
P442

Con FCFS por orden de llegada (que coincide con el orden de la tabla), la línea de tiempo es:

ProcesoLlegadaInicioTerminaciónTurnaroundEspera
P100550
P215874
P32812106
P441214108
Promedio8,004,50

Fíjate en P2: llegó en 1, pero la CPU estaba ocupada con P1 hasta 5, así que esperó 4 unidades. P4 llegó en 4 y esperó 8. La CPU no quedó ociosa en ningún momento porque siempre había algún proceso listo. Si la llegada de P2 hubiera sido 6 en lugar de 1, la CPU habría estado ociosa entre 5 y 6, y el reloj habría saltado.

7. Ejemplo 3: SJF con llegadas distintas

Cuando las llegadas son distintas, SJF no ordena todos los procesos al principio: en cada decisión elige el más corto entre los que ya han llegado. Tomemos:

ProcesoLlegadaRáfaga
P108
P214
P322
P431

En t = 0 solo ha llegado P1, así que se ejecuta aunque sea el más largo (duración 8). Al terminar, en t = 8, ya han llegado todos; se elige el más corto (P4), luego P3, luego P2:

ProcesoLlegadaInicioTerminaciónTurnaroundEspera
P100880
P438965
P3291197
P2111151410
Promedio9,255,50

Para comparar, el mismo conjunto en FCFS por llegada da promedios de turnaround 11,75 y espera 7,00. SJF mejora ambos, pero la mejora es menor que cuando todos llegan en cero, porque el proceso largo P1 ya estaba ejecutándose cuando llegaron los cortos y, al ser no apropiativo, no se le puede quitar la CPU. Con SRTF (SJF con apropiación, tema 14) se interrumpiría P1 y los promedios bajarían todavía más.

8. Turnaround, CPU y entrada/salida

Cuando un proceso hace E/S, su turnaround se descompone en tres partes: tiempo de CPU, tiempo de espera de E/S y tiempo de espera en la cola de listos. Solo la última la controla el planificador. La fórmula general lo refleja:

Ti = Bi (CPU) + Ii (E/S) + Wi (cola de listos).

Un proceso con ráfagas de CPU de 3 y 2 y una E/S de 5 entre ellas, que empieza en 0 y no compite con nadie, termina en 10: 3 de CPU, 5 de E/S, 2 de CPU. Su turnaround es 10, su tiempo de CPU es 5, su espera de E/S es 5 y su espera en la cola es 0. Si se le hubiera hecho esperar 2 unidades en la cola antes de la segunda ráfaga, el turnaround habría sido 12.

Veamos un caso con dos procesos para ver cómo la E/S permite solapamiento:

ProcesoLlegadaRáfagas
P10CPU 3, E/S 5, CPU 2
P20CPU 4

Una planificación razonable ejecuta primero la ráfaga de CPU de P1 (0–3), luego la de P2 (3–7) mientras P1 hace E/S (3–8), y finalmente la segunda ráfaga de P1 (8–10):

ProcesoTerminaciónTurnaroundCPU totalE/SEspera en cola
P11010550
P277403
Promedio8,501,50

La CPU no queda ociosa (P2 la usa mientras P1 espera al disco), y el turnaround promedio es menor que si se ejecutaran los procesos uno tras otro sin solapar (que sería 5 + 9 = 14 de turnaround total). En los simuladores de los bloques siguientes se modela cada proceso con una sola ráfaga de CPU; la E/S se introduce en los bloques 8 y 9.

9. Métricas derivadas

A partir de Ti y Wi se calculan otras magnitudes útiles:

Qué optimiza cada algoritmo

FCFS no optimiza nada en particular. SJF minimiza W̄ y T̄ cuando todos llegan en cero. Round Robin suele empeorar W̄ y T̄ pero mejora el tiempo de respuesta. Prioridades permiten favorecer a procesos concretos a costa del promedio. La elección es un compromiso, como viste en el tema 6.

10. Un programa que calcula las métricas

El siguiente programa en C calcula turnaround y espera para FCFS, respetando las llegadas y los huecos de CPU ociosa. Usa el conjunto del ejemplo 2:

metricas_fcfs.c
#define _POSIX_C_SOURCE 200809L
#include <stdio.h>

struct proceso {
    int pid;
    int llegada;
    int rafaga;
    int inicio;
    int fin;
};

static void ordenar_por_llegada(struct proceso *p, int n)
{
    for (int i = 1; i < n; i++) {
        struct proceso tmp = p[i];
        int j = i - 1;
        while (j >= 0 && p[j].llegada > tmp.llegada) {
            p[j + 1] = p[j];
            j--;
        }
        p[j + 1] = tmp;
    }
}

static void fcfs(struct proceso *p, int n)
{
    int t = 0;
    double suma_t = 0, suma_w = 0;
    ordenar_por_llegada(p, n);

    for (int i = 0; i < n; i++) {
        if (t < p[i].llegada)          /* CPU ociosa hasta la llegada */
            t = p[i].llegada;
        p[i].inicio = t;
        p[i].fin = t + p[i].rafaga;
        t = p[i].fin;
        int turnaround = p[i].fin - p[i].llegada;
        int espera = turnaround - p[i].rafaga;
        suma_t += turnaround;
        suma_w += espera;
        printf("P%d: llegada=%d rafaga=%d inicio=%d fin=%d turnaround=%d espera=%d\n",
               p[i].pid, p[i].llegada, p[i].rafaga,
               p[i].inicio, p[i].fin, turnaround, espera);
    }
    printf("Promedio: turnaround=%.2f espera=%.2f\n", suma_t / n, suma_w / n);
}

int main(void)
{
    struct proceso p[4] = {
        {1, 0, 5, 0, 0},
        {2, 1, 3, 0, 0},
        {3, 2, 4, 0, 0},
        {4, 4, 2, 0, 0}
    };
    fcfs(p, 4);
    return 0;
}
terminal · ejecutar metricas_fcfs
$ gcc -std=c17 -Wall -Wextra -o metricas_fcfs metricas_fcfs.c
$ ./metricas_fcfs
P1: llegada=0 rafaga=5 inicio=0 fin=5 turnaround=5 espera=0
P2: llegada=1 rafaga=3 inicio=5 fin=8 turnaround=7 espera=4
P3: llegada=2 rafaga=4 inicio=8 fin=12 turnaround=10 espera=6
P4: llegada=4 rafaga=2 inicio=12 fin=14 turnaround=10 espera=8
Promedio: turnaround=8.00 espera=4.50

La salida reproduce exactamente la tabla del ejemplo 2. Cambiar el algoritmo consiste en cambiar el orden en que se recorren los procesos; las fórmulas de turnaround y espera no cambian.

11. Resumen

12. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué mide el tiempo de retorno?

El tiempo total que un proceso pasa en el sistema, desde que llega hasta que termina: Fi − Ai.

2. ¿Qué mide el tiempo de espera?

El tiempo que el proceso pasa en la cola de listos, listo para ejecutarse pero sin CPU. Es la parte del turnaround que el planificador puede controlar.

3. Un proceso llega en t = 3 y termina en t = 10, con ráfaga 4. ¿Cuál es su turnaround y su espera?

Turnaround = 10 − 3 = 7. Espera = 7 − 4 = 3.

4. ¿Por qué el turnaround de un proceso con E/S puede ser grande aunque la CPU le haya dado poca espera?

Porque el turnaround incluye el tiempo de espera de E/S, que no controla el planificador. Un proceso puede estar bloqueado leyendo del disco durante segundos.

5. Si todos los procesos llegan en cero, ¿qué algoritmo minimiza el tiempo de espera promedio?

SJF (Shortest Job First): ejecutar primero los procesos con ráfaga más corta.

6. ¿Qué ocurre con la CPU si ningún proceso ha llegado cuando termina el anterior?

Queda ociosa y el reloj salta hasta la llegada del siguiente proceso. Ese tiempo no es espera de ningún proceso.

7. ¿Cuál es la diferencia entre tiempo de espera y tiempo de respuesta?

La espera suma todos los turnos en la cola; el tiempo de respuesta mide solo el tiempo hasta la primera ejecución.

8. ¿Qué es el turnaround normalizado?

Ti / Bi. Vale 1 si no hubo espera y crece con ella; permite comparar procesos de distinta duración.

9. ¿Depende el throughput del orden de ejecución, para procesos sin E/S?

No. El trabajo total es el mismo, así que el throughput es el mismo. Lo que cambia es cuándo termina cada proceso.

10. En el ejemplo 3, ¿por qué SJF no mejora tanto como cuando todos llegan en cero?

Porque P1 (el largo) ya se estaba ejecutando cuando llegaron los cortos y, al ser no apropiativo, no se le puede quitar la CPU. SRTF (con apropiación) sí lo interrumpiría.

Para practicar

  1. Calcula a mano turnaround y espera para los procesos P1(8), P2(4), P3(2), P4(1) en orden SJF y compara con FCFS.
  2. Repite el ejemplo 2 pero con P2 llegando en 6 en lugar de 1. ¿Queda la CPU ociosa? ¿Cuánto?
  3. Para el conjunto del ejemplo 3, calcula las métricas de SRTF (interrumpe P1 cuando llega P4) y compáralas con las de SJF no apropiativo.
  4. Modifica metricas_fcfs.c para imprimir también el turnaround normalizado de cada proceso.
  5. Diseña un conjunto de 3 procesos en el que FCFS y SJF den el mismo promedio de espera. ¿Qué propiedad deben tener?
  6. Calcula las métricas de un proceso con ráfagas CPU 4, E/S 6, CPU 3 que empieza en 0 y no compite con nadie.