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

Tema 28

Qué es la memoria virtual

La memoria virtual es la técnica que permite ejecutar programas más grandes que la RAM física y que los procesos carguen solo lo que usan. En este tema verás la idea, cómo funciona la paginación por demanda, las ventajas y desventajas, y cómo se observa en Linux. Es el puente entre la paginación (temas 18-23) y los fallos de página (tema 29).

1. El problema: programas más grandes que la RAM

Los programas modernos son enormes: un navegador puede usar gigabytes, un sistema operativo completo más. La RAM física es limitada (8-64 GiB). ¿Cómo se ejecutan programas que no caben en la RAM?

Antes de la memoria virtual, la solución era cargar el programa entero en la RAM o no ejecutarlo. Esto limitaba el tamaño de los programas y el número de procesos simultáneos.

Además, muchos programas no usan toda su memoria a la vez: un editor de texto usa solo una parte del documento, un juego carga solo el nivel actual. Cargar todo es un desperdicio.

2. La idea: memoria virtual

La memoria virtual es la técnica que permite que un proceso tenga un espacio de direcciones mayor que la RAM física, cargando solo las páginas que necesita y moviendo las demás al disco (swap).

La clave es la paginación por demanda: las páginas no se cargan en la RAM hasta que se accede a ellas. Cuando la RAM se llena, se reemplazan páginas (se mueven al disco) para hacer sitio.

Memoria virtual es la técnica que permite que un proceso use un espacio de direcciones mayor que la RAM física, cargando páginas solo cuando se necesitan y usando el disco como extensión de la memoria.

3. Cómo funciona: paginación por demanda

La memoria virtual se basa en la paginación (tema 18) con un cambio crucial: las páginas no se cargan al crear el proceso, sino cuando se accede a ellas.

  1. Creación del proceso: el sistema crea la tabla de páginas con todas las entradas marcadas como no presentes (P=0). No se carga nada en la RAM.
  2. Acceso a una página: la MMU detecta que la página no está presente (P=0) y lanza un fallo de página.
  3. El SO carga la página: busca un marco libre (o reemplaza uno), carga la página desde el disco, actualiza la tabla (P=1) y reanuda la instrucción.
  4. Si no hay marcos libres: se reemplaza una página (se mueve al disco) para hacer sitio.

Este mecanismo se llama paginación por demanda (demand paging). Es la base de la memoria virtual.

Memoria virtual: páginas en disco y RAM, con tabla de páginas Disco (swap) pág 0 pág 2 pág 5 pág 7 RAM pág 1 pág 3 pág 4 Tabla de páginas pág 0 → disco pág 1 → marco 2 pág 2 → disco pág 3 → marco 5 pág 4 → marco 7 pág 5 → disco pág 6 → disco pág 7 → disco
Las páginas que se usan están en la RAM; las demás, en el disco. La tabla de páginas indica dónde está cada una.

4. Ventajas

5. Desventajas

6. Ejemplo numérico

Un proceso de 100 MiB en un equipo con 16 MiB de RAM y páginas de 4 KiB:

Si el proceso accede a las 25600 páginas en orden, se producen 25600 fallos de página, pero solo los primeros 4096 se resuelven sin reemplazo. El resto requiere reemplazar páginas.

7. Experimento en C

El programa siguiente reserva un bloque grande con malloc y toca las páginas una a una, midiendo el tiempo:

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

static double ahora(void) { struct timespec t; clock_gettime(CLOCK_MONOTONIC, &t); return t.tv_sec + t.tv_nsec/1e9; }

int main(int argc, char **argv)
{
    size_t tam = argc > 1 ? (size_t)strtoul(argv[1], NULL, 10) : (100 << 20);
    char *p = malloc(tam);
    if (p == NULL) { fprintf(stderr, "sin memoria\\n"); return 1; }

    size_t paginas = tam / 4096;
    double t0 = ahora();
    for (size_t i = 0; i < paginas; i++) p[i * 4096] = 1;
    double t1 = ahora();
    printf("Tocar %zu páginas (%zu MiB): %.3f s\\n", paginas, tam >> 20, t1 - t0);

    free(p);
    return 0;
}
terminal · memoria virtual en acción
$ gcc -std=c17 -O2 -Wall -Wextra -o memvirtual memvirtual.c
$ ./memvirtual 500
Tocar 128000 páginas (500 MiB): 0,256 s
$ ./memvirtual 2000
Tocar 512000 páginas (2000 MiB): 1,024 sTocar 512000 páginas (2000 MiB): 1,024 s

El programa toca 500 MiB en 0,256 s (unas 2 ms por MiB). Esto es porque la RAM se entrega al tocar (paginación por demanda) y la mayoría de las páginas se cargan desde el disco o se ponen a cero.

8. Probar con un simulador

Este simulador muestra cómo se cargan las páginas en la RAM a medida que se accede a ellas, y cómo se reemplazan cuando la RAM se llena.

Simulador · memoria virtual

MedidaValor
Accesos totales
Fallos de página
Reemplazos
Tasa de fallos

9. En Linux

Linux implementa la memoria virtual con paginación por demanda. Las herramientas para observarla:

terminal · memoria virtual en Linux
$ free -h
$ cat /proc/meminfo | grep -i 'swap\|memtotal\|memavailable'
$ cat /proc/self/maps | head
$ grep VmSize /proc/self/status; grep VmRSS /proc/self/status

10. Resumen

11. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué es la memoria virtual?

La técnica que permite que un proceso use un espacio de direcciones mayor que la RAM física.

2. ¿Cómo funciona la paginación por demanda?

Las páginas no se cargan al crear el proceso; se cargan cuando se accede a ellas, lanzando un fallo de página.

3. ¿Qué ventaja tiene la carga parcial?

Solo se carga en la RAM lo que se usa, ahorrando memoria.

4. ¿Qué es el swap?

El espacio en disco que actúa como extensión de la RAM para páginas que no caben.

5. ¿Qué desventaja tiene la memoria virtual?

El costo de los fallos de página (cargar desde disco es miles de veces más lento).

6. ¿Qué es la hiperpaginación?

Cuando se usan más páginas de las que caben en la RAM y el sistema pasa todo el tiempo moviendo páginas.

7. ¿Cómo se mide la memoria virtual de un proceso en Linux?

Con VmSize (reservada) y VmRSS (residente) en /proc/PID/status.

8. ¿Qué herramienta muestra la RAM y el swap disponibles?

free -h.

Para practicar

  1. Ejecuta memvirtual.c con 100, 500 y 2000 MiB. ¿Cómo cambia el tiempo?
  2. Observa VmSize y VmRSS antes y después de tocar las páginas.
  3. Explica por qué un programa de 100 MiB puede ejecutarse en un equipo con 16 MiB de RAM.
  4. Investiga cómo se configura el swap en Linux (mkswap, swapon).
  5. Dibuja el flujo de un acceso a una página no presente.
  6. Compara el tiempo de acceso a una página en RAM vs en swap.
  7. Explica qué es la hiperpaginación y cómo se evita.