📝 arquitectura_memoria_TAI
← Volver

📚 ARQUITECTURA DE ORDENADORES — UCP Y MEMORIA VIRTUAL

Clase magistral para el examen TAI

🎓 Cómo usar este documento: Lee la explicación de cada bloque temático y responde las preguntas antes de pasar al siguiente. Las soluciones comentadas están al final.


BLOQUE 1 — UNIDAD CENTRAL DE PROCESO (UCP / CPU)

¿Qué es la CPU?

La Unidad Central de Proceso (UCP o CPU, Central Processing Unit), también denominada procesador, se encarga del control general, ejecución y envío de las operaciones que se efectúan dentro del ordenador con el fin de realizar el tratamiento automático de la información.

Elemento Descripción
Objeto Interpretar ordenadamente las instrucciones almacenadas en la memoria para ejecutarlas
Componentes principales Unidad de Control (UC) + Unidad Aritmético-Lógica (ALU) + registros internos
Potencia determinada por Tiempo de ciclo + ancho de banda + capacidad de memoria

💡 Dato clave: El byte es una unidad demasiado pequeña para los cálculos de la ALU. Por eso se usa la palabra (word), formada por un número entero de bytes (1, 2, 4, 8, 16…).


Estructura interna de la CPU

CPU
├── Unidad de Control (UC)
│     ├── Registro de instrucción (RI)
│     ├── Registro contador de programas (CP)
│     ├── Registro de estado
│     ├── Reloj (generador de pulsos)
│     └── Circuito de Control (CC)
│           ├── Decodificador → identifica la instrucción en el IR
│           └── Secuenciador → genera las microórdenes necesarias
└── Unidad Aritmético-Lógica (ALU)
      ├── Circuito operacional (OPER) → realiza operaciones
      ├── Registros de entrada (RO1, RO2) → operandos
      ├── Registro acumulador (AC) → almacena resultados
      └── Registro de estado (biestables IR) → condiciones del resultado

Unidad de Control (UC)

La UC es responsable de recibir, interpretar y ejecutar las instrucciones. Su misión en tres pasos:

Paso Descripción
1. Recibir Las instrucciones almacenadas en memoria en el orden establecido
2. Identificar De qué instrucción se trata en cada caso
3. Generar La secuencia adecuada de órdenes para el resto de elementos del ordenador

Registros principales de la UC

Registro Nombre completo Función
RI Registro de Instrucción Contiene la instrucción que se está ejecutando. Tiene 3 campos: CO, MD y CDE
CP Contador de Programas Contiene la dirección de memoria de la siguiente instrucción a ejecutar
RE Registro de Estado Información sobre el resultado de la operación anterior (desbordamientos, interrupciones…)

⚠️ Dato clave: Los campos del Registro de Instrucción (RI):
- CO → Código de la operación a realizar
- MD → Modo de direccionamiento de la memoria
- CDE → Campo de dirección efectiva de la información

Circuito de Control (CC)

El elemento fundamental de la UC. Genera todas las señales de control que gobiernan el ordenador.

Bloque Función
Decodificador Identifica la instrucción almacenada en el IR y determina los pasos elementales en que se descompone
Secuenciador Saca y distribuye ordenadamente las señales de control a los elementos del sistema

Entradas del CC: instrucción en curso (IR) + registro de estado + reloj del sistema + señales externas de E/S (bus de control BC).


Reloj del sistema

Concepto Descripción
Reloj Circuito oscilador que genera pulsos a intervalos constantes
Función Sincroniza todas las operaciones elementales del computador
Período Duración entre dos pulsos consecutivos → orden de nanosegundos (10⁻⁹ s)
Frecuencia En MHz (millones de ciclos por segundo). Parámetro clave de velocidad
f = 200 MHz = 200 × 10⁶ ciclos/seg
p = 1/f  →  período de ciclo

💡 Mnemotecnia: F = frecuencia (velocidad), P = período (duración de un ciclo). A mayor frecuencia, mayor velocidad.


Unidad Aritmético-Lógica (ALU)

