¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Memoria virtual: páginas y tabla de páginas

Después de esta lección: Puedo convertir una dirección virtual en una física con una tabla de páginas.

Lección de 55 min5 comandosLaboratorio de comandos de Linux de cada día: los treinta comandos que se escriben de memoria

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

PalabraQué significaEjemplo
Dirección virtualla dirección que usa el programa
Dirección físicala dirección real en la memoria
Páginaun trozo de tamaño fijo de la memoria virtual
Marcoun trozo de tamaño fijo de la memoria real
Tabla de páginasla lista que dice qué marco guarda cada página
Desplazamientola posición dentro de una página234

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

Comando
getconf PAGESIZE

Se 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

Comando
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 virtualPáginaDesplazamientoMarco en la tablaDirección física
1234123422 x 1000 + 234 = 2234
2999299977 x 1000 + 999 = 7999
5005055 x 1000 + 50 = 5050
35003500no 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

Comando
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

Comando
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

Comando
grep -E '^(MemTotal|MemFree)' /proc/meminfo | cut -d: -f1

Se 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.

Sobre este laboratorio y su código: Laboratorio de comandos de Linux de cada día: los treinta comandos que se escriben de memoria

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.