10  Unidad 7: Memoria Virtual

Fundamentos y Conceptos Clave

Autor/a

Luis Torres

Fecha de publicación

4 de agosto de 2026

10.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.

10.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.

10.2.1 1.1. ¿Qué es la memoria RAM?

La RAM (Random Access Memory) es un componente físico de la computadora. Está formada por los módulos de memoria instalados en el equipo y almacena temporalmente las instrucciones y los datos que la CPU necesita mientras ejecuta los programas.

La RAM posee tres características importantes:

  • Es física y limitada: si una computadora tiene 8 GiB de RAM, esa es la cantidad real de memoria principal disponible para el sistema operativo y los procesos.
  • Es volátil: su contenido se pierde cuando el equipo se apaga.
  • Es rápida: acceder a la RAM es mucho más veloz que recuperar datos desde un SSD o un disco rígido.

Por ejemplo, cuando se abre un navegador, parte de su código, las pestañas y las imágenes que se están utilizando deben encontrarse en la RAM para que la CPU pueda trabajar con ellas.

10.2.2 1.2. ¿Qué es entonces la memoria virtual?

La memoria virtual no es otro módulo ni un segundo tipo de RAM. Es una abstracción creada por el sistema operativo con apoyo del hardware. En lugar de permitir que un programa use directamente las posiciones de la RAM, el sistema le entrega un mapa privado de direcciones.

El programa trabaja como si dispusiera de una memoria continua y exclusivamente suya. Sin embargo, el sistema operativo puede ubicar sus datos en marcos dispersos de la RAM, compartir algunas páginas de forma controlada o mantener temporalmente ciertas páginas fuera de la RAM.

Aspecto Memoria RAM Memoria virtual
Naturaleza Componente físico Abstracción administrada por el SO y la MMU
Contenido Datos e instrucciones activos Direcciones del espacio de cada proceso
Capacidad Fijada por los módulos instalados Puede superar la RAM disponible
Velocidad Acceso directo y rápido Depende de dónde esté la página
Organización Marcos compartidos por el sistema Espacio privado y continuo por proceso
Persistencia Volátil No es almacenamiento permanente

Tabla 1: Diferencias entre la memoria RAM y la memoria virtual.

Importante

La memoria virtual no aumenta físicamente la RAM. Puede ampliar el espacio utilizable mediante el almacenamiento secundario, pero acceder a una página que está fuera de la RAM es mucho más lento. El área de intercambio (swap) es un apoyo de la memoria virtual, no un reemplazo equivalente de la RAM.

10.2.3 1.3. ¿Cómo funciona?

El funcionamiento puede comprenderse siguiendo un acceso sencillo:

  1. Un programa solicita leer o escribir una dirección virtual.
  2. La CPU entrega esa dirección a la MMU.
  3. La MMU consulta la tabla de páginas configurada por el sistema operativo.
  4. Si la página está en RAM, la MMU traduce la dirección virtual al marco físico y la CPU accede al dato.
  5. Si la página no está en RAM, ocurre un fallo de página. El sistema operativo localiza el contenido, consigue un marco, carga la página y reanuda el programa.
  6. Si la dirección no pertenece al proceso o el acceso viola sus permisos, el sistema operativo rechaza la operación.
flowchart LR
    P["Programa<br/>dirección virtual"] --> MMU["MMU<br/>traducción"]
    MMU --> T["Tabla de páginas"]
    T --> Q{"¿Página<br/>en RAM?"}
    Q -->|Sí| R["RAM<br/>marco físico"]
    Q -->|No| F["Fallo de página<br/>interviene el SO"]
    F --> D[("Disco o archivo")]
    D --> R
Figura 10.1: Visión simplificada de un acceso mediante memoria virtual

Ejemplo didáctico. Un navegador intenta acceder a una imagen usando una dirección virtual. El navegador no sabe en qué chip ni en qué posición física se encuentra. La MMU consulta el mapa del proceso: si la página está en el marco 12, dirige allí el acceso. Si la página fue retirada de la RAM, el sistema operativo la recupera antes de permitir que el navegador continúe.

Tip

Puede pensarse en la RAM como el espacio real disponible sobre una mesa y en la memoria virtual como el sistema de numeración y el catálogo que indica dónde está cada documento. El catálogo puede mencionar más documentos de los que caben simultáneamente en la mesa; solo los que se necesitan ahora deben estar sobre ella.

10.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.

10.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.

10.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 10.2: Páginas virtuales asignadas a marcos físicos no contiguos

10.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 10.3: Estructura de una tabla de páginas con campos detallados

10.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 10.4: Proceso de traducción de direcciones virtuales a físicas

10.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.

10.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 10.5: Manejo de fallo de página: flujo completo desde detección hasta resolución

10.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.