Sesión 10
Memoria Virtual y Sistemas de Archivos
Unidad 2 - Clase 2
Navegación: ← → F pantalla completa
Unidad 2 - Clase 2
Navegación: ← → F pantalla completa
La clase anterior estableció que la RAM es rápida pero limitada/volátil, y el disco es lento pero masivo/persistente. Hoy profundizamos cómo el SO hace que un proceso "vea" un espacio de memoria gigante y cómo administra los archivos en disco.
Objetivo de hoy: Entender los algoritmos de paginación/segmentación y las estructuras de archivos/directorio para justificar decisiones de diseño en el proyecto E2.
Para evitar fragmentación externa, la memoria virtual se divide en **Páginas** (lógicas, tamaño fijo 4KB) y la RAM en **Marcos** (físicos, mismo tamaño). El SO mantiene una **Tabla de Páginas** que mapea cada página a un marco.
Ventajas:
Ejemplo de Dirección Lógica:
Alternativa a la paginación: divide la memoria en **Segmentos** de tamaño variable (código, datos, pila). Cada segmento tiene su propia tabla con base y límite.
Ventajas:
Desventajas:
Moderno: Muchos SO combinan ambos (Paginación + Segmentación = Paged Segmentation).
| Criterio | Paginación | Segmentación |
|---|---|---|
| Tamaño de bloques | Fijo (4KB) | Variable |
| Fragmentación | Solo interna (≤4KB) | Externa (huecos grandes) |
| Traducciones | 1 Tabla (rápida) | Tabla por segmento (lenta) |
| Compartición | Por página (compleja) | Por segmento (natural) |
| Uso en Proyecto | Swap de logs pesados | Código vs Datos del Gestor |
Cuando la RAM está llena y llega una nueva página, el SO debe decidir cuál página vieja expulsar. Algoritmos comunes:
En tu PC: Windows usa LRU aproximado. Linux usa variantes como Clock Algorithm.
Estado Inicial RAM (3 Marcos libres):
| Marco | Página Lógica |
|---|---|
| 0 | P0 del Proceso A |
| 1 | P1 del Proceso A |
| 2 | P0 del Proceso B |
Proceso A pide P2 (Page Fault):
El SO organiza el disco en bloques y crea una capa lógica:
Común: Todos usan **Inodos** para metadatos + punteros a bloques de datos.
¿Cómo asigna el SO bloques del disco a un archivo de 10GB?
Contigua:
Enlazada:
Indexada (Mejor): Inodo con array de punteros a bloques. NTFS/ext4.
Un directorio es un archivo especial con tabla [Nombre → Inodo]. Ejemplo de entrada:
Operación Open("src/main.cs"): SO lee directorios padre hasta encontrar el Inodo 40582, carga metadatos, devuelve Handle.
Flujo físico:
¿Qué Syscalls genera? mkdir → create → open → write → close (x2).
| Algoritmo | Política | Ventaja | Desventaja |
|---|---|---|---|
| FIFO | Más antigua | Simple | Anomalía Belady |
| LRU | Menos usada | Óptimo práctico | Hardware caro |
| Clock | Bit de referencia | Aproximación LRU barata | Complejidad media |
En tu Gestor E2: Usar streams para evitar saturar páginas con logs pesados.
| FS | Asignación | Recuperación | Seguridad | Uso |
|---|---|---|---|---|
| FAT32 | Enlazada | No | Básica | USB |
| NTFS | Indexada + Journal | Sí (Journaling) | ACLs, Encriptación | Windows |
| ext4 | Indexada + Extent | Sí | Permisos Unix | Linux |
Si Heap crece más allá del límite → **Segmentation Fault** (kill del proceso).
Buena práctica: `File.AppendAllText("logs/log.txt", entry)` genera solo Syscalls mínimas.
Fragmentación Externa (Segmentación):
Thrashing en Desarrollo:
Actividad clase: Abrir 10 pestañas Chrome + VS Code → Observar Swap crecer.
Conexión E2: Tu Gestor leerá CSV pesado → Streams + rutas relativas obligatorias.
| Concepto | Implementación | Impacto en Proyecto |
|---|---|---|
| Paginación | Bloques fijos 4KB | Evitar thrashing con streams |
| Segmentación | Bloques variables | Código/datos separados |
| Inodos | Metadatos + punteros | Base de archivos log/CSV |
| Asignación Indexada | Tabla en Inodo | Rendimiento I/O logs |
Próxima: Actividad 3 - Práctica con estructuras de archivos. ¡Prepárense para terminal!