Contiene los circuitos electrónicos para operaciones aritméticas (suma, resta…) y lógicas (AND, OR, NOT, XOR, comparaciones…).

Elemento Función
OPER (circuito operacional) Realiza las operaciones aritméticas, lógicas y de otro tipo (rotaciones, bit…)
RO1 y RO2 Registros auxiliares que contienen los dos operandos de la operación (transparentes al usuario)
AC (acumulador) Almacena los resultados de las operaciones. Referenciable en programación
BR (batería de registros) Registros de uso general, accesibles al usuario por programación
Biestables IR Registro de estado — indica condiciones del resultado para saltos condicionales

Las 5 etapas de ejecución de una instrucción

Ciclo de instrucción (Fetch → Decode → Execute)

1. FETCH      → La CPU extrae de memoria la instrucción y la guarda en el RI.
                 La posición de memoria la tiene el CP (contador de programas).

2. ACTUALIZAR → Se actualiza el CP con la dirección de la siguiente instrucción.

3. DECODIFICAR → Se analiza el Código de Operación (CO) del RI.

4. DIRECCIONAR → Se determina a qué datos acceder y cómo (modo MD y campo CDE).

5. EJECUTAR   → Se extraen los datos de la posición indicada por CDE,
                 se cargan en los registros de la CPU y se procesan.

⚠️ Dato clave: El ancho de banda representa la cantidad de información transferida por segundo entre unidades. Ejemplo: ancho de banda memoria-CPU de 133 MB/s significa que en un segundo se pueden transferir 133 millones de bytes entre ellas.


Estados de un proceso — Diagrama de transición

El PDF 1_01_ contiene el diagrama completo de estados de un proceso:

                    ┌─────────────────────────────────┐
         Admitted   │                                 │  Admitted
   New ──────────► Ready ─────Dispatch────► Running ──┤
                     ▲                         │      └─► Terminated (exit)
                     │    Event/I-O Completion │
              Activate│                        │ I/O or Event wait
                     │                         ▼
              Suspend&Ready        ◄─Suspend── Blocked
                     │                         │
                 Event│            ──Activate──►│
                     │            │
                     └─Suspend&Block
Estado Descripción
New Proceso recién creado
Ready Listo para ejecutarse, esperando la CPU
Running En ejecución en la CPU
Blocked Esperando un evento o E/S
Suspend & Ready Suspendido pero listo para ejecutarse
Suspend & Block Suspendido y bloqueado esperando evento
Terminated Proceso finalizado

🧪 TEST — BLOQUE 1: Unidad Central de Proceso

1. ¿Cuál es la función principal del Registro Contador de Programas (CP)?


2. ¿Qué elemento del Circuito de Control (CC) identifica la instrucción almacenada en el IR y determina los pasos elementales en que se descompone?


3. ¿Cuáles son los tres campos del Registro de Instrucción (RI)?


4. La potencia de un computador está determinada principalmente por:


5. En la ALU, ¿qué registro almacena los resultados de las operaciones y puede referenciarse explícitamente en programación?


6. ¿En qué orden se ejecutan las 5 etapas del ciclo de instrucción?


7. La frecuencia del reloj del sistema se expresa en MHz. ¿Qué determina principalmente?


BLOQUE 2 — MEMORIA VIRTUAL

¿Qué es la memoria virtual y por qué existe?

Problema Solución
Un proceso no utiliza todo su código/datos a lo largo de su vida Cargar en memoria principal solo lo que se necesita en cada momento
Un programa puede ocupar más que la memoria principal disponible Tener parte del espacio lógico del proceso en almacenamiento secundario (disco)

💡 Principio clave — Localidad: La mayoría de los programas exhibe localidad: en cada momento, los accesos a código y datos se concentran sobre áreas pequeñas respecto a la memoria total del proceso. Esto es lo que hace funcionar la memoria virtual.

Técnicas históricas de carga parcial de programas

