← Gestión de Memoria Bloque 8 · Reemplazo de páginas · Tema 34 de 52

Tema 34

El problema del reemplazo

Cuando la RAM está llena y se necesita cargar una nueva página, hay que elegir una página existente para reemplazar. La elección de la víctima es el corazón de la memoria virtual. En este tema verás qué es la víctima, el papel del bit sucio (dirty bit), las cadenas de referencias y el costo del reemplazo.

1. El problema: no quedan marcos libres

Cuando la RAM está llena y se produce un fallo de página, el sistema no puede cargar la nueva página sin liberar un marco. Debe elegir una página existente (la víctima) para reemplazarla.

La elección de la víctima es crítica: si se reemplaza una página que se va a usar pronto, se generará otro fallo inmediatamente (thrashing). Si se reemplaza una página que no se usará por un tiempo, el impacto es mínimo.

2. La idea: reemplazar una página

El reemplazo de páginas consiste en:

  1. Elegir una víctima: una página que esté en la RAM.
  2. Si la víctima está sucia (dirty): escribirla al disco (swap o archivo).
  3. Liberar el marco: marcar la entrada de la tabla como no presente.
  4. Cargar la nueva página: leerla del disco al marco liberado.
  5. Actualizar la tabla: P=1, marco=f, bits actualizados.

El objetivo es elegir la víctima que minimice el número de fallos futuros.

3. La víctima

La víctima es la página que se reemplaza. La elección depende del algoritmo de reemplazo (FIFO, LRU, óptimo, etc.), que se estudia en los temas 35-38. Pero independientemente del algoritmo, hay consideraciones:

4. El bit sucio (dirty bit)

El bit dirty (D) de la PTE indica si la página se ha modificado desde que se cargó en la RAM. El hardware lo pone a 1 en cada escritura.

El bit dirty es crucial para el rendimiento: reemplazar una página limpia es mucho más barato que reemplazar una sucia.

Los algoritmos de reemplazo suelen preferir víctimas limpias cuando es posible (NRU, tema 38).

5. La cadena de referencias

La cadena de referencias es la secuencia de accesos a páginas que un proceso realiza. Es la entrada para los algoritmos de reemplazo. Por ejemplo:

7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1

Los algoritmos procesan esta cadena y deciden qué página reemplazar en cada fallo. La calidad del algoritmo se mide por el número de fallos que genera sobre una cadena dada.

6. El costo del reemplazo

El costo de reemplazar una página depende de si está sucia:

Tipo de víctimaCostoAcciones
Limpia (dirty=0)~10 ms (lectura del disco)Descartar la página, cargar la nueva.
Sucia (dirty=1)~20 ms (escritura + lectura)Escribir la página al disco, cargar la nueva.

El costo de reemplazar una página sucia es el doble que el de una limpia (escritura + lectura).

7. Ejemplo numérico

Un sistema con 3 marcos de RAM. La cadena de referencias es: 1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5. Con algoritmo FIFO:

AccesoMarco 1Marco 2Marco 3Fallo?
11——Sí
212—Sí
3123Sí
4423Sí (reemplaza 1)
1413Sí (reemplaza 2)
2412Sí (reemplaza 3)
5512Sí (reemplaza 4)
1512No
2512No
3532Sí (reemplaza 1)
4534Sí (reemplaza 2)
5534No

Total: 9 fallos de página (de 12 accesos). La tasa de fallos es 9/12 = 75 %.

8. Experimento en C

El programa siguiente simula el reemplazo con FIFO sobre una cadena de referencias:

reemplazo.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
    int marcos = 3;
    int mem[3] = {-1, -1, -1};  /* -1 = vacío */
    int seq[] = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5};
    int nseq = 12;
    int fifo = 0;  /* índice FIFO */
    int fallos = 0;

    for (int i = 0; i < nseq; i++) {
        int p = seq[i];
        int found = 0;
        for (int j = 0; j < marcos; j++)
            if (mem[j] == p) { found = 1; break; }
        if (found) {
            printf("pág %d: HIT  (mem: %d %d %d)\\n", p, mem[0], mem[1], mem[2]);
        } else {
            fallos++;
            if (mem[fifo] != -1) printf("pág %d: MISS (reemplaza %d)\\n", p, mem[fifo]);
            else printf("pág %d: MISS (marco libre)\\n", p);
            mem[fifo] = p;
            fifo = (fifo + 1) % marcos;
            printf("         mem: %d %d %d\\n", mem[0], mem[1], mem[2]);
        }
    }
    printf("\\nFallos: %d de %d (%.1f%%)\\n", fallos, nseq, 100.0 * fallos / nseq);
    return 0;
}
terminal · simulación de reemplazo FIFO
$ gcc -std=c17 -Wall -Wextra -o reemplazo reemplazo.c
$ ./reemplazo$ ./reemplazo

9. Probar con un simulador

Este simulador muestra el proceso de reemplazo: cada fallo elige una víctima, la escribe si está sucia, y carga la nueva página.

Simulador · reemplazo de páginas

MedidaValor
Accesos totales
Fallos de página
Reemplazos
Víctimas sucias (escrituras al disco)
Tasa de fallos

10. En Linux

Linux gestiona el reemplazo de páginas mediante el algoritmo de reloj (clock) sobre las páginas activas e inactivas. Las herramientas para observar:

terminal · reemplazo en Linux
$ grep -E 'pgpgin|pgpgout|pswpin|pswpout' /proc/vmstat

11. Resumen

12. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué es la víctima en el reemplazo de páginas?

La página elegida para ser reemplazada cuando no hay marcos libres.

2. ¿Qué indica el bit sucio (dirty)?

Si la página se ha modificado desde que se cargó en la RAM.

3. ¿Qué ocurre si la víctima está sucia?

Hay que escribirla al disco antes de reemplazarla.

4. ¿Qué es más barato: reemplazar una página limpia o sucia?

Una limpia: solo se lee la nueva página del disco, sin escribir.

5. ¿Qué es la cadena de referencias?

La secuencia de accesos a páginas que un proceso realiza.

6. ¿Cuánto cuesta reemplazar una página limpia?

~10 ms (solo lectura del disco).

7. ¿Cuánto cuesta reemplazar una página sucia?

~20 ms (escritura + lectura del disco).

8. ¿Qué algoritmo usa Linux para el reemplazo?

El algoritmo de reloj (clock) sobre páginas activas e inactivas.

Para practicar

  1. Modifica reemplazo.c para contar las víctimas sucias (simular el bit dirty).
  2. Calcula el costo total de reemplazar 10 páginas (5 limpias, 5 sucias) con costos de 10 y 20 ms.
  3. Explica por qué los algoritmos de reemplazo prefieren víctimas limpias.
  4. Investiga cómo Linux implementa el algoritmo de reloj (clock).
  5. Usa vmstat para observar la actividad de swap en tu sistema.
  6. Dibuja el flujo de reemplazo de una página sucia.
  7. Compara el costo de reemplazar una página limpia vs sucia.