Tema 4.2 - Memoria 

Introducción


📖
El concepto de memoria virtual surge porque los ordenadores empiezan a tener varios programas ejecutándose a la vez, por que lo que todos ellos deben estar cargados en memoria principal a la vez.
💡
Cuando las memorias principales (RAM) tenían una menor capacidad, era necesario utilizar una memoria adicional (memoria swap) donde se almacenarían los datos menos utilizados cuando había que liberar espacio de la memoria principal
🗺️
El mapa de memoria se conoce como todas las unidades direccionables por un proceso.
  • Se dice que el computador emplea memoria real cuando el mapa de memoria está compuesto únicamente por la memoria principal y la caché
  • Se dice que el computador emplea memoria virtual cuando el mapa de memoria está compuesto por la memoria principal, caché y disco duro
👾
Memoria virtual
La memoria virtual consiste una traducción de las direcciones accesibles por un proceso, en direcciones reales ubicadas en memoria principal o el disco duro.
 
El uso de esta estrategia de direccionamiento permite también lo siguiente:
Posicionamiento independiente del proceso
Dado que las direcciones que utiliza el proceso serán traducidas, esto nos permite situar el proceso en cualquier parte de la memoria. Esto funciona ya que las direcciones que utiliza el proceso son más bién offsets desde la dirección real donde se carga el programa.
Protección de la memoria entre procesos
Dado que las direcciones son traducidas, esto impide que dos procesos puedan acceder a la misma dirección real de la memoria, ya que aunque estos escriban en la misma dirección virtual, esta no será la misma dirección real.
💡
En realidad dos procesos sí que pueden acceder a los mismos datos. El SO se lo permite asignandoles a ambos el mismo bloque en memoria principal a sus direcciones virtuales (normalmente esto se hace permitiendo solo lectura)
 
💡
Adicionalmente, la memoria virtual nos sirve para poder gestionar cómo se almacenan los diferentes datos del proceso
  • Cuánto se almacena en memoria principal (memoria física), y cuánto en disco
  • Permite la relocalización de diferentes partes del proceso en diferentes páginas de memoria (no necesariamente consecutivos)
📄
Páginas
Las direcciones virtuales se agrupan en lo que llamaremos páginas. Una página se almacena en memoria principal, en un espacio de igual tamaño llamado marco de página
💡
Las páginas, marcos de páginas, bloques y líneas; todos tienen el mismo tamaño
  • Páginas → Agrupaciones de direcciones virtuales (Memoria virtual)
  • Marcos de páginas → Agrupaciones de direcciones físicas/marcos (Memoria principal)
  • Líneas → Nombre que recibe un bloque cuando se encuentra en la (caché)
  • Bloques → Agrupaciones de direcciones físicas (mem. ppal. ó disco)
🚨
Fallo de página
Dado que las direcciones virtuales se traducen en direcciones que pueden estar almacenadas en memoria principal o en disco, el acceso a una dirección virtual puede resultar en un fallo de página. Esto implicaría que hay que traer del disco la página solicitada a la memoria principal.

Elementos de diseño


Segmentación ó Paginación

📖
Sistema segmentado
La memoria se divide en bloques de tamaño variable llamados segmentos para almacenar cada no de los objetos que necesita un proceso
 
Los segmentos se adaptan exactamente al tamaño de los diferentes datos que está almacenando el proceso (código, stack, heap, libs, …)
🟢 Ventajas
  • No se desaprovecha nada de espacio ya que cada proceso ocupa exactamente lo que necesita
🔴 Desventajas
  • Esto dificulta encontrar un espacio en memoria lo suficientemente grande para almacenar los datos
  • Se complica la tarea de traducir la direcciones virtuales (el tamaño de los segmentos no suele ser potencia de 2)
  • Es dificil garantizar que no se supera el tamaño máximo de segmento
📖
Sistema paginado
La memoria se divide en bloques llamados páginas. Cada una de estas páginas tiene un tamaño xx siendo x=2kx=2^k (un valor potencia de 22), lo que facilita la traducción de direcciones virtuales a físicas.
 
Las páginas (conjunto de direcciones virtuales) se asigan a un espacio del mismo tamaño en memoria principal llamado marco de página
🟢 Ventajas
  • Es facil encontrar un espacio el memoria principal donde asignar una página, al tener todos el mismo tamaño
  • El facil garantizar que que no se sobrepasa el tamaño de memoria asignado
🔴 Desventajas
📔
Se dice fragmentación interna al hecho de que la ultima página al ser de tamaño fijo, esta reserva más memoria de la que va a necesitar, por lo que ese espacio es desaprovechado
📖
Segmentación paginada (combinación de las enteriores)
La memoria se divide en varios grandes bloques, cada uno de estos bloques almacenará un segmento. Cada bloque se divide a su vez en páginas.
notion image

Traducción de direcciones (Política de Identificación)

