16  Unidad 7: Memoria Virtual

Fundamentos y Conceptos Clave

Autor/a

Luis Torres

Fecha de publicación

1 de octubre de 2025

16.1 Introducción

La memoria virtual constituye una de las abstracciones fundamentales en los sistemas operativos modernos. Su estudio es crucial para comprender cómo se optimiza el uso de la memoria principal y se preserva la integridad de los procesos en entornos multitarea.

A lo largo de esta unidad se analizarán sus principios de funcionamiento, los componentes involucrados y el mecanismo que permite la traducción entre direcciones virtuales y físicas. Al finalizar, el estudiante será capaz de definir la memoria virtual, identificar sus elementos estructurales y describir el proceso de traducción de direcciones.

16.2 1. Concepto de Memoria Virtual

La memoria virtual es un método de gestión que ofrece a cada proceso la ilusión de disponer de un espacio de direcciones propio, continuo y exclusivo, denominado espacio de direcciones virtual. Este es independiente de la memoria física real (RAM) y de su organización.

En términos operativos, las direcciones que maneja un programa (virtuales) se desacoplan de las direcciones reales en la memoria física (físicas).

Esta separación es administrada por el sistema operativo en coordinación con la Unidad de Gestión de Memoria (MMU), un componente especializado de hardware. El resultado es un uso más seguro y eficiente de la RAM, favoreciendo la concurrencia de procesos.

16.3 2. Problemas que resuelve

La memoria virtual surge como respuesta a las limitaciones inherentes de la gestión directa de memoria física en sistemas multitarea:

Protección: Impide que un proceso acceda a regiones de memoria de otros procesos o del propio sistema operativo, evitando corrupción de datos y fallos críticos.

Eficiencia en el uso de memoria: No es necesario cargar un programa completo en RAM. Esto evita ocupar espacio con código poco utilizado.

Fragmentación: La asignación y liberación dinámica de memoria genera fragmentos no utilizables. La memoria virtual reduce este problema.

Independencia de ubicación: Los programas no necesitan saber dónde residen físicamente sus datos o instrucciones, lo que facilita su carga en cualquier área disponible.

16.4 3. Implementación: Paginación y traducción de direcciones

El método más común para implementar memoria virtual es la paginación.

En este modelo, tanto el espacio de direcciones virtual como la memoria física se dividen en bloques de tamaño fijo.

16.4.1 3.1. Páginas y marcos

Página (Page): Bloque de tamaño fijo de memoria virtual.

Marco (Frame): Bloque de tamaño fijo de memoria física.

El tamaño de página y marco es idéntico (por ejemplo, 4 KB en arquitecturas de 32/64 bits). Cualquier página puede ubicarse en cualquier marco libre, sin necesidad de que estén contiguos en memoria física.

flowchart TB
    subgraph Virtual ["Espacio de Direcciones Virtual"]
        P0[Página 0<br/>4KB]
        P1[Página 1<br/>4KB]
        P2[Página 2<br/>4KB]
        P3[Página 3<br/>4KB]
    end
    
    subgraph Physical ["Memoria Física (RAM)"]
        F0[Marco 0<br/>4KB]
        F1[Marco 1<br/>4KB]
        F2[Marco 2<br/>4KB]
        F3[Marco 3<br/>4KB]
        F4[Marco 4<br/>4KB]
        F5[Marco 5<br/>4KB]
    end
    
    P0 -.->|Mapeo| F2
    P1 -.->|Mapeo| F5
    P2 -.->|Mapeo| F1
    P3 -.->|Mapeo| F4
    
    style Virtual fill:#e1f5fe
    style Physical fill:#f3e5f5
Figura 16.1: Páginas virtuales asignadas a marcos físicos no contiguos

16.4.2 3.2. Tabla de páginas

El sistema operativo mantiene, para cada proceso, una tabla de páginas que indica en qué marco físico se encuentra cada página virtual.

Cada entrada (PTE, Page Table Entry) contiene información como:

  • Número de marco físico.
  • Bit de presencia (indica si la página está en RAM o en disco).
  • Bits de protección (permisos de lectura, escritura, ejecución).
flowchart TB
    subgraph PT ["Tabla de Páginas - Proceso A"]
        PTE0["Entrada 0<br/>Marco: 2 | Presente: 1 | R/W/X: 111"]
        PTE1["Entrada 1<br/>Marco: 5 | Presente: 1 | R/W/X: 101"]
        PTE2["Entrada 2<br/>Marco: - | Presente: 0 | R/W/X: 110"]
        PTE3["Entrada 3<br/>Marco: 1 | Presente: 1 | R/W/X: 100"]
    end
    
    subgraph Campos ["Campos de PTE"]
        Marco["Número de Marco<br/>(Frame Number)"]
        Presente["Bit de Presencia<br/>(Present Bit)"]
        Permisos["Bits de Protección<br/>R: Read | W: Write | X: Execute"]
    end
    
    subgraph RAM ["Memoria Física"]
        M0["Marco 0"]
        M1["Marco 1"]
        M2["Marco 2"]
        M3["Marco 3"]
        M4["Marco 4"]
        M5["Marco 5"]
    end
    
    PTE0 -.-> M2
    PTE1 -.-> M5
    PTE2 -.->|Page Fault| Disco[("Disco<br/>(Swap)")]
    PTE3 -.-> M1
    
    style PTE2 fill:#ffcdd2
    style Disco fill:#fff3e0
Figura 16.2: Estructura de una tabla de páginas con campos detallados

16.4.3 3.3. Unidad de Gestión de Memoria (MMU)