Técnicas para no tener todo el código en memoria principal
├── Ficheros para datos voluminosos
├── Recubrimientos (overlays)          → técnica primitiva
├── Intercambio (swapping)             → enviar al disco procesos completos bloqueados
├── Bibliotecas de carga dinámica (DLL) → cargar código compartido bajo demanda
└── MEMORIA VIRTUAL                    → la solución moderna y general

Arquitectura de la memoria virtual paginada

Concepto Descripción
Espacio lógico paginado El proceso ve un espacio de direcciones dividido en páginas
Páginas en memoria principal Algunas páginas están cargadas en marcos físicos de RAM
Páginas en disco El resto están almacenadas en el almacenamiento secundario
Tabla de páginas Estructura que indica dónde está cada página (RAM o disco)
Bit de validez En la tabla de páginas, indica si la página está en memoria principal (1) o en disco (0)

Fallo de página (Page Fault)

Cuando la CPU intenta acceder a una página marcada como no válida (bit de validez = 0), la MMU genera una excepción: el fallo de página.

Gestión de un fallo de página (4 pasos)

1. Buscar un marco físico libre para la página solicitada
2. Copiar del disco la página solicitada al marco elegido
3. Actualizar la tabla de páginas
   (marcar como válida + anotar el marco físico)
4. Entregar el control al proceso
   → se reintenta la instrucción que provocó el fallo

⚠️ Dato importante: Mientras el SO lee la página del disco (paso 2), se puede entregar la CPU a otros procesos que estén disponibles. También hay que invalidar la entrada de TLB correspondiente.

Paginación bajo demanda (Demand Paging)

La solución minimalista: no cargar ninguna página inicialmente. Las páginas se van cargando a medida que se necesitan, resolviendo los fallos de página uno a uno.


Algoritmos de reemplazo de páginas

Cuando hay un fallo de página y todos los marcos físicos están ocupados, hay que elegir una página víctima para sustituirla.

💡 Objetivo: Minimizar la frecuencia de fallos de página eligiendo como víctima la página que menos se vaya a usar en el futuro.

Bit de modificación

Bit Estado Significado
0 Limpia No ha sido modificada → se puede descartar sin escribir en disco
1 Sucia Ha sido modificada → hay que guardarla en disco antes de descartarla

La MMU pone a 1 el bit de modificación cada vez que se hace una escritura sobre la página.


Algoritmo general de reemplazo

1. Ocurre un fallo de página
2. Se observa que no hay marcos libres
3. Se elige una página víctima
4. Si la víctima ha sido modificada (bit modificación=1) → guardarla en disco
5. Leer la nueva página del disco
6. Marcar la página víctima como inválida en la tabla de páginas
7. Actualizar la entrada de la nueva página (bit de validez + marco físico)

Tabla comparativa de algoritmos de reemplazo

Algoritmo Descripción Uso real
FIFO Reemplaza la página que lleva más tiempo en memoria Sencillo pero no óptimo
OPT / MIN Reemplaza la página que no se usará durante más tiempo en el futuro Óptimo pero imposible de implementar (requiere conocer el futuro)
LRU (Least Recently Used) Reemplaza la página que hace más tiempo que no se usa Muy usado, buena aproximación a OPT
LFU (Least Frequently Used) Reemplaza la página usada con menor frecuencia (contador más bajo) Costoso en hw, peor que LRU en práctica
NRU (Not Recently Used) Reemplaza una página no usada recientemente Aproximación sencilla a LRU
2ª Oportunidad / CLOCK FIFO + bit de referencia. Da una segunda oportunidad antes de victimizar Usado en Mac OS X y Windows XP
Aging Histórico de bits de referencia. Número binario de K bits Buena aproximación a LRU
NFU (Not Frequently Used) Aproximación a LFU con contador software Más sencillo que LFU
WSClock Basado en el conjunto de trabajo (WS) + bit de referencia + marcas de tiempo Muy eficiente en la práctica

💡 Mnemotecnia: Los más importantes en negrita: FIFO, OPT, LRU, LFU (canónicos) y 2ª oportunidad/CLOCK, Aging, WSClock (adaptados).


Algoritmo FIFO


Algoritmo OPT/MIN


Algoritmo LRU (Least Recently Used)


