Administración de memoria

Clase 1 — ¿Cómo se organiza la memoria?

Sistemas Operativos

Una pregunta para comenzar

Si todos los procesos comparten la misma RAM...

¿por qué no se interfieren?

Hoy vamos a recorrer

  1. El problema de compartir la memoria
  2. El espacio de direcciones de un proceso
  3. Asignación y fragmentación
  4. Paginación y traducción de direcciones

Sistemas Operativos

1. El problema

Compartir la memoria sin interferirse

La RAM es un recurso compartido

  • El sistema operativo reside en memoria.
  • Varios procesos necesitan instrucciones y datos.
  • Todos compiten por un recurso limitado.

¿Cómo evitamos que un proceso modifique los datos de otro?

¿Y si no hubiera una abstracción?

Imaginemos que cada programa utiliza direcciones físicas absolutas.

  • ¿Dónde cargamos el segundo programa?
  • ¿Qué pasa si ambos usan la dirección 1000?
  • ¿Puede un proceso sobrescribir al sistema operativo?

Dos problemas por resolver

Reubicación

Un programa debe poder ejecutarse sin depender de una posición fija en RAM.

Protección

Un programa no debe acceder arbitrariamente a la memoria de otro.

La abstracción: espacio de direcciones

Cada proceso trabaja con su propio conjunto de direcciones.

  • Puede utilizar direcciones sin conocer su ubicación física.
  • El sistema operativo y el hardware controlan su traducción y protección.
  • Algunos sectores pueden compartirse deliberadamente.

Dos direcciones diferentes

Virtual: la dirección que utiliza el proceso.

Física: la ubicación real dentro de la RAM.

¿Quién convierte una en otra?

Sistemas Operativos

2. Mirar un proceso

¿Cómo se ve la memoria desde Linux?

¿Qué hay en el espacio de un proceso?

  • Código: instrucciones ejecutables.
  • Datos: variables y estructuras.
  • Heap: memoria solicitada dinámicamente.
  • Stack: llamadas a funciones y variables locales.
  • Regiones mapeadas: bibliotecas y archivos, entre otras.

No todas las regiones tienen el mismo tamaño ni los mismos permisos.

Linux nos permite observarlo

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í?

Práctico 1 — Exploramos un proceso

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.

Sistemas Operativos

3. Asignación y fragmentación

¿Cómo encontramos lugar para los procesos?

Una primera idea:
bloques contiguos

  • Buscar una región libre suficientemente grande.
  • Cargar allí el proceso.
  • Liberar la región al terminar.

¿Qué sucede cuando los procesos entran y salen?

Ejercicio 1
¿Dónde lo colocamos?

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é?

Tres decisiones posibles

Para la solicitud de 12 KB:

  • Primer ajuste: primer hueco suficiente → 20 KB.
  • Mejor ajuste: hueco suficiente más pequeño → 12 KB.
  • Peor ajuste: hueco más grande → 30 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

Fragmentación

Externa: hay memoria libre total, pero está repartida en huecos separados.

Interna: asignamos un bloque mayor que lo solicitado; parte queda sin utilizar.

¿Podemos dejar de exigir bloques contiguos grandes?

Otra forma de pensar la memoria

En lugar de reservar una región contigua para todo el proceso...

¿Y si la dividimos en bloques pequeños de tamaño fijo?

Sistemas Operativos

4. Paginación

Separar la organización virtual de la física

Páginas y marcos

  • Páginas virtuales: El espacio de direcciones virtuales del programa (bloques contiguos de tamaño fijo)
  • Marcos de página (Page Frames): Memoria RAM física instalada dividida en bloques del mismo tamaño exacto.
  • Las páginas de un proceso pueden ocupar marcos no contiguos.

La paginación evita exigir contigüidad física para todo el proceso.

Mapeo y tamaño

  • Páginas virtuales y marcos tienen idéntica capacidad. 
  • La tabla de páginas almacena la asociación entre cada página virtual y el marco físico donde se encuentra cargada.
  • Si una página virtual no reside en ese momento en la memoria RAM, se marca como no presente (representada con una «X» en el diagrama)

Encontrar datos

  1. Número de página virtual: Dividiendo la dirección virtual por el tamaño de página (división entera).
     
  2. Desplazamiento (Offset): Es el resto de la división anterior
    (
    dirección virtual % tamaño de página).
    Indica la posición exacta del byte dentro de la página y
    no cambia al pasar a la memoria física.
     
  3. Búsqueda del marco: La Unidad de Administración de Memoria (MMU) consulta la tabla de páginas usando el número de página virtual para encontrar el marco físico asignado.
     
  4. Cálculo final: Se sustituyen el número de marco obtenido, el tamaño de la página y el desplazamiento en la ecuación para obtener la ubicación física en el bus de memoria.

$$\mathbf{Dirección\ física = (Marco \times Tamaño\ de\ página) + Desplazamiento}$$

Tabla

  • Tamaño de página (P): 4 KB = 4096 bytes.
  • Espacio virtual: 16 páginas virtuales (de 0K a 64K).
  • Memoria física: 8 marcos de página (de 0K a 32K).
PáginaMarco
02
11
26
30
44
53
6, 7 y 8(no en RAM)
95
10(no en RAM)
117
12 a 15(no en RAM)

Ejemplo 1

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}$$

Dirección virtual 0

Ejemplo 2

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}$$

Dirección virtual 8192

Ejemplo 3

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}$$

Dirección virtual 20500

Ejemplo 4

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

  • conseguir un marco físico,
  • recuperar la página requerida,
  • actualizar su correspondencia y
  • reanudar la instrucción.

$$\mathbf{Dirección\ física = (Marco \times Tamaño\ de\ página) + Desplazamiento}$$

Dirección virtual 32780

¿No es muy costosa esa traducción?

Cada acceso a memoria requiere traducir una dirección.

TLB (Translation Lookaside Buffer): pequeña caché de traducciones recientes.

  • Acierto: la traducción se obtiene rápidamente.
  • Fallo de TLB: hay que buscar la traducción por otro camino y se renueva la cache.

Un fallo de TLB no significa necesariamente un fallo de página.

Para cerrar

Hoy vimos cómo el sistema operativo:

  • aísla espacios de direcciones;
  • organiza memoria virtual y física;
  • traduce direcciones mediante páginas y marcos;
  • acelera la traducción con una TLB.

Para la próxima clase

¿Qué pasa si necesitamos una página que no está en RAM?

¿Qué sucede si todos los marcos físicos están ocupados?

Administración de memoria 01/02

By Rodolfo Pilas

Administración de memoria 01/02

  • 125