Cómo traduce el sistema las direcciones de memoria
La memoria virtual hace que cada programa crea tener su propia memoria, empezando en la dirección 0. El sistema operativo y el procesador traducen cada dirección del programa a un lugar real de la memoria.
Gracias a eso, dos programas pueden usar la misma dirección sin pisarse, y uno no puede leer los datos del otro.
Hoy aprendes a hacer esa traducción a mano con una tabla.
Al final de esta lección
Nota
Puedo convertir una dirección virtual en una física con una tabla de páginas.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Dirección virtual | la dirección que usa el programa | |
| Dirección física | la dirección real en la memoria | |
| Página | un trozo de tamaño fijo de la memoria virtual | |
| Marco | un trozo de tamaño fijo de la memoria real | |
| Tabla de páginas | la lista que dice qué marco guarda cada página | |
| Desplazamiento | la posición dentro de una página | 234 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
La memoria se corta en páginas y marcos
El sistema corta la memoria virtual de cada programa en trozos iguales, las páginas. Corta la memoria real en trozos del mismo tamaño, los marcos.
Cualquier página puede ir a cualquier marco. Los marcos de un programa no tienen que estar juntos ni en orden. Así el sistema aprovecha todos los huecos libres.
El tamaño de página de esta máquina
getconf PAGESIZESe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Una página suele medir 4096 bytes
En un PC habitual la orden imprime 4096: cada página y cada marco guardan 4096 bytes, que son 4 KiB. En otras máquinas puede ser otro tamaño.
Una dirección se parte en dos: el número de página y el desplazamiento dentro de la página.
Parte la dirección 8200 en página y desplazamiento
python3 -c "print(8200 // 4096, 8200 % 4096)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Página y desplazamiento salen de una división
La Run imprime 2 8. La división entera, //, da la página: 8200 cabe dos veces en bloques de 4096. El resto, %, da el desplazamiento: sobran 8 direcciones.
Así que la dirección virtual 8200 es la posición 8 de la página 2.
La tabla de páginas localiza cada página
La tabla de páginas guarda, para cada página, el marco que la contiene. Para traducir una dirección se hacen tres pasos.
Primero se parte en página y desplazamiento. Después se busca la página en la tabla y se obtiene el marco. Por último la dirección física es el marco por el tamaño de página, más el desplazamiento.
Ejemplo: traducir con páginas de 1000
| Dirección virtual | Página | Desplazamiento | Marco en la tabla | Dirección física |
|---|---|---|---|---|
| 1234 | 1 | 234 | 2 | 2 x 1000 + 234 = 2234 |
| 2999 | 2 | 999 | 7 | 7 x 1000 + 999 = 7999 |
| 50 | 0 | 50 | 5 | 5 x 1000 + 50 = 5050 |
| 3500 | 3 | 500 | no está | fallo de página |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un fallo de página avisa al sistema
La tabla del ejemplo es: página 0 en el marco 5, página 1 en el 2 y página 2 en el 7. La página 3 no figura.
Cuando un programa usa una dirección cuya página no está en memoria, el procesador lanza un fallo de página y avisa al sistema. El sistema busca la página en el disco, le hace sitio y repite la instrucción.
Traduce la dirección 8200 con el marco 7
python3 -c "print(7 * 4096 + 8)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cuántas páginas de 4096 caben en 4 GiB
python3 -c "print(2 ** 32 // 4096)"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Dos líneas del informe de memoria real
grep -E '^(MemTotal|MemFree)' /proc/meminfo | cut -d: -f1Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lo que dicen las tres órdenes
La primera imprime 28680: la dirección física de la posición 8 del marco 7. La segunda imprime 1048576: una tabla para 4 GiB necesita más de un millón de entradas.
La tercera imprime los nombres MemTotal y MemFree. En /proc/meminfo hay una cifra al lado de cada nombre y cambia en cada máquina.
Un error frecuente
Advertencia
Mucha gente cree que la dirección física es la virtual más un número fijo. Cada página va a un marco distinto, así que se busca en la tabla. Solo el desplazamiento se conserva: se suma al comienzo del marco.