Algoritmo de 2ª Oportunidad / CLOCK

FIFO + bit de referencia (REF)
Usado en primeros Mac OS X y Windows XP

Cuando hay fallo de página, recorremos marcos en orden de llegada:
├── Si REF=0  → la elegimos como víctima ✓
├── Si REF=1  → le damos una 2ª oportunidad: ponemos REF=0 y seguimos
└── Si llegamos al final, volvemos al principio (estructura circular = reloj)

Caso extremo: si REF=1 en todas las páginas → equivale a FIFO

Algoritmo Aging (histórico de bits de referencia)

Ejemplo K=8:
  11000100  → accedida frecuentemente y recientemente
  01110111  → accedida hace tiempo (valor más pequeño → candidata a víctima)

Teoría del conjunto de trabajo (Working Set)

💡 Concepto clave (Peter Denning, 1968-1970): Cada proceso trabaja en cada momento con unas zonas de código y datos bien delimitadas: su localidad. La localidad cambia a medida que el proceso se ejecuta.

Concepto Definición
Conjunto de trabajo WS(t, Δ) Páginas accedidas por el proceso entre el instante t y t-Δ
Δ (ventana temporal) Parámetro que define el "pasado reciente". Ni muy corto ni muy largo
Localidad Si un proceso tiene toda su localidad en memoria principal, no genera fallos de página

Hiperpaginación (Thrashing)

Ocurre cuando el grado de multiprogramación es excesivo: ningún proceso tiene suficientes páginas en memoria principal y se generan fallos de página continuamente.

Reacción en cadena del Thrashing:
Proceso A falla → se elige víctima una página de B
→ B falla → se elige víctima una página de A
→ Todo el sistema está paginando continuamente
→ Rendimiento cae drásticamente

Soluciones a la hiperpaginación

Técnica Descripción
PFF (Page Fault Frequency) Medir la frecuencia de fallos de página. Si es muy alta → dar más marcos. Si es muy baja → quitar marcos. Si la PFF global es muy alta → suspender un proceso (swap out)
Working Set Asignar a cada proceso tantos marcos como el tamaño de su WS. Si la suma supera los marcos disponibles → swap out de algún proceso

Consideraciones sobre el tamaño de página y estructura del código

⚠️ Impacto de la estructura del código en los fallos de página:

// Acceso por FILAS → óptimo (accede a páginas contiguas)
for (i=0; i<M; i++)
    for (j=0; j<N; j++)
        A[i][j] = f(i,j);

// Acceso por COLUMNAS → genera muchos más fallos de página
for (j=0; j<N; j++)
    for (i=0; i<M; i++)
        A[i][j] = f(i,j);
Factor de código Impacto
Acceso por filas vs columnas El acceso por filas respeta la localidad; el acceso por columnas la rompe
Tamaño de subrutinas/métodos Métodos grandes generan más accesos dispersos
Recursividad Puede generar muchos accesos a la pila (stack)
Java vs C/C++ Java tiende a producir accesos más dispersos (menor localidad)

Limpieza anticipada de páginas (Precleaning)

Cuando el sistema está ocioso, el SO va guardando en disco las páginas modificadas (sucias) y pone a 0 su bit de modificación. Esto reduce el retardo al gestionar fallos de página futuros, ya que no habrá que escribir en disco en ese momento.


Consideraciones actuales

Evolución Impacto
La localidad de los programas ha ido disminuyendo (OOP, recolector de basura, tablas hash…) El concepto de "conjunto de trabajo" es más débil que hace 40 años
Memoria virtual y caché de disco unificadas en un único sistema Mayor eficiencia global
Tamaño de página variable Mejor adaptación al WS de cada proceso
Mayor diferencia de velocidad entre niveles de la jerarquía de memorias Los fallos de TLB y de página son más graves que antes

🧪 TEST — BLOQUE 2: Memoria Virtual

8. ¿Cuál es el principio fundamental que hace que la memoria virtual sea eficiente?


9. ¿Qué ocurre cuando la CPU intenta acceder a una página con el bit de validez a 0?


