Un proceso utiliza direcciones virtuales.
La MMU traduce páginas virtuales a marcos físicos.
Recordemos el ejemplo de Tanenbaum:
La página 8 no está presente en RAM.
La CPU intenta acceder a una página que no está presente en RAM.
Cuando recibe un fallo de página:
Si el fallo puede resolverse, el proceso continúa normalmente.
En nuestro ejemplo, todos los marcos físicos están ocupados.
El sistema operativo necesita liberar uno.
Supongamos que decide desalojar la página virtual 1, que ocupa el marco físico 1.
Antes:
Después:
Nueva dirección física:
1 × 4096 + 12 = 4108
Cuando el sistema operativo necesita una página, puede:
Caso A — Página válida, pero ausente
Caso B — Dirección inválida o acceso prohibido
SIGSEGV.Memoria virtual
Es la abstracción que permite a cada proceso disponer de su propio espacio de direcciones.
Swap
Es un mecanismo que permite conservar fuera de RAM determinadas páginas de memoria.
La memoria virtual no requiere necesariamente swap.
Un proceso solicita una región adicional de 64 MiB.
¿Qué esperamos que ocurra inmediatamente?
VmSize?VmRSS en la misma cantidad?En Linux, ejecutaremos:
python3 memoria_bajo_demanda.py --mib 64
Observaremos cuatro momentos:
¿En qué momento se ocupa realmente la RAM?
Memoria reservada: _____ MiB
Tamaño de página: _____ bytes
| Indicador | Antes | Reservada | Utilizada |
|---|---|---|---|
VmSize (kB) |
_____ | _____ | _____ |
VmRSS (kB) |
_____ | _____ | _____ |
| Fallos menores | _____ | _____ | _____ |
(_____ MiB × 1024 × 1024) / _____ bytes = _____ páginas
VmRSS utilizada − VmRSS reservada = _____ kB
Fallos utilizada − Fallos reservada = _____
VmSize: tamaño del espacio virtual mapeado.VmRSS: memoria residente en RAM.Los contadores de fallos se acumulan desde el inicio del proceso.
¿Cómo se relaciona esto con la diferencia entre VmSize y VmRSS?
¿Qué precio pagamos cuando tenemos que recuperar páginas desde almacenamiento?
En Linux, creamos y activamos un archivo swap de 512 MiB:
fallocate -l 512M /swapfile
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
Verificamos:
free -h
swapon --show
¿Aumentó la memoria RAM del sistema?
Utilizamos un programa que:
MADV_PAGEOUT.python3 demo_swap.py
¿Dónde se encuentran las páginas cuando dejan de estar residentes en RAM?
En otra terminal:
watch -n 1 'free -h; swapon --show'
Para observar el proceso:
PID=12345 # Sustituir por el PID mostrado
grep -E 'VmRSS|VmSwap' /proc/$PID/status
Y la actividad del sistema:
vmstat 1
¿Qué ocurre cuando el programa vuelve a necesitar las páginas?
Tenemos tres marcos físicos, ocupados por las páginas:
[1] [2] [3]
El proceso solicita ahora la página 4.
FIFO: sale la página que ingresó primero.
LRU: sale la que lleva más tiempo sin usarse.
Reloj (segunda oportunidad): usa un bit de referencia antes de elegir una víctima.
¿Cuál de estas políticas conoce el futuro? (algoritmo OPT)
Tres marcos, inicialmente vacíos.
Referencias a páginas:
1 → 2 → 3 → 1 → 4 → 1 → 2 → 5
En parejas:
| Política | Fallos de página |
|---|---|
| FIFO | 7 |
| LRU | 6 |
¿Por qué FIFO puede expulsar una página que se utilizó hace muy poco?
¿LRU ganará siempre, para cualquier secuencia?
El algoritmo óptimo necesitaría conocer las referencias futuras.
¿Cómo aproximamos LRU sin registrar cada acceso?
R.R = 1: se pone en 0 y se continúa.R = 0: la página es candidata a reemplazo.La página utilizada recientemente recibe una segunda oportunidad.
La manecilla apunta a A:
| Marco | A | B | C |
|---|---|---|---|
Bit R |
1 | 0 | 1 |
Llega la página D y hay que reemplazar una página.
¿Cuál sale? ¿Qué bits cambian? ¿Dónde queda la manecilla?
Los programas no utilizan toda su memoria por igual.
Localidad temporal
Tendemos a utilizar repetidamente los mismos datos e instrucciones.
Localidad espacial
Tendemos a acceder a posiciones de memoria cercanas.
Por ejemplo: un bucle que recorre un arreglo.
Durante su ejecución, un programa utiliza principalmente un grupo de páginas.
A ese grupo de páginas activas lo llamamos conjunto de trabajo.
Imaginemos que:
El sistema pasa demasiado tiempo trayendo y expulsando páginas, en lugar de ejecutar trabajo útil.
A esta situación la llamamos Thrashing.
Cuando ocurre thrashing podemos observar:
En Linux podemos observar:
free -h
vmstat 1 5
Importante: utilizar swap no significa necesariamente que exista thrashing.
Actividad de autoevaluación: reemplazo de páginas
Consigna disponible en Webasignatura. No es necesaria para seguir la clase.
Hoy vimos cómo el sistema operativo:
¿Tener más espacio de direcciones significa tener más memoria física?