Memoria y direcciones virtuales
Por qué cada proceso ve su propio espacio de direcciones y cómo el sistema operativo hace barata esa ilusión.
Si los procesos usaran direcciones físicas directamente, cualquier error podría sobrescribir los datos de otro programa, y cada programa tendría que saber dónde se cargó. Ninguna de las dos cosas es aceptable.
La memoria virtual divide cada espacio de direcciones en páginas de tamaño fijo y las asigna a marcos físicos mediante una tabla de páginas. La MMU de la CPU traduce en cada acceso, así que el programa nunca ve direcciones reales.
Las páginas que no se han tocado recientemente pueden escribirse a disco y desasignarse. Cuando se necesitan de nuevo, un fallo de página las trae de vuelta. Así un programa puede usar más memoria de la que hay físicamente, pero no gratis.
/* Виртуальный адрес — это НЕ адрес в микросхеме памяти.
* MMU переводит его в физический на каждом обращении. */
#define PAGE_SHIFT 12 /* страница = 4 КиБ */
int vpn = vaddr >> PAGE_SHIFT; /* номер виртуальной страницы */
int off = vaddr & 0xFFF; /* смещение внутри страницы */
int pfn = page_table[vpn].frame; /* номер физического фрейма */
int paddr = (pfn << PAGE_SHIFT) | off;Práctica
¿Por qué dos procesos pueden usar ambos la dirección 0x1000 sin interferir?
Pistas
- La dirección que ve el programa no es la que ve el chip de memoria.
- Cada proceso recibe su propia tabla de traducción.
12 XP
Ordena los pasos de la gestión de un fallo de página.
Pistas
- El hardware no puede resolverlo solo: tiene que preguntar al núcleo.
- La instrucción que falló no se pierde: vuelve a ejecutarse después.
14 XP
Una máquina tiene 8 GB de RAM y un programa necesita 20 GB. Explica qué ocurre y por qué aun así puede funcionar.
Pistas
- No todo el programa se necesita en el mismo instante.
- La máquina tiene un sitio más lento para el resto.
14 XP