10. ¿Cuál de los siguientes algoritmos de reemplazo es teóricamente óptimo pero imposible de implementar en la práctica?


11. En el algoritmo de la 2ª oportunidad (CLOCK), ¿qué ocurre cuando se encuentra una página con REF=1?


12. ¿Qué es el bit de modificación en la tabla de páginas?


13. ¿Qué es la hiperpaginación (thrashing)?


14. El conjunto de trabajo WS(t, Δ) de un proceso se define como:


15. ¿Por qué el acceso a una matriz por columnas genera más fallos de página que el acceso por filas?


16. ¿Cuál de las siguientes afirmaciones sobre la paginación bajo demanda (demand paging) es CORRECTA?



✅ SOLUCIONES COMENTADAS


1 → b) El Registro Contador de Programas (CP) contiene en todo momento la dirección de memoria de la siguiente instrucción a ejecutar. Su salida está conectada al Bus de Direcciones (BA). No hay que confundirlo con el Registro de Instrucción (RI), que contiene la instrucción que se está ejecutando.

2 → c) El decodificador identifica la instrucción almacenada en el IR y determina los pasos elementales en que se descompone. El secuenciador usa esa información para generar y distribuir las señales de control. Son los dos bloques internos del Circuito de Control (CC).

3 → b) El Registro de Instrucción (RI) tiene tres campos: CO (Código de la Operación), MD (Modo de Direccionamiento) y CDE (Campo de Dirección Efectiva). El CO indica qué operación realizar, el MD cómo acceder a los datos y el CDE dónde están los datos.

4 → b) La potencia de un computador está determinada principalmente por el tiempo de ciclo (velocidad del reloj), el ancho de banda (transferencia de datos por segundo) y la capacidad de memoria. Los periféricos o el SO no son factores principales de potencia del procesador.

5 → d) El registro acumulador (AC) almacena los resultados de las operaciones de la ALU y puede referenciarse explícitamente en programación. RO1 y RO2 son los registros de los operandos (transparentes al usuario). BR es la batería de registros de uso general accesibles al programador.

6 → b) El orden correcto del ciclo de instrucción es: Fetch (extraer instrucción de memoria al RI) → Actualizar CP (apuntar a la siguiente instrucción) → Decodificar (analizar el CO) → Direccionar (determinar a qué datos acceder mediante MD y CDE) → Ejecutar (cargar datos y procesarlos).

7 → c) La frecuencia del reloj determina en parte la velocidad de funcionamiento del computador. El período de ciclo es del orden de nanosegundos. A mayor frecuencia (más MHz/GHz), menor período de ciclo y potencialmente mayor velocidad, aunque también intervienen otros factores como la arquitectura del procesador.

8 → b) La localidad es el principio que hace funcionar la memoria virtual: en cada momento los accesos a código y datos se concentran sobre áreas pequeñas respecto a la memoria total del proceso. Si esas áreas están en memoria principal, el programa puede ejecutarse con pocos fallos de página.

9 → b) Cuando la CPU intenta acceder a una página con bit de validez = 0 (no está en memoria principal), la MMU genera una excepción llamada fallo de página (page fault). Esta excepción activa una rutina del SO que se encarga de cargar la página del disco a la memoria principal.

10 → c) El algoritmo OPT/MIN es teóricamente óptimo (minimiza los fallos de página) porque reemplaza siempre la página que no se usará durante más tiempo. Es imposible de implementar en la práctica porque requiere conocer el futuro. Se usa como referencia teórica para comparar otros algoritmos.

11 → b) En el algoritmo de 2ª oportunidad (CLOCK), cuando se encuentra una página con REF=1, se le da una segunda oportunidad: se pone REF=0 y se continúa buscando la víctima. Solo se elige como víctima una página con REF=0. Si todas tienen REF=1, el algoritmo equivale a FIFO.

12 → c) El bit de modificación indica si la página ha sido escrita (modificada) desde que fue cargada en memoria. Si es 0, la página es una copia fiel del disco y puede descartarse sin escribir. Si es 1 (página "sucia"), hay que guardarla en disco antes de descartarla para no perder los cambios.

