Atlasingeniería

Arquitectura y sistemas operativosSistemas operativosTema 5

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.

1 / 5
Las dos tablas usan la misma página 0 y apuntan a marcos distintos: por eso los dos procesos creen tener la memoria desde el principio y ninguno puede tocar la del otro. El aislamiento no lo revisa nadie en tiempo de ejecución, sale de que la dirección directamente no está en la tabla.

Antes de seguir, predecí

Un programa reserva 8 GB en una máquina con 4 GB de RAM. ¿Falla?

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

PropiedadCómo la da la tabla de páginasQué pasaría sin ella
Aislamientola dirección de otro proceso no está mapeadacualquiera lee la memoria de cualquiera
Reubicaciónla virtual no cambia aunque cambie el marcohabría que recompilar para cada posición
Comparticióndos tablas apuntando al mismo marcouna copia de cada biblioteca por proceso
Protecciónpermisos por páginase podría ejecutar cualquier dato
Más memoria que la físicapáginas en discoel límite sería la RAM instalada
Las cinco salen de la misma indirección. Y la primera no la verifica nadie en tiempo de ejecución: sale de que la dirección simplemente no existe en la tabla.

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?

¿Qué compra la indirección entre dirección virtual y física?
¿Para qué existe la TLB?
Dos procesos leen la dirección 0x400000 y encuentran cosas distintas. ¿Por qué?
¿Qué es un fallo de página?