Rodolfo Pilas
bloger podcaster devops sysadmin profesor father
¿Cómo evitamos que un proceso modifique los datos de otro?
Imaginemos que cada programa utiliza direcciones físicas absolutas.
1000?Un programa debe poder ejecutarse sin depender de una posición fija en RAM.
Un programa no debe acceder arbitrariamente a la memoria de otro.
Cada proceso trabaja con su propio conjunto de direcciones.
Virtual: la dirección que utiliza el proceso.
Física: la ubicación real dentro de la RAM.
No todas las regiones tienen el mismo tamaño ni los mismos permisos.
En /proc/<PID>/ encontramos información del proceso.
maps → regiones virtuales y permisos.status → indicadores de memoria.pmap → otra vista del mapa, si está instalado.¿Podemos ver directamente la RAM física desde aquí?
En una terminal Linux:
sleep 1800 &
PID=$!
cat /proc/$PID/maps
Luego:
grep -E 'VmSize|VmRSS|VmData|VmStk' /proc/$PID/status
pmap -x "$PID" # si está disponible
¿Qué componentes encontramos en la memoria del proceso? Identificar el programa, las bibliotecas y el stack.
¿Todas las regiones tienen los mismos permisos? ¿Por qué algunas permiten ejecución y otras escritura?
¿Qué diferencia encontramos entre la memoria virtual y la residente? Comparen VmSize con VmRSS.
¿Por qué un proceso puede tener más memoria virtual que memoria residente en RAM?
pmap: el mapa describe direcciones virtuales.
La memoria libre tiene estos huecos separados, en orden:
| Hueco A | Hueco B | Hueco C | Hueco D |
|---|---|---|---|
| 8 KB | 20 KB | 12 KB | 30 KB |
Un proceso pide 12 KB contiguos.
¿Dónde lo colocarías y por qué?
Para la solicitud de 12 KB:
¿Cuál dejará los huecos más útiles para las próximas solicitudes?
| Hueco A | Hueco B | Hueco C | Hueco D |
|---|---|---|---|
| 8 KB | 20 KB | 12 KB | 30 KB |
Externa: hay memoria libre total, pero está repartida en huecos separados.
Interna: asignamos un bloque mayor que lo solicitado; parte queda sin utilizar.
En lugar de reservar una región contigua para todo el proceso...
La paginación evita exigir contigüidad física para todo el proceso.
dirección virtual % tamaño de página).$$\mathbf{Dirección\ física = (Marco \times Tamaño\ de\ página) + Desplazamiento}$$
| Página | Marco |
|---|---|
| 0 | 2 |
| 1 | 1 |
| 2 | 6 |
| 3 | 0 |
| 4 | 4 |
| 5 | 3 |
| 6, 7 y 8 | (no en RAM) |
| 9 | 5 |
| 10 | (no en RAM) |
| 11 | 7 |
| 12 a 15 | (no en RAM) |
Página virtual: 0 / 4096 = 0
Desplazamiento: 0 (mod 4096) = 0
Marco asociado: La página 0 se mapea al marco 2
Dirección física: (2 * 4096) + 0 = 8192
$$\mathbf{Dirección\ física = (Marco \times Tamaño\ de\ página) + Desplazamiento}$$
Página virtual: 8192 / 4096 = 2
Desplazamiento: 8192 (mod 4096) = 0
Marco asociado: La página 2 se mapea al marco 6
Dirección física: (6 * 4096) + 0 = 24576
$$\mathbf{Dirección\ física = (Marco \times Tamaño\ de\ página) + Desplazamiento}$$
Página virtual: 20500 / 4096 = 5
(el rango de la página 5 inicia en 20480)
Desplazamiento: 20500 - 20480 = 20 bytes
Marco asociado: La página 5 se mapea al marco 3
Dirección física: (3 * 4096) + 20 = 12308
$$\mathbf{Dirección\ física = (Marco \times Tamaño\ de\ página) + Desplazamiento}$$
Página virtual: 32780 / 4096 = 8
(el rango de la página 8 inicia en 32768)
Desplazamiento: 32780 - 32768 = 12 bytes
Marco asociado: La página 8 no pose asignación de
memoria física (marcada con X)
Resultado: fallo de página (page fault). SO debe
$$\mathbf{Dirección\ física = (Marco \times Tamaño\ de\ página) + Desplazamiento}$$
Cada acceso a memoria requiere traducir una dirección.
TLB (Translation Lookaside Buffer): pequeña caché de traducciones recientes.
Un fallo de TLB no significa necesariamente un fallo de página.
Hoy vimos cómo el sistema operativo:
¿Qué pasa si necesitamos una página que no está en RAM?
¿Qué sucede si todos los marcos físicos están ocupados?
By Rodolfo Pilas