13 → b) La hiperpaginación (thrashing) ocurre cuando el sistema tiene un grado de multiprogramación excesivo: ningún proceso tiene suficientes marcos y se generan fallos de página en cadena. El sistema se pasa más tiempo gestionando fallos de página que ejecutando código de los procesos, y el rendimiento cae drásticamente.

14 → b) El conjunto de trabajo WS(t, Δ) es el conjunto de páginas accedidas por el proceso entre el instante t y t-Δ (las páginas accedidas en el "pasado reciente" definido por la ventana Δ). Si Δ tiene el tamaño adecuado, es una aproximación fiel de la localidad actual del proceso.

15 → b) Los elementos de una columna en una matriz C/C++ están almacenados en posiciones de memoria no contiguas (separadas por el tamaño de una fila), lo que significa que se encuentran en páginas diferentes. Esto rompe la localidad espacial y genera muchos más fallos de página que el acceso por filas, donde los elementos son contiguos en memoria.

16 → b) La paginación bajo demanda es la solución minimalista: no se carga ninguna página inicialmente. Las páginas se van cargando en memoria principal a medida que se necesitan, resolviendo los fallos de página según se producen. Es el enfoque más común en los sistemas operativos modernos.


📊 TABLA FLASH FINAL — Datos clave UCP y Memoria Virtual

Concepto Valor / Respuesta clave
UCP = Unidad Central de Proceso = CPU
Componentes principales de la CPU UC (Unidad de Control) + ALU
Registro que contiene la instrucción en ejecución RI (Registro de Instrucción)
Registro que apunta a la siguiente instrucción CP (Contador de Programas)
Campos del RI CO (código op.) + MD (modo direc.) + CDE (dirección efectiva)
Bloques del Circuito de Control Decodificador (identifica instrucción) + Secuenciador (genera microórdenes)
Registro que almacena resultados en la ALU AC (acumulador)
Registros de operandos en la ALU RO1 y RO2 (transparentes al usuario)
Registros de uso general accesibles al programador BR (batería de registros)
Unidad de medida de la velocidad del reloj MHz (megahercios)
Período de ciclo del reloj Orden de nanosegundos (10⁻⁹ s)
Etapas del ciclo de instrucción Fetch → Actualizar CP → Decodificar → Direccionar → Ejecutar
Principio que hace funcionar la memoria virtual Localidad
Bit que indica si una página está en RAM Bit de validez
Excepción al acceder a página no válida Fallo de página (page fault)
Pasos del fallo de página Buscar marco → Copiar página → Actualizar tabla → Reanudar proceso
No cargar páginas inicialmente Paginación bajo demanda (demand paging)
Algoritmo óptimo pero no implementable OPT / MIN
Algoritmo que aproxima OPT con uso histórico LRU (Least Recently Used)
Algoritmo más simple (primero en llegar) FIFO
Anomalía de Belady En FIFO, más marcos puede generar más fallos de página
FIFO + bit de referencia Algoritmo 2ª Oportunidad / CLOCK (Mac OS X, Windows XP)
Histórico de K bits de referencia Aging
Bit que indica si la página ha sido modificada Bit de modificación
Página sin modificar Limpia (puede descartarse sin escribir al disco)
Página modificada Sucia (hay que guardarla en disco antes de descartar)
Cuando no hay marcos libres y hay fallo de página Elegir página víctima y reemplazarla
Thrashing = Hiperpaginación: exceso de fallos de página por falta de marcos
Solución al thrashing por frecuencia PFF (Page Fault Frequency): ajustar marcos según frecuencia de fallos
Conjunto de páginas recientes de un proceso Working Set WS(t, Δ)
Fundador de la teoría del Working Set Peter Denning (1968-1970)
Guardar páginas sucias cuando el sistema está ocioso Limpieza anticipada (precleaning)
Acceso a matriz que genera menos fallos de página Acceso por filas (respeta localidad espacial)
Java vs C/C++ en memoria virtual Java genera accesos más dispersos → menor localidad