Memoria virtual y paginación
Cada proceso cree tener toda la memoria para él. Esa mentira coordinada es lo que da aislamiento, permite usar más memoria de la que hay y hace que cargar un programa sea instantáneo.
Para este tema conviene tener claro:Jerarquía de memoria y cachéProcesos e hilos
Dos procesos pueden leer la dirección 0x400000 y encontrar cosas distintas. No es un truco del
lenguaje: las direcciones que ve un programa no son las de la memoria física. Entre unas y otras hay
una traducción por hardware, y de ahí sale casi todo lo que el sistema operativo puede garantizar.
Páginas, marcos y la traducción
El espacio de direcciones virtual de cada proceso se divide en páginas de tamaño fijo, típicamente 4 KB. La memoria física se divide en marcos del mismo tamaño. Una tabla de páginas dice qué página va a qué marco.
La traducción la hace la unidad de gestión de memoria en cada acceso, por hardware. Como recorrer la tabla en cada acceso sería carísimo, hay una caché de traducciones —la TLB— que resuelve la enorme mayoría sin tocar la tabla.
El proceso A tiene sus páginas virtuales mapeadas a marcos físicos. Los números de marco no tienen ningún orden: la reubicación es libre.
Antes de seguir, predecí
Lo que compra la indirección
La indirección compra tres cosas de golpe. Aislamiento: un proceso no puede nombrar una dirección de otro, porque su tabla no la mapea. Reubicación: el programa se carga en cualquier parte de la memoria física sin recompilar. Compartición controlada: dos procesos pueden mapear el mismo marco, que es como una biblioteca compartida está en memoria una sola vez.
Además, cada entrada lleva permisos —lectura, escritura, ejecución—, y de ahí salen las protecciones que impiden ejecutar datos escritos por el atacante.
El fallo de página y qué hace el sistema
Si la página no está en memoria física, la MMU genera un fallo de página y el sistema operativo toma el control: busca la página en disco, elige un marco, la carga y reanuda la instrucción que falló.
Eso permite dos cosas notables. Ejecutar programas más grandes que la memoria disponible, y cargar un programa sin leerlo entero: se mapea el archivo y las páginas se traen a medida que se tocan. Un ejecutable de cien megabytes arranca al instante porque casi nada se cargó todavía.
A quién desalojar
Cuando no hay marcos libres hay que desalojar alguno. El óptimo teórico sería desalojar la página que tardará más en volver a usarse, que requiere ver el futuro, y sirve sólo como referencia.
En la práctica se aproxima la menos usada recientemente, con mecanismos baratos como el bit de referencia y el algoritmo del reloj. Si una página modificada se desaloja, hay que escribirla a disco primero; por eso las limpias son candidatas preferidas.
Thrashing: el fracaso característico
El fracaso característico es el thrashing: hay tan poca memoria para tantos procesos que las páginas se desalojan apenas cargadas, y el sistema pasa el tiempo moviendo páginas en vez de ejecutar.
El síntoma es inconfundible: uso de CPU bajísimo y disco al máximo, con todo trabado. La solución no es más swap sino menos procesos o más memoria, y de ahí sale el concepto de conjunto de trabajo: las páginas que un proceso necesita activamente. Si los conjuntos de trabajo no entran juntos, el sistema colapsa.
Dos detalles que se ven en producción
Dos detalles que se ven en producción. Las tablas de páginas son multinivel para no ocupar memoria por direcciones nunca usadas, y las páginas grandes —2 MB— reducen la presión sobre la TLB en procesos con mucha memoria, como una base de datos.
Y malloc casi nunca reserva memoria física: reserva espacio virtual, y el marco aparece al escribir
la primera vez. Por eso un proceso puede reservar más de lo que hay, y por eso la memoria virtual que
reporta el sistema no es lo que realmente está usando. La medida útil es la residente.
Lo que se ve desde arriba
Lo que compra la indirección
| Propiedad | Cómo la da la tabla de páginas | Qué pasaría sin ella |
|---|---|---|
| Aislamiento | la dirección de otro proceso no está mapeada | cualquiera lee la memoria de cualquiera |
| Reubicación | la virtual no cambia aunque cambie el marco | habría que recompilar para cada posición |
| Compartición | dos tablas apuntando al mismo marco | una copia de cada biblioteca por proceso |
| Protección | permisos por página | se podría ejecutar cualquier dato |
| Más memoria que la física | páginas en disco | el límite sería la RAM instalada |
Cierre
Páginas, marcos y una tabla que traduce, con la TLB acelerando. De ahí salen aislamiento, reubicación, compartición y permisos. El fallo de página permite usar más memoria de la que hay y arrancar sin cargar todo; el thrashing es su fracaso, y se reconoce por CPU baja con disco saturado.
Autoevaluación
¿Lo entendiste?
Práctica