📖
Política de identificación
Dada una dirección virtual, la política de identificación permite determinar si la página correspondiente está en memoria principal ó en disco
🤖
MMU (Memory Management Unit)
Esta unidad se encarga de traducir la dirección virtual y determinar a partir de ella dónde se encuentra el dato solicitado.
🏷️ Campos de una dirección virtual
Virtual page number (k32,kn)(k_{32},k_{n})
Page offset (kn1,k0)(k_{n-1},k_0)
0xNNNNNN
0xNN
⚠️
Hay que recordar dado que el número de páginas virtuales es mayor al número de páginas físicas, algunas páginas virtuales se tienen que almacenar en disco
⚠️ Este diagrama solo representa el hecho de que algunas direcciónes apuntan al disco, pero no es una fiel representación del proceso de traducción de direcciones y de las tablas
⚠️ Este diagrama solo representa el hecho de que algunas direcciónes apuntan al disco, pero no es una fiel representación del proceso de traducción de direcciones y de las tablas

Tabla de páginas

📖
La tabla de páginas determina a partir de la página virtual, la página física (marco) que debemos consultar, esta puede situarse en memoria principal o en disco
Nota:
El Número de página virtual no es una columna de la tabla, sino el número de fila que debemos consultar en esta
notion image
 
💡
Esta tabla es única para cada proceso
💡
La dirección donde empieza la tabla se almacena en un registro que actúa como puntero a la tabla
 
Esta tabla, al ser muy grande (millones de entradas, tantas como páginas virtuales), se almacena en memoria principal, en una dirección conocida. Esta tabla no se pagina (lo que quiere decir que permanece siempre en memoria principal, no se va al disco en ningún momento)
 
notion image
Parámetros que podemos observar el en diagrama
  • Tamaño de las direcciones virtuales → 2322^{32} (4GB)
    • Número de páginas virtuales2202^{20} páginas virtuales
  • Tamaño de las direcciones físicas2302^{30} (1GB)
    • Número de páginas físicas 2182^{18} páginas físicas
  • Tamaño de las páginas / marcos de páginas 2122^{12} (4KB)
ℹ️
Dado que los datos de la memoria los obtenemos según el tamaño de palabra (4 Bytes), entonces vemos que cada entrada constará de 32-bits y dado que por ahora solo hemos usado 19 bits, utilizaremos el resto para introducir información adicional, como:
🧮 Campos de las entradas de la tabla (columnas)
Campos
  • 1-bit → Bit de validez
    • Si dicho bit está activado, la página física que muestra la tabla se encuentra en memoria principal
    • Si dicho bit está desactivado, la página física que muestra la tabla se encuentra en disco
  • 18-bits → Número de página física
  • Control de acceso (RWX)
  • Bit de suciedad
  • Bit(s) de uso reciente
  • Bit de paginable
  • Bit de cacheable

Integración con la caché

📖
Si deseamos introducir una caché, podermos hacerlo:
  • Antes de la MMU (antes de la traducción) → La caché trabajará con direcciones virtuales
  • Después de la MMU (después de la traducción) → Al tiempo de acceso se le suma el tiempo de traducción

Otros aspectos del diseño

ℹ️
Política de extracción
Decide que páginas son intercambiadas entre la memoria principal y el swap. La política mas utilizada es la paginación por demanda, muy similar a lo que hace la caché. Esta política trae a memoria una página cuando esta da un fallo (miss) de acceso
ℹ️
Función de correspondencia
Generalmente se utiliza la correspondencia totalmente asociativa, por lo que cualquier página puede ser ubicada en cualquier marco de la memoria principal
ℹ️
Algoritmo de reemplazo
Generalmento se utiliza la estrategia LRU (least recent used), lo que requiere de añadir a los bits de cada entrada unos bits de uso reciente. En este caso debemos determinar también si queremos que la página que vamos a reemplazar pertenerzca al mismo proceso o no
ℹ️
Política de escritura
La política mas utilizada es write-back, por ello deberemos hacer uso de un bit de suciedad

Aumento del rendimiento: Memoria TLB


📖
Dado que la tabla de páginas no deja de ser un dato más almacenado en memoria, tambíen necesitamos acceder a memoria para consultar la tabla, sin embargo, si cada vez que queremos acceder a un dato, tenemos también que hacer un acceso extra para consultar la dirección física de ese dato en la tabla, estaríamos haciendo el doble de accesos cada vez
 
Con el fin de mejorar los tiempos de acceso a la tabla de páginas, se introdujo un nuevo elemento llamado TLB.
ℹ️
TLB (Translation-Lookaside Buffer)
Esta unidad es una caché dedicada exclusivamente a la tabla de páginas, almacenando los accesos más recientes a la tabla de páginas.
notion image
💡
Diagrama de flujo del acceso a un dato
notion image
 
Pregunta trampa
Calcular cuanto tiempo tarda el proceso de buscar un dato en memoria
  • Hay dos accesos, uno a la tabla y otro al dato