La MMU traduce de manera automática y veloz las direcciones virtuales en físicas:

  1. La CPU genera una dirección virtual.
  2. La MMU la divide en número de página virtual y desplazamiento.
  3. Busca el número de página en la tabla de páginas del proceso activo.
  4. Obtiene el número de marco correspondiente.
  5. Concatena el número de marco y el desplazamiento para obtener la dirección física.
flowchart TD
    CPU["CPU genera<br/>Dirección Virtual<br/>0x1004"]
    
    subgraph MMU_Process ["Proceso MMU"]
        Split["Dividir dirección:<br/>Página: 0x1 (1)<br/>Offset: 0x004 (4)"]
        Lookup["Buscar en tabla<br/>de páginas:<br/>Página 1 → Marco ?"]
        
        subgraph PT ["Tabla de Páginas"]
            PTE1["Página 1<br/>Marco: 5<br/>Presente: 1"]
        end
        
        Found["Marco encontrado: 5<br/>Construir dirección física:<br/>Marco 5 + Offset 4"]
    end
    
    Physical["Dirección Física<br/>0x5004"]
    Memory["Acceso a<br/>Memoria Física<br/>Marco 5, Offset 4"]
    
    CPU --> Split
    Split --> Lookup
    Lookup --> PT
    PT --> Found
    Found --> Physical
    Physical --> Memory
    
    style CPU fill:#e3f2fd
    style Physical fill:#e8f5e8
    style PT fill:#fff3e0
    style Memory fill:#f3e5f5
Figura 16.3: Proceso de traducción de direcciones virtuales a físicas

16.5 4. El mecanismo en acción: Fallo de página (Page Fault)

Durante la traducción de direcciones, es posible que la MMU encuentre que el bit de presencia en la entrada de la tabla de páginas está en 0. Esto indica que la página solicitada no está cargada en la memoria física (RAM).

A este evento se le denomina fallo de página y, lejos de ser un error fatal, es un elemento normal y esperado dentro de la gestión de memoria virtual.

El manejo del fallo de página sigue una secuencia bien definida:

Interrupción de hardware: La MMU genera una señal (trap) al detectar la ausencia de la página, transfiriendo el control al sistema operativo.

Suspensión del proceso: El sistema operativo detiene temporalmente la ejecución del proceso que causó el fallo.

Verificación de acceso: - Si el acceso es inválido (por ejemplo, escritura en una página de solo lectura), el sistema operativo termina el proceso. - Si es válido, se procede a localizar la página en el almacenamiento secundario.

Asignación de marco libre: Se busca un marco disponible en la RAM. - Si no hay marcos libres, se aplica un algoritmo de reemplazo de página (tema que se desarrollará en la próxima unidad).

Carga de la página: El sistema operativo emite una operación de entrada/salida (E/S) para traer la página desde disco al marco libre. Este es el paso más costoso en tiempo.

Actualización de la tabla de páginas: Se marca el bit de presencia en 1 y se registra el número de marco físico asignado.

Reanudación del proceso: El control regresa al proceso, que vuelve a ejecutar la instrucción que provocó el fallo. Esta vez, la traducción será exitosa.

16.5.1 Clasificación de fallos de página:

Fallo mayor (Major Fault): Requiere acceso a disco para cargar la página.

Fallo menor (Minor Fault): La página ya está en memoria, pero debe asignarse o actualizarse la referencia en la tabla.

flowchart TD
    Start["MMU detecta<br/>Bit Presente = 0<br/>🚨 PAGE FAULT"]
    
    Trap["Interrupción de Hardware<br/>Control → SO"]
    
    Suspend["Suspender Proceso<br/>Guardar contexto"]
    
    Check{"¿Acceso válido?"}
    
    Invalid["Acceso inválido<br/>❌ TERMINAR PROCESO"]
    
    FindFrame{"¿Marco libre<br/>disponible?"}
    
    Replace["Aplicar algoritmo<br/>de reemplazo<br/>(LRU, FIFO, etc.)"]
    
    LoadPage["Cargar página<br/>desde disco<br/>⏳ Operación E/S"]
    
    UpdateTable["Actualizar tabla:<br/>• Presente = 1<br/>• Marco = N<br/>• Permisos"]
    
    Resume["Reanudar proceso<br/>Reintentar instrucción"]
    
    Success["✅ Acceso exitoso<br/>Traducción completa"]
    
    Start --> Trap
    Trap --> Suspend
    Suspend --> Check
    Check -->|Inválido| Invalid
    Check -->|Válido| FindFrame
    FindFrame -->|No hay marco| Replace
    FindFrame -->|Marco libre| LoadPage
    Replace --> LoadPage
    LoadPage --> UpdateTable
    UpdateTable --> Resume
    Resume --> Success
    
    style Start fill:#ffcdd2
    style Invalid fill:#f44336,color:#fff
    style LoadPage fill:#fff3e0
    style Success fill:#c8e6c9
    style Replace fill:#ffe0b2
Figura 16.4: Manejo de fallo de página: flujo completo desde detección hasta resolución

16.6 5. Analogía: La biblioteca

Para reforzar el concepto, se propone una analogía:

Imagine que la memoria virtual es el índice de una gran enciclopedia.

La memoria física es la cantidad limitada de escritorios en la sala de lectura.

La tabla de páginas es la libreta del bibliotecario, donde se registra qué página de la enciclopedia está en qué escritorio.

Un fallo de página ocurre cuando el lector solicita una página que no está sobre ningún escritorio, obligando al bibliotecario a ir a buscarla a las estanterías (disco).

Esta comparación, aunque simplificada, permite visualizar la relación entre el espacio virtual, la RAM y el almacenamiento secundario.