← Gestión de Memoria Bloque 5 · Paginación · Tema 18 de 52

Tema 18

Paginación: páginas y marcos

La segmentación deja fragmentación externa: los segmentos son bloques contiguos y los huecos no se pueden usar. La paginación resuelve esto partiendo tanto la memoria física como la virtual en bloques de tamaño fijo: páginas (virtuales) y marcos (físicos). Un proceso se carga en marcos no contiguos, eliminando la fragmentación externa. Es la base de todos los sistemas modernos.

1. El problema: la fragmentación externa

Con segmentación (tema 15), cada segmento es un bloque contiguo en la RAM. Al cargar y descargar procesos, quedan huecos que no son suficientemente grandes para un segmento nuevo, aunque la memoria libre total sea suficiente. Es la fragmentación externa (tema 12).

La causa raíz es que los bloques tienen tamaños variables y deben ser contiguos. La solución es hacer que todos los bloques tengan el mismo tamaño, de modo que cualquier hueco sirva para cualquier bloque.

2. La idea: bloques de tamaño fijo

La paginación divide la memoria en bloques de tamaño fijo:

Ambos tienen el mismo tamaño (típicamente 4096 bytes). Un proceso se divide en páginas, y cada página se carga en un marco libre. Los marcos no necesitan ser contiguos en la RAM.

Paginación es la técnica que divide la memoria virtual en páginas y la física en marcos del mismo tamaño, asignando cada página a un marco libre, eliminando la fragmentación externa.

3. Páginas y marcos

ConceptoEspacioTamañoQuién lo gestiona
PáginaVirtual (del proceso)4096 B (típico)El proceso (indirectamente)
Marco (frame)Físico (RAM)4096 B (típico)El sistema operativo

El tamaño de página es una potencia de 2 (típicamente 4 KiB, a veces 2 MiB o 1 GiB para páginas grandes). Se elige para que la división de direcciones sea simple (bits).

El número de páginas de un proceso es ceil(tamaño_proceso / tamaño_página). El número de marcos de la RAM es RAM / tamaño_página.

4. Cómo se traduce una dirección

La dirección virtual se divide en dos partes:

La MMU usa p para indexar la tabla de páginas y obtener el número de marco f. La dirección física es f × tamaño_página + d. El desplazamiento no cambia: es el mismo en la página y en el marco.

Traducción: dirección virtual = (p, d). Si la tabla de páginas tiene entrada p → f, entonces dirección física = (f, d) = f × tamaño_página + d.

Traducción de dirección virtual a física con paginación Dirección virtual p (página) | d (desp.) Tabla de páginas entrada p → marco f + bits (presente, etc.) Dirección física f (marco) | d (desp.) p f
La página se traduce al marco; el desplazamiento se conserva. No hay fragmentación externa porque todos los bloques tienen el mismo tamaño.

5. Ventajas

6. Desventajas

7. Ejemplo numérico

Página de 4096 bytes (0x1000). Un proceso de 10000 bytes (0x2710) necesita 3 páginas (ceil(10000/4096) = 3). La tabla de páginas podría ser:

Página virtualMarco físicoPresente
05Sí
12Sí
28Sí

Traducción de la dirección virtual 0x1234:

8. Experimento en C

El programa siguiente simula la traducción con paginación:

paginacion.c
#include <stdio.h>

int main(void)
{
    const int PS = 4096;  /* tamaño de página */
    int tabla[] = {5, 2, 8};  /* página -> marco */
    unsigned int vaddr = 0x1234;

    unsigned int p = vaddr / PS;
    unsigned int d = vaddr % PS;
    unsigned int f = tabla[p];
    unsigned int fis = f * PS + d;

    printf("virtual  = 0x%04X\\n", vaddr);
    printf("página   = %u (0x%X)\\n", p, p);
    printf("desp.    = 0x%03X\\n", d);
    printf("marco    = %u\\n", f);
    printf("física   = 0x%04X\\n", fis);
    return 0;
}
terminal · traducción con paginación
$ gcc -std=c17 -Wall -Wextra -o paginacion paginacion.c
$ ./paginacion
virtual  = 0x1234
página   = 1 (0x1)
desp.    = 0x234
marco    = 2
física   = 0x2234física   = 0x2234

9. Probar con un simulador

Este simulador traduce una dirección virtual a física usando una tabla de páginas editable.

Simulador · paginación

CampoValor
Página virtual (p)
Desplazamiento (d)
Marco físico (f)
Dirección física

Tabla de páginas (editable: página → marco):

10. En Linux hoy

Linux usa paginación para toda la gestión de memoria. El tamaño de página por defecto es 4 KiB (consultable con getconf PAGESIZE). El sistema mantiene la tabla de páginas de cada proceso y la MMU (con la TLB) la consulta en cada acceso.

11. Resumen

12. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué es una página?

Un bloque de tamaño fijo de la memoria virtual de un proceso.

2. ¿Qué es un marco (frame)?

Un bloque de tamaño fijo de la memoria física (RAM).

3. ¿Por qué las páginas y los marcos tienen el mismo tamaño?

Para que cualquier página pueda cargarse en cualquier marco, eliminando la fragmentación externa.

4. ¿Cómo se divide una dirección virtual en paginación?

En número de página (bits altos) y desplazamiento (bits bajos).

5. ¿Qué parte de la dirección no cambia en la traducción?

El desplazamiento (d): es el mismo en la página y en el marco.

6. ¿Qué fragmentación elimina la paginación?

La fragmentación externa. Solo queda fragmentación interna en el último bloque.

7. ¿Cuál es el tamaño de página típico en Linux?

4096 bytes (4 KiB), consultable con getconf PAGESIZE.

8. ¿Por qué la paginación requiere una tabla?

Para mapear cada página virtual al marco físico que la contiene.

Para practicar

  1. Calcula el número de páginas para un proceso de 10000, 4096 y 4097 bytes con página de 4096.
  2. Traduce a mano la dirección 0x2ABC con página de 4096 y tabla {3, 7, 1}. ¿Cuál es la física?
  3. Modifica paginacion.c para aceptar la dirección virtual y la tabla como argumentos.
  4. Explica por qué la paginación no tiene fragmentación externa.
  5. Calcula cuántos marcos tiene una RAM de 8 GiB con páginas de 4 KiB.
  6. Investiga qué son las páginas grandes (huge pages) y por qué se usan.
  7. Dibuja el mapa de memoria de un proceso de 3 páginas en marcos no contiguos.