---
marp: true
theme: si-ud01
paginate: true
size: 16:9
title: Memoria y paginación
description: Direcciones, MMU, páginas, RAM e intercambio
---
<!-- _class: lead -->
<div class="presentation-title">Memoria y paginación</div>

## Cómo encuentra cada proceso sus datos

**Sistemas Informáticos · 1 DAM · UD03 · Bloque 05**

---

## Asignar, proteger y liberar memoria

El SO asigna memoria a los procesos y la recupera cuando dejan de necesitarla.

También controla los accesos para proteger los datos del editor y del navegador.

Cada proceso trabaja con sus propias **direcciones virtuales**.

<!--
Fuente: apuntes 5.1–5.2. Recuperar la memoria de trabajo de UD01 y el contexto del proceso del bloque 03.
-->

---

## Direcciones virtuales y físicas

El **espacio virtual** es el conjunto de direcciones de memoria propio de cada proceso.

| Dirección | Qué indica |
|---|---|
| Virtual | El número que usa el proceso para pedir un dato |
| Física | El lugar del dato cargado en RAM |

El **SO** prepara las tablas y los permisos.

La **MMU**, unidad de gestión de memoria, es el hardware que los usa al leer o escribir.

<!--
Fuente: apuntes 5.2. Una zona de solo lectura permite leer y bloquea un intento de escritura. El proceso indica su dirección virtual; la MMU usa la traducción preparada por el SO.
-->

---

## La misma dirección en dos procesos

![w:1010 La MMU traduce 8195 a 28675 con la tabla del editor y a 16387 con la del navegador.](img/5.2-traduccion-8195-editor-navegador.svg)

<!--
Fuente: apuntes 5.2. Seguir primero la fila del editor y después la del navegador. El número virtual coincide y cambia la tabla. Los dos accesos de lectura están permitidos y los datos están en RAM.
-->

---

## Páginas y marcos

- **Página** · bloque del espacio virtual.
- **Marco** · bloque de RAM del mismo tamaño.
- **Tabla de páginas** · indica qué páginas están en RAM y qué marco ocupa cada una.

Las páginas de un proceso pueden ocupar marcos separados.

<!--
Fuente: apuntes 5.3. Definir página y marco antes de recorrer el siguiente dibujo. Las fórmulas de la dirección completa están en la ampliación final de los apuntes.
-->

---

## El editor busca el dato de 8195

![w:1010 La dirección virtual 8195 es la página 2, posición 3. La tabla del editor indica el marco 7. El marco 7, posición 3, corresponde a la dirección física 28675.](img/5.3-traduccion-8195-pagina-marco.svg)

La posición dentro de la página, o **desplazamiento**, se conserva.

<!--
Fuente: apuntes 5.3. Retomar la misma lectura del editor. Preguntar qué dato consulta la MMU en la tabla y cuál se conserva. En la ampliación se usan páginas de 4096 bytes: 8195 = 2 × 4096 + 3; 7 × 4096 + 3 = 28675.
-->

---

## Una página que aún no está en RAM

Si se produce un **fallo de página**, el SO comprueba el acceso.

1. Si está permitido, prepara la página en un marco.
2. Actualiza la tabla de páginas.
3. El proceso puede volver a intentar el acceso.

Si el acceso es inválido, el SO lo rechaza.

<!--
Fuente: apuntes 5.4. Preparar una página puede requerir leer almacenamiento o inicializar una página nueva. Evitar identificar todo fallo con una lectura de swap.
-->

---

## Intercambio en disco o SSD

El **swap** guarda temporalmente ciertas páginas fuera de RAM.

1. El SO guarda una página en el disco y libera su marco.
2. Si vuelve a necesitarla, la trae a RAM y actualiza la tabla.

Mover páginas continuamente introduce **esperas** y puede ralentizar los programas.

<!--
Fuente: apuntes 5.5. El almacenamiento, incluso SSD, introduce mayor espera que la RAM. Relacionar el mecanismo con la primera pregunta de 5.8 sin añadir otro entregable.
-->

---

## Swap en Windows, Linux y macOS

| Sistema | Cómo organiza el intercambio |
|---|---|
| Windows | Archivo de paginación, normalmente `pagefile.sys` |
| Linux | Archivo o partición de intercambio |
| macOS | Intercambio gestionado automáticamente en el disco de arranque |

macOS también puede comprimir datos dentro de la RAM.

<!--
Fuente: apuntes 5.5 y sus referencias oficiales. Windows puede gestionar automáticamente el tamaño. La compresión en RAM y el intercambio en disco son mecanismos distintos. Referencias: https://learn.microsoft.com/en-us/troubleshoot/windows-client/performance/introduction-to-the-page-file ; https://wiki.debian.org/Swap ; https://support.apple.com/en-nz/guide/activity-monitor/actmntr1004/10.14/mac/15.0 .
-->

---

## Las páginas del proceso pueden estar repartidas

![w:1010 Las tres páginas pertenecen al espacio virtual del editor. Dos tienen sus datos en RAM y otra en swap. El SO trae a RAM la que se necesita.](img/5.5-paginas-ram-swap.svg)

<!--
Fuente: apuntes 5.5. Las tres páginas pertenecen al espacio virtual. RAM y swap indican ubicación de los datos. Es una instantánea distinta de la tabla de la actividad 5.7, que tiene sus propios datos; no trasladar automáticamente este reparto a esa tabla.
-->

---

## Ampliación · Desbordamiento de búfer

Un **búfer** es una zona de capacidad determinada dentro de la memoria del proceso para guardar datos temporalmente.

Si se reservan **8 bytes** y se escriben **12**, los bytes que exceden el búfer pueden alterar datos vecinos.

La MMU comprueba permisos de páginas. El programa debe comprobar los límites del búfer.

<!--
Fuente: apuntes 5.6. Una página con permiso de escritura puede contener el búfer y otros datos. El desbordamiento puede ser una vulnerabilidad; en hacking ético se buscan estos fallos con autorización para corregirlos. Conservar el carácter de ampliación.
-->

---

## Ampliación · Java comprueba el límite

<style scoped>
pre code span { color: #ffffff !important; }
pre code .hljs-comment { color: #c9d7df !important; }
</style>

En JShell:

```java
import java.nio.ByteBuffer;

ByteBuffer buffer = ByteBuffer.allocate(8);
buffer.put(new byte[12]); // BufferOverflowException
```

`ByteBuffer` rechaza la escritura antes de copiar los datos.

<!--
Fuente: apuntes 5.6. El ejemplo muestra la protección de la biblioteca ante el intento de escribir más bytes de los que caben. No muestra una sobrescritura efectiva de memoria vecina.
-->

---

## Aplicación en los apuntes

- **5.7** · Localiza un dato en RAM y explica qué hace el SO si falta la página.
- **5.8** · Razona sobre el rendimiento con swap y una página aún no cargada.

La tabla de **5.7** se reutiliza en **6.8.3**.

<!--
Fuente: apuntes 5.7–5.8 y práctica 6.8.3. Conservar la tabla de dos accesos y las dos preguntas breves. La ampliación de cálculo de direcciones completas sigue disponible al final de los apuntes.
-->
