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.
- 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.
- Acceso a una página: la MMU detecta que la página no está presente (P=0) y lanza un fallo de página.
- 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.
- 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.
4. Ventajas
- Programas más grandes que la RAM: un proceso puede tener un espacio virtual de gigabytes aunque la RAM sea de megabytes.
- Carga parcial: solo se cargan las páginas que se usan. Un programa que usa 10 % de su código no consume RAM para el 90 % restante.
- Más procesos simultáneos: al usar menos RAM por proceso, caben más procesos.
- Compartición: varias páginas virtuales pueden apuntar al mismo marco (código compartido).
- Aislamiento: cada proceso tiene su propio espacio virtual.
5. Desventajas
- Costo de los fallos de página: cargar una página desde el disco es miles de veces más lento que un acierto de caché.
- Hiperpaginación: si se usan más páginas de las que caben en la RAM, el sistema pasa todo el tiempo moviendo páginas (tema 33).
- Complejidad: el sistema operativo debe gestionar la tabla, los marcos libres y el swap.
- Overhead de memoria: la tabla de páginas ocupa memoria.
6. Ejemplo numérico
Un proceso de 100 MiB en un equipo con 16 MiB de RAM y páginas de 4 KiB:
- Páginas del proceso: 100 MiB / 4 KiB = 25600 páginas.
- Marcos disponibles: 16 MiB / 4 KiB = 4096 marcos.
- Solo 4096 páginas pueden estar en la RAM a la vez.
- Las demás (21504) están en el disco (swap).
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:
#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;
}
$ 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
| Medida | Valor |
|---|---|
| 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:
$ 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
free -h: muestra la RAM y el swap disponibles./proc/meminfo: detalle de la memoria del sistema./proc/PID/maps: mapa virtual del proceso.VmSizeyVmRSS: memoria reservada y residente.
10. Resumen
- La memoria virtual permite ejecutar programas más grandes que la RAM.
- Se basa en la paginación por demanda: las páginas se cargan solo cuando se accede a ellas.
- Ventajas: programas grandes, carga parcial, más procesos, compartición, aislamiento.
- Desventajas: costo de fallos de página, hiperpaginación, complejidad, overhead.
- El disco (swap) actúa como extensión de la RAM.
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
- Ejecuta
memvirtual.ccon 100, 500 y 2000 MiB. ¿Cómo cambia el tiempo? - Observa VmSize y VmRSS antes y después de tocar las páginas.
- Explica por qué un programa de 100 MiB puede ejecutarse en un equipo con 16 MiB de RAM.
- Investiga cómo se configura el swap en Linux (mkswap, swapon).
- Dibuja el flujo de un acceso a una página no presente.
- Compara el tiempo de acceso a una página en RAM vs en swap.
- Explica qué es la hiperpaginación y cómo se evita.