← Gestión de Memoria Bloque 7 · Memoria virtual · Tema 33 de 52

Tema 33

Hiperpaginación y conjunto de trabajo

La hiperpaginación (thrashing) es el colapso del sistema cuando hay más procesos de los que la RAM puede soportar: la CPU pasa todo el tiempo esperando al disco. En este tema verás cómo se detecta, el modelo del conjunto de trabajo (working set) que predice qué páginas necesita cada proceso, y cómo se asignan los marcos para evitar el colapso.

1. El problema: demasiados procesos, poca RAM

Si se cargan más procesos de los que la RAM puede soportar, cada proceso recibe pocos marcos. Sus páginas se reemplazan constantemente, causando fallos de página. El sistema pasa más tiempo moviendo páginas que ejecutando procesos. Es la hiperpaginación.

La causa raíz es que el grado de multiprogramación (número de procesos en memoria) supera la capacidad de la RAM.

2. Qué es la hiperpaginación

La hiperpaginación (thrashing) es el estado en que el sistema gasta más tiempo en fallos de página y reemplazo que en ejecutar instrucciones. Los síntomas:

La hiperpaginación es catastrófica: el rendimiento cae a casi cero. La única solución es reducir el número de procesos o añadir RAM.

La hiperpaginación es un colapso

Cuando el sistema entra en hiperpaginación, añadir más procesos empeora la situación. Hay que reducir el grado de multiprogramación.

3. Cómo se detecta

Se detecta monitorizando:

En Linux, vmstat 1 muestra la actividad de swap (si, so) y la CPU ociosa (id).

4. El modelo del conjunto de trabajo

El conjunto de trabajo (working set) de un proceso es el conjunto de páginas que ha usado en las últimas Δ referencias (ventana de tiempo). Es la "memoria activa" del proceso.

Conjunto de trabajo (WS): WS(t, Δ) = conjunto de páginas referenciadas en el intervalo [t − Δ, t].

Si un proceso tiene suficientes marcos para su conjunto de trabajo, no genera fallos de página (salvo la primera vez). Si no, genera fallos constantemente.

El tamaño del conjunto de trabajo varía con el tiempo: un proceso puede tener un WS pequeño al inicio y grande durante el procesamiento.

5. Asignación de marcos a procesos

El sistema operativo debe decidir cuántos marcos asignar a cada proceso. Las opciones:

La asignación variable es mejor: da más marcos a los procesos que los necesitan y menos a los que no.

6. Algoritmos de asignación

AlgoritmoDescripciónVentajaInconveniente
IgualTodos los procesos reciben el mismo número de marcos.Simple.No se adapta a las necesidades.
ProporcionalLos marcos se reparten según el tamaño del proceso.Mejor que igual.No considera el conjunto de trabajo.
Basado en prioridadLos procesos de alta prioridad reciben más marcos.Favorece procesos críticos.Los de baja prioridad pueden sufrir.
Conjunto de trabajoCada proceso recibe marcos según su conjunto de trabajo.Se adapta a las necesidades reales.Complejo de implementar.

7. Ejemplo numérico

Un sistema con 100 marcos de RAM y 3 procesos. Los conjuntos de trabajo son:

ProcesoConjunto de trabajo (páginas)Marcos necesarios
P12020
P23030
P32525

Total necesario: 75 marcos. Hay 100 disponibles, así que todos los procesos tienen suficientes marcos. No hay hiperpaginación.

Si se añade un cuarto proceso con WS = 40, el total sería 115 > 100. El sistema entra en hiperpaginación. La solución es suspender un proceso.

8. Experimento en C

El programa siguiente simula el conjunto de trabajo de un proceso y calcula cuántos marcos necesita:

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

int main(void)
{
    int refs[] = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5, 6, 3, 4};
    int n = 15;
    int delta = 5;  /* ventana de tiempo */
    int paginas[100] = {0};

    for (int t = delta; t <= n; t++) {
        /* reset */
        for (int i = 0; i < 100; i++) paginas[i] = 0;
        int ws = 0;
        for (int i = t - delta; i < t; i++) {
            if (!paginas[refs[i]]) { paginas[refs[i]] = 1; ws++; }
        }
        printf("t=%2d: WS = %d páginas (refs %d..%d)\\n", t, ws, t - delta, t - 1);
    }
    return 0;
}
terminal · conjunto de trabajo
$ gcc -std=c17 -Wall -Wextra -o workingset workingset.c
$ ./workingset
t= 5: WS = 4 páginas (refs 0..4)
t= 6: WS = 4 páginas (refs 1..5)
t= 7: WS = 5 páginas (refs 2..6)
t= 8: WS = 5 páginas (refs 3..7)
t= 9: WS = 5 páginas (refs 4..8)
t=10: WS = 5 páginas (refs 5..9)
t=11: WS = 6 páginas (refs 6..10)
t=12: WS = 6 páginas (refs 7..11)
t=13: WS = 6 páginas (refs 8..12)
t=14: WS = 6 páginas (refs 9..13)
t=15: WS = 5 páginas (refs 10..14)

El conjunto de trabajo varía entre 4 y 6 páginas según la ventana. El sistema debe asignar al menos 6 marcos para evitar fallos.

9. Probar con un simulador

Este simulador calcula el conjunto de trabajo para una secuencia de referencias y un tamaño de ventana Δ.

Simulador · conjunto de trabajo

MedidaValor
Tamaño máximo del WS
Tamaño mínimo del WS
Tamaño medio del WS

10. En Linux

Linux no implementa el modelo del conjunto de trabajo directamente. En su lugar:

terminal · memoria en Linux
$ vmstat 1 5
$ cat /proc/sys/vm/swappiness
$ cat /proc/meminfo | grep -i 'memtotal\|memavailable\|swaptotal'$ cat /proc/meminfo | grep -i 'memtotal\|memavailable\|swaptotal'

11. Resumen

12. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué es la hiperpaginación?

El colapso del sistema cuando hay más procesos de los que la RAM puede soportar.

2. ¿Cómo se detecta la hiperpaginación?

Por CPU ociosa, disco saturado, bajo throughput y alta tasa de fallos.

3. ¿Qué es el conjunto de trabajo?

El conjunto de páginas referenciadas por un proceso en una ventana de tiempo.

4. ¿Cómo se calcula el conjunto de trabajo?

Contando las páginas distintas referenciadas en los últimos Δ accesos.

5. ¿Qué es la asignación proporcional?

Repartir los marcos según el tamaño del proceso.

6. ¿Qué es la asignación por conjunto de trabajo?

Dar a cada proceso los marcos que necesita según su conjunto de trabajo.

7. ¿Cómo mitiga Linux la hiperpaginación?

Con el OOM killer, swappiness y cgroups.

8. ¿Qué es swappiness?

Un parámetro (0-100) que controla la tendencia del kernel a usar swap.

Para practicar

  1. Modifica workingset.c para calcular el WS con Δ = 3 y Δ = 10. ¿Cómo cambia?
  2. Simula un sistema con 50 marcos y 3 procesos con WS de 20, 20 y 20. ¿Hay hiperpaginación?
  3. Explica por qué añadir más procesos empeora la hiperpaginación.
  4. Investiga cómo funciona el OOM killer en Linux.
  5. Usa vmstat 1 para observar la actividad de swap en tu sistema.
  6. Dibuja la gráfica de throughput vs grado de multiprogramación.
  7. Explica la diferencia entre asignación fija y variable de marcos.