Skip to main content
Tema 3: Unidad de Entrada/Salida

This content is currently only available in Spanish. English translation is on the roadmap — in the meantime, here's the original.

Back to FUNDAMENTOS DE COMPUTADORES (INGENIERÍA EN IA)
FUNDAMENTOS DE COMPUTADORES (INGENIERÍA EN IA)41 min read

Tema 3: Unidad de Entrada/Salida

Fuente

Resumen elaborado a partir del Tema 3 de los apuntes de Fundamentos de Computadores (J. M. Díaz Martínez, R. Muñoz Mansilla y D. Chaos García) y de sus ejercicios de autoevaluación y problemas.


1. El problema que resuelve la unidad de E/S

Un computador tiene que comunicarse con el exterior: leer un teclado, escribir en pantalla, leer y guardar en disco, enviar datos por la red. La unidad o sistema de entrada/salida (E/S) articula esa comunicación entre la CPU, la memoria principal y los periféricos.

Su diseño es crítico para el rendimiento porque, en casi todas las aplicaciones reales, el sistema pasa una parte muy grande del tiempo moviendo datos hacia y desde los periféricos. Hay dos dificultades de fondo:

DificultadEn qué consisteConsecuencia
Disparidad de velocidadesLa CPU y la memoria son muchísimo más rápidas que los periféricos. Un disco o una impresora tardan, en ciclos de CPU, varios órdenes de magnitud más que una instrucciónLa CPU no puede quedarse esperando sin perder rendimiento
HeterogeneidadLos periféricos difieren en naturaleza física, velocidad, formato de datos y forma de operarHace falta un intermediario: el controlador de E/S

Todo el tema es una respuesta progresiva a una pregunta: ¿cómo hacer que la CPU dedique el menor tiempo posible a la E/S?


2. Clasificación de las técnicas de E/S

Las técnicas se distinguen por el papel de la CPU durante la transferencia.

TécnicaQuién mueve los datosQué hace la CPU mientras el periférico trabajaCoste hardware
E/S controlada por programaLa CPUEspera activa: consulta el estado una y otra vezMínimo
E/S mediante interrupcionesLa CPU (dentro de la RSI)Ejecuta otros programas; el controlador avisa con una interrupciónMedio
DMAUn controlador de DMASolo inicia y atiende la interrupción finalAlto
Procesador de E/S (PE/S)Un procesador dedicado con sus propios busesSolo pone en marcha la operaciónMás alto
Dispositivos dedicados (GPU, tarjeta de sonido)El dispositivo, que además procesa los datosEnvía órdenes de alto nivelMuy alto
mermaid
flowchart LR
    A["E/S por programa<br/>la CPU lo hace todo"] --> B["Interrupciones<br/>sin espera activa"]
    B --> C["DMA<br/>la CPU no copia datos"]
    C --> D["Procesadores de E/S<br/>gestión autónoma"]
    D --> E["Dispositivos dedicados<br/>procesan los datos"]

Las técnicas no son excluyentes: son una progresión histórica. Cada paso libera más a la CPU, pero exige un hardware de control más sofisticado. Es el compromiso habitual en ingeniería entre sencillez y rendimiento.


3. Periféricos y controladores de E/S

3.1 Por qué no se conectan los periféricos directamente al bus

Un periférico es cualquier dispositivo externo a la CPU y a la memoria principal capaz de intercambiar información con el sistema. Conectarlos directamente al bus es inviable: el bus tendría que trabajar al ritmo del dispositivo más lento.

Por eso entre cada periférico y el bus se coloca un controlador de E/S, que adapta las señales y los ritmos del dispositivo a los del bus.

3.2 Estructura del controlador

mermaid
flowchart LR
    BUS["Bus del sistema<br/>direcciones, datos, control"] <--> IF1["Interfaz con el bus"]
    subgraph CTRL ["Controlador de E/S"]
        IF1 <--> RD["Registro de datos (RD)"]
        IF1 <--> RE["Registro de estado / control (RE)"]
        RD <--> LOG["Lógica de interfaz<br/>específica del dispositivo"]
        RE <--> LOG
    end
    LOG <--> DEV["Periférico"]

Los registros internos a través de los que la CPU habla con el controlador se llaman puertos del controlador. Los dos básicos son:

RegistroFunción
Registro de datos (RD)Guarda temporalmente el dato que se lee o se escribe en el periférico
Registro de estado (RE)Informa del estado del dispositivo (preparado, ocupado, error). A veces actúa también como registro de control y recibe órdenes de la CPU

3.3 Funciones del controlador

FunciónQué implica
Control y temporizaciónCoordinar el intercambio. Secuencia típica: 1) la CPU pide el estado, 2) el controlador lo devuelve, 3) si está preparado, la CPU ordena la transferencia, 4) el controlador obtiene el dato del dispositivo, 5) el dato pasa del controlador a la CPU
ComunicaciónCon la CPU: decodificar órdenes, transferir datos, informar del estado y reconocer su propia dirección (cada dispositivo tiene una dirección única). Con el periférico: su protocolo específico
Almacenamiento temporalRegistros o buffers que compensan la diferencia de velocidad
Detección de erroresInformar de atascos de papel, sectores defectuosos, paquetes que no se pueden enviar, etc.

3.4 Organización del espacio de direcciones de E/S

Para que la CPU llegue a los controladores hay que decidir cómo encaja su espacio de direcciones con el de la memoria. Hay tres formas.

mermaid
flowchart TB
    subgraph A ["1. E/S localizada en memoria"]
        CPU1["CPU"] --- B1["Bus común<br/>Leer / Escribir comunes"] --- M1["Memoria"] & E1["E/S"]
    end
    subgraph B ["2. E/S aislada"]
        CPU2["CPU"] --- B2["Bus común<br/>Leer/Escribir M y Leer/Escribir E/S separadas"] --- M2["Memoria"] & E2["E/S"]
    end
    subgraph C ["3. Buses independientes"]
        CPU3["CPU"] --- BM["Bus de memoria"] --- M3["Memoria"]
        CPU3 --- BE["Bus de E/S"] --- E3["Canales / PE/S"]
    end

1) E/S localizada (mapeada) en memoria. Un único espacio de direcciones con las mismas señales de lectura y escritura. Con nn líneas de dirección, las 2n2^n direcciones se reparten:

ND=2n=NDM+NDPN_D = 2^n = N_{DM} + N_{DP}

2) E/S aislada (mapeada en puertos). Bus común, pero con líneas de control distintas para memoria y para E/S. Los espacios están separados y cada uno puede tener hasta 2n2^n direcciones:

NDM=NDP=2nN_{DM} = N_{DP} = 2^n

3) Buses independientes. Dos o más buses físicamente separados. Es típico de sistemas con canales o procesadores de E/S y lo más común hoy. Puede usar instrucciones separadas por canal, o un único espacio de direcciones que la lógica de la CPU redirige al canal adecuado.

OrganizaciónEspacio de direccionesInstrucciones de E/SVentajaInconveniente
Localizada en memoriaCompartido: NDM+NDP=2nN_{DM} + N_{DP} = 2^nLas mismas de memoria (p. ej. mov)Sencillez, repertorio simpleResta direcciones a la memoria
AisladaSeparados: 2n2^n cada unoEspecíficas (p. ej. IN, OUT)Toda la memoria disponibleNecesita instrucciones especiales
Buses independientesPor bus o unificadoSegún diseñoGran ancho de bandaMás hardware

El número máximo de periféricos es el espacio de E/S dividido entre las direcciones que ocupa cada uno:

Nperifeˊricos=NDPdirecciones por perifeˊricoN_{\text{periféricos}} = \frac{N_{DP}}{\text{direcciones por periférico}}

Ver ejemplo 3.1: 21 líneas, memoria de 1 Mi, E/S localizada

  • ND=221N_D = 2^{21}; NDM=220N_{DM} = 2^{20}.
  • NDP=221−220=220=1 048 576N_{DP} = 2^{21} - 2^{20} = 2^{20} = 1\,048\,576 direcciones.
  • Periféricos de 2 direcciones: 220/2=219=524 2882^{20}/2 = 2^{19} = 524\,288.
  • Periféricos de 8 direcciones: 220/23=217=131 0722^{20}/2^3 = 2^{17} = 131\,072.

Ver ejemplo 3.2: 32 líneas, memoria de 32 MiB, E/S aislada

En E/S aislada el tamaño de la memoria no interviene: el espacio de E/S es independiente.

NDP=232N_{DP} = 2^{32}; con 16 direcciones por periférico: 232/24=228=268 435 4562^{32}/2^4 = 2^{28} = 268\,435\,456 periféricos.

Ver ejemplo 3.3: el hueco PCI en x86-64

x86-64 usa los dos esquemas:

  • MMIO (E/S mapeada en memoria): los registros del periférico son direcciones físicas normales y se acceden con mov. Es el método preferente hoy.
  • Port I/O (E/S aislada): espacio separado de 64 KiB (0x0000 a 0xFFFF) con IN y OUT. Se mantiene por compatibilidad (teclado 0x60/0x64, COM1 0x3F8, configuración PCI 0xCF8/0xCFC).
RangoUso
0x0000_0000 a 0x0009_FFFFRAM baja (640 KB históricos)
0x000A_0000 a 0x000B_FFFFMemoria de vídeo VGA (MMIO)
0x000C_0000 a 0x000F_FFFFROM de opciones y BIOS
0x0010_0000 a 0xBFFF_FFFFRAM (hasta 3 GiB)
0xC000_0000 a 0xFFFF_FFFFHueco PCI (MMIO bajo 4 GiB)

Tamaño del hueco: 4 294 967 295−3 221 225 472+1=1 073 741 8244\,294\,967\,295 - 3\,221\,225\,472 + 1 = 1\,073\,741\,824 direcciones =1= 1 GiB. Se suma 1 porque la primera y la última dirección son válidas. Esa RAM no se pierde: el hardware la remapea por encima de 4 GiB.


4. E/S controlada por programa

4.1 Funcionamiento

La CPU ejecuta un programa que controla de forma directa y exclusiva la operación. Para cada transferencia hace tres tareas:

  1. Comprobar el estado del dispositivo leyendo el RE.
  2. Enviar la orden de lectura o escritura al controlador.
  3. Transferir el dato entre el RD y la CPU (o la memoria).

Lo característico es que el computador adapta su ritmo al del periférico mediante el propio programa.

4.2 Espera activa

Como el periférico es lento, la CPU espera en un bucle de espera (espera activa): lee repetidamente el RE hasta que el dato está listo. Mientras tanto no puede hacer nada más.

mermaid
flowchart TD
    A["Leer registro de estado RE"] --> B{"¿Dato preparado?"}
    B -->|No| A
    B -->|Sí| C["Leer registro de datos RD"]
    C --> D["Escribir el dato en memoria"]
    D --> E{"¿Quedan datos?"}
    E -->|Sí| A
    E -->|No| F["Fin"]

4.3 El ejemplo de referencia del tema

Los ejemplos 3.4 y 3.5 definen un computador que se reutiliza con todas las técnicas. Conviene tenerlo claro porque permite compararlas.

ParámetroValorEn ciclos de CPU
CPU64 bits, 4 GHz, 1 instrucción por ciclotciclo=0.25t_{ciclo} = 0.25 ns
Bus1 GHz, una palabra de 64 bits por ciclotbus=1t_{bus} = 1 ns =4= 4 ciclos
Búsqueda del bloque en disco4 ms16 000 000 ciclos
Bloque4 KiB a 600 MiB/stbloque=26 041.66t_{bloque} = 26\,041.66 ciclos
Palabras por bloque4 KiB/8 B4\text{ KiB}/8\text{ B}Npb=29=512N_{pb} = 2^9 = 512

Ver ejemplo 3.4: leer un bloque con espera activa

  1. Inicio: la CPU escribe dos registros del disco (operación y número de bloque): tinicio=2 tbus=8t_{inicio} = 2\,t_{bus} = 8 ciclos.
  2. Datos listos: 8+16 000 000+26 041.66=16 026 049.668 + 16\,000\,000 + 26\,041.66 = 16\,026\,049.66 ciclos.
  3. Detección: la CPU solo lee el RE al acabar un ciclo de bus (múltiplo de 4). La lectura que acaba en 16 026 048 aún no ve el dato, así que lo detecta en T=16 026 052T = 16\,026\,052 ciclos.
  4. Copia: la CPU es intermediaria, así que cada palabra necesita dos operaciones de bus (leer del disco y escribir en memoria):

tcopia=2⋅Npb⋅tbus=2⋅512⋅4=4096 ciclost_{copia} = 2 \cdot N_{pb} \cdot t_{bus} = 2 \cdot 512 \cdot 4 = 4096 \text{ ciclos}

  1. Total: TF=16 026 052+4096=16 030 148T_F = 16\,026\,052 + 4096 = 16\,030\,148 ciclos.
  2. Tiempo en el bucle de espera:

P=16 026 05016 030 148⋅100≈99.97 %P = \frac{16\,026\,050}{16\,030\,148} \cdot 100 \approx 99.97\ \%

Casi todo el tiempo de CPU se pierde comprobando el estado.

Ver ejemplo 3.5: cargar un programa de 100 MiB con espera activa

  • Bloques: Nb=100 MiB/4 KiB=25 600N_b = 100\text{ MiB}/4\text{ KiB} = 25\,600.
  • Primer bloque: T=16 026 052T = 16\,026\,052 ciclos y tcopia=4096t_{copia} = 4096.
  • Bloques siguientes (sin búsqueda, bloques contiguos): T2=2tbus+tbloque=26 049.66→26 052T_2 = 2t_{bus} + t_{bloque} = 26\,049.66 \to 26\,052 ciclos (múltiplo de 4).
  • Total:

16 026 052+4096+25 599⋅(26 052+4096)=787 788 800 ciclos≈0.197 s16\,026\,052 + 4096 + 25\,599 \cdot (26\,052 + 4096) = 787\,788\,800 \text{ ciclos} \approx 0.197 \text{ s}

  • Velocidad media: 100 MiB/0.197 s≈508100\text{ MiB}/0.197\text{ s} \approx 508 MiB/s, por debajo de los 600 MiB/s del disco.

4.4 Ventajas e inconvenientes

VentajasInconvenientes
La técnica más sencilla, en hardware y en softwareBajo rendimiento de CPU: millones de ciclos desperdiciados; cuanto más lento el periférico, peor
No necesita gestión de interrupciones ni hardware dedicadoNo es escalable: bloqueada con un periférico, la CPU no puede atender otro
Adecuada en sistemas simples sin multiprogramación y cuando se necesitan tiempos de respuesta muy predecibles (microcontroladores en tiempo real)Solo es aceptable si la espera es corta o la sencillez prima sobre el rendimiento

5. E/S mediante interrupciones

5.1 Idea y concepto de interrupción

Se elimina el bucle de espera: la CPU emite la orden y sigue con otros programas. Cuando el dispositivo está preparado, el controlador avisa con una interrupción.

Una interrupción es una señal que advierte al procesador de que ha ocurrido un evento que requiere su atención. En un bus paralelo se usan dos líneas:

LíneaSentidoFunción
PI (petición de interrupción)Controlador a CPUEl controlador pide atención
RI (reconocimiento de interrupción)CPU a controladorLa CPU confirma que atiende la petición

En buses serie se usan mensajes de interrupción (apartado 5.10).

5.2 Tipos de interrupción

TipoOrigenSincronía¿Repetible?Ejemplo
Interrupción hardwareMódulo externo al procesador (controlador de E/S, reloj)Asíncrona: puede llegar en cualquier instanteNo: aparece en puntos distintos si se repite el programaDisco con el dato listo
ExcepciónEl propio procesador, al intentar una operación no permitidaSíncronaSí: siempre en el mismo puntoDivisión por cero, dirección ilegal, desbordamiento de pila
Trampa (trap)Una instrucción del repertorio insertada voluntariamente por el programadorSíncronaSíLlamada al sistema operativo (pasa a modo privilegiado)

La diferencia entre excepción y trampa: ambas son síncronas, pero la trampa es intencionada y la excepción no.

5.3 Ciclo de atención de una interrupción

mermaid
flowchart TD
    S1["1. Sistema de interrupciones activado<br/>la CPU acepta peticiones"] --> S2["2. El controlador activa PI = 1<br/>(o envía un mensaje en bus serie)"]
    S2 --> S3["3. La CPU suspende el programa<br/>y salva el contexto (PC y registros)"]
    S3 --> S4["4. Inhibe interrupciones, eleva el privilegio<br/>y empieza a ejecutar la RSI"]
    S4 --> S5["5. Confirma: RI = 1<br/>el controlador baja PI = 0"]
    S5 --> S6["6. Al acabar la RSI<br/>reactiva las interrupciones"]
    S6 --> S7["7. Restaura privilegio y contexto<br/>y reanuda el programa donde se paró"]

El propósito del ciclo es que la interrupción sea transparente para el programa interrumpido: al restaurar su contexto continúa como si nada hubiera pasado, salvo el tiempo de CPU consumido.

5.4 Rutina de servicio de interrupción (RSI)

La RSI es el programa que se ejecuta al atender la interrupción. Normalmente forma parte del sistema operativo y se ejecuta en modo núcleo, con privilegios para acceder al hardware. En E/S, la RSI hace la transferencia efectiva de los datos y trata posibles errores. Termina con una instrucción de retorno de interrupción, que restaura contexto y privilegios.

text
Programa  ████████░░░░░░░░░░░░░░░░░░░████████
Cambio ctx        ▓▓▓            ▓▓▓
RSI                  █████████████
          ──T0────T1───────────T2────T3──────▶ t
          Para el programa, entre T0 y T3 "no ha pasado nada"

Ver ejemplo 3.6: sobrecarga del tic del reloj del sistema

El SO programa el reloj para interrumpir 100 veces por segundo. RSI de 300 ns y cambio de contexto de 1 µs (hay dos por interrupción: entrada y salida).

t=100⋅(1000+300+1000) ns=230 000 ns=230 µst = 100 \cdot (1000 + 300 + 1000)\text{ ns} = 230\,000\text{ ns} = 230\text{ µs}

Sobrecarga=230⋅10−61⋅100=0.023 %\text{Sobrecarga} = \frac{230 \cdot 10^{-6}}{1} \cdot 100 = 0.023\ \%

Ver ejemplo 3.7: ahorro de energía en un microcontrolador

Un microcontrolador a 16 MHz lee una fotocélula una vez por segundo. Ejecuta 100 instrucciones (1 ciclo cada una) y se duerme hasta que una interrupción del reloj lo despierta. En modo normal consume 10 000 veces más que en bajo consumo. Unidad: 1 ue = energía de 1 s en bajo consumo.

  • Tiempo activo: 100/(16⋅106)=6.25100/(16 \cdot 10^6) = 6.25 µs.
  • Con interrupciones: Eint=6.25⋅10−6⋅10 000+1=1.0625E_{int} = 6.25 \cdot 10^{-6} \cdot 10\,000 + 1 = 1.0625 ue.
  • Con espera activa: Eact=1.00000625⋅10 000=10 000.0625E_{act} = 1.00000625 \cdot 10\,000 = 10\,000.0625 ue.
  • Ahorro: Eact−EintEact⋅100≈99.989 %\dfrac{E_{act} - E_{int}}{E_{act}} \cdot 100 \approx 99.989\ \%.

Aunque la CPU no tenga otra cosa que hacer, las interrupciones ahorran energía.

5.5 Interrupciones múltiples: anidables o no

OrganizaciónQué pasa si llega IkI_k mientras se atiende IiI_i
Un único nivel (no anidables)IkI_k espera hasta que IiI_i termine, aunque sea más prioritaria. Al acabar, se atiende la pendiente de mayor prioridad
Múltiples niveles (anidables)Si IkI_k es estrictamente más prioritaria, interrumpe a la RSI de IiI_i, que se reanuda después. Si es de prioridad igual o menor, espera

Ver ejemplo 3.8: PI3 en t = 0 y PI1, PI4, PI2 en t = 1 (prioridad PI4 > PI3 > PI2 > PI1, RSI de 3 ut)

Sin anidamiento:

text
t     0  1  2  3  4  5  6  7  8  9 10 11 12
PI3   [ ███████ ]
PI4            [ ███████ ]
PI2                     [ ███████ ]
PI1                              [ ███████ ]

PI3 acaba en 3, PI4 en 6, PI2 en 9, PI1 en 12.

Con anidamiento:

text
t     0  1  2  3  4  5  6  7  8  9 10 11 12
PI3   [██]          [█████]
PI4      [ ███████ ]
PI2                        [ ███████ ]
PI1                                 [ ███████ ]

PI4 interrumpe a PI3 en t = 1 y acaba en 4; PI3 termina sus 2 ut restantes en 6; luego PI2 (9) y PI1 (12). El anidamiento adelanta la más prioritaria.

Ver ejemplo 3.9: discos, CD-ROM e impresora (P1 > P2 > P3)

Discos P1 (10 ut), CD-ROM P2 (30 ut), impresora P3 (15 ut). Llegadas: disco 1 en 0, impresora en 3, CD-ROM en 5, disco 2 en 14.

IntervaloSe ejecutaMotivo
0 a 10Disco 1Máxima prioridad; impresora y CD-ROM esperan
10 a 14CD-ROMEl pendiente más prioritario
14 a 24Disco 2Interrumpe al CD-ROM (le quedan 26 ut)
24 a 50CD-ROMTermina sus 26 ut
50 a 65ImpresoraÚltima pendiente

El CD-ROM termina en t = 50 ut.

5.6 Líneas de interrupción y controlador de interrupciones (PIC)

EsquemaFuncionamientoVentajaInconveniente
Línea única compartidaTodos los controladores comparten una PIÚtil con muchos periféricosLa CPU sabe que hay interrupción, pero no de quién: hay que identificarla
Múltiples líneasCada controlador tiene su PIiPI_iIdentificación directa e inmediata, menor latenciaMuchos pines y conexiones: poco escalable
Controlador de interrupciones (PIC)Un circuito entre periféricos y CPU gestiona todoCentraliza la gestiónHardware adicional

Funciones del PIC (Programmable Interrupt Controller):

  1. Identificar la fuente de la interrupción.
  2. Establecer las prioridades de cada periférico.
  3. Activar o desactivar selectivamente las peticiones.
  4. Enviar a la CPU la petición y la información del periférico que debe atenderse.

5.7 Prioridades y enmascaramiento

Las prioridades existen porque algunos dispositivos necesitan respuesta más rápida que otros, y porque permiten proteger una RSI frente a interrupciones que la corromperían (por ejemplo, que se interrumpa a sí misma).

Enmascarar (bloquear, inhibir, deshabilitar) una interrupción significa que, aunque llegue la petición, no se atiende hasta desbloquearla. Desenmascarar es permitirla.

Enmascaramiento individual

Hay un registro de máscara MM con un bit MjM_j por línea PIjPI_j. Convenio del libro: Mj=1M_j = 1 permitida, Mj=0M_j = 0 bloqueada.

REj=PIj⋅MjPI=RE1+RE2+⋯+REnRE_j = PI_j \cdot M_j \qquad\qquad PI = RE_1 + RE_2 + \cdots + RE_n

mermaid
flowchart LR
    P1["PI1"] --> A1(("AND"))
    M1["M1"] --> A1
    P2["PI2"] --> A2(("AND"))
    M2["M2"] --> A2
    Pn["PIn"] --> An(("AND"))
    Mn["Mn"] --> An
    A1 -->|RE1| OR(("OR"))
    A2 -->|RE2| OR
    An -->|REn| OR
    OR -->|PI| CPU["CPU"]

Cada petición pasa por una puerta AND con su bit de máscara; una OR junta todo en la señal única PI hacia la CPU. Entre las permitidas, se atiende la de mayor prioridad.

Ver ejemplo 3.10: máscara 3C con peticiones en PI2 y PI4

Prioridad PI1 > PI2 > ... > PI8; el bit más significativo es PI1.

3C16=0011 110023C_{16} = 0011\,1100_2

LíneaPI1PI2PI3PI4PI5PI6PI7PI8
Máscara00111100
Petición11
REjRE_j01

PI2 es más prioritaria, pero está enmascarada. Se atiende PI4.

Enmascaramiento por nivel

Un codificador de prioridad asigna a cada línea un nivel numérico CC. La CPU fija un nivel de prioridad de ejecución AA, modificable con instrucciones especiales. Regla:

Se atiende la interrupcioˊn si y solo si C>A(estrictamente mayor)\text{Se atiende la interrupción si y solo si } C > A \quad \text{(estrictamente mayor)}

Es muy cómodo para anidar: al entrar en una RSI se eleva AA a su propio nivel, y así se bloquean automáticamente todas las de nivel igual o inferior (incluida ella misma), sin tocar bits uno a uno. Al salir, se restaura el AA anterior.

ComparaciónIndividualPor nivel
Qué se configuraUn bit por líneaUn número AA
ReglaAtender si PIj⋅Mj=1PI_j \cdot M_j = 1Atender si C>AC > A
VentajaControl fino, línea a líneaAnidamiento automático

En la práctica muchos procesadores combinan ambos: niveles para decidir el anidamiento y máscaras individuales para identificar la fuente.

5.8 Identificación de la fuente

  • Con múltiples líneas: trivial. El controlador indica la línea; ese identificador se llama vector de interrupción, y el SO tiene una tabla de vectores que apunta a cada RSI.
  • Con línea compartida: lo habitual es la identificación por encuesta. Un programa interroga uno a uno a los controladores (leyendo su RE) hasta encontrar quién interrumpió. Puede hacerlo la CPU o el controlador de interrupciones.
mermaid
flowchart TD
    A["PI activada"] --> B{"¿Periférico 1?"}
    B -->|Sí| R1["RSI del periférico 1"]
    B -->|No| C{"¿Periférico 2?"}
    C -->|Sí| R2["RSI del periférico 2"]
    C -->|No| D{"..."}
    D --> N{"¿Periférico n?"}
    N -->|Sí| Rn["RSI del periférico n"]
Encuesta
DesventajaSe pierde tiempo averiguando el origen; en el peor caso se recorren todos
VentajaEstablece implícitamente las prioridades: el primero en ser consultado es el más prioritario

5.9 Coste de una interrupción

Cada interrupción consume el tiempo de reconocimiento y el de la RSI:

tI=tRI+tSIt_I = t_{RI} + t_{SI}

Si cada interrupción transfiere BB bytes, el ancho de banda máximo es B/tIB / t_I. A la inversa, fijado un ancho de banda se puede calcular cuántas instrucciones puede tener la RSI.

Ver ejemplo 3.11: instrucciones máximas de la RSI para 800 MB/s

CPU a 2 GHz con CPI = 4; tRI=80t_{RI} = 80 ns; 512 B por interrupción.

  1. Tiempo entre interrupciones: tT=512/(800⋅106)=640t_T = 512 / (800 \cdot 10^6) = 640 ns.
  2. Tiempo para la RSI: tSI=640−80=560t_{SI} = 640 - 80 = 560 ns.
  3. Velocidad de ejecución: ve=f/CPI=2⋅109/4=0.5⋅109v_e = f/CPI = 2 \cdot 10^9 / 4 = 0.5 \cdot 10^9 instrucciones/s.
  4. Instrucciones: N=560⋅10−9⋅0.5⋅109=280N = 560 \cdot 10^{-9} \cdot 0.5 \cdot 10^9 = 280.

5.10 Interrupciones señaladas por mensaje (MSI)

En buses serie como PCIe ya no hay líneas físicas de interrupción. Hay dos opciones: emular las líneas (modo de compatibilidad) o usar MSI (Message Signaled Interrupts):

mermaid
sequenceDiagram
    participant SO as Sistema operativo
    participant D as Dispositivo PCIe
    participant RC as Root Complex
    participant LAPIC as Controlador de interrupciones (LAPIC)
    SO->>D: Arranque: escribe en la capability MSI la dirección del LAPIC y el número de vector
    D->>RC: Para interrumpir: escritura posteada con esa dirección y ese dato
    RC->>LAPIC: Entrega el mensaje
    LAPIC->>LAPIC: Aplica máscaras y prioridades
    LAPIC-->>SO: Interrupción a la CPU con el vector de la fuente
  • Ventaja principal: cada fuente tiene su propio vector, así que el mensaje identifica directamente la fuente. Se obtienen las ventajas de las múltiples líneas sin cableado adicional.
  • El controlador de interrupciones, el cambio de contexto y la RSI siguen existiendo.
  • MSI-X añade máscara por vector en el propio dispositivo.
  • Orden de llegada: al ser una escritura posteada, la interrupción no adelanta a las escrituras anteriores del mismo dispositivo por el mismo canal.
  • Moderación o coalescencia: los dispositivos rápidos fusionan varios eventos en una sola interrupción para reducir la sobrecarga.

5.11 Ventajas e inconvenientes

VentajasInconvenientes
Eliminan la espera activa: la CPU hace otras tareas y se ahorra energíaCada interrupción tiene un coste fijo de cambio de contexto; con muchas interrupciones (bloques grandes) es significativo
Escalables: atienden varios periféricos de velocidades distintasHardware más complejo (líneas PI/RI, prioridades, máscaras) y un SO que lo gestione
Básicas en multiprogramación; el reloj permite al SO recuperar el control periódicamenteLa CPU sigue copiando todos los datos

Ver ejemplo 3.12: leer un bloque con interrupciones

Mismo computador del ejemplo 3.4. RSI de 100 instrucciones más la copia; cambio de contexto de 1 µs =4000= 4000 ciclos.

  • Coste de la interrupción: tint=2tcc+te+tcopia=2⋅4000+100+4096=12 196t_{int} = 2t_{cc} + t_e + t_{copia} = 2 \cdot 4000 + 100 + 4096 = 12\,196 ciclos.
  • Datos listos en 16 026 049.66; la interrupción se atiende al acabar la instrucción en curso (no hay que esperar al ciclo de bus): T=16 026 050T = 16\,026\,050.
  • Total: 16 026 050+12 196=16 038 24616\,026\,050 + 12\,196 = 16\,038\,246 ciclos (algo más que con espera activa).
  • CPU dedicada a la E/S: 8+12 196=12 2048 + 12\,196 = 12\,204 ciclos, es decir 0.076 %.

La E/S tarda un poco más, pero la CPU queda libre casi todo el tiempo.

Ver ejemplo 3.13: cargar 100 MiB con interrupciones

La RSI, al terminar de copiar, pide el bloque siguiente justo antes del cambio de contexto de salida. Cada bloque posterior tarda ⌈tbloque⌉=26 042\lceil t_{bloque} \rceil = 26\,042 ciclos y, como tbloque>tcct_{bloque} > t_{cc}, no hay solapamiento.

TF=T+(Nb−1)(tint−tcc+⌈tbloque⌉)+tintT_F = T + (N_b - 1)(t_{int} - t_{cc} + \lceil t_{bloque} \rceil) + t_{int}

=16 026 050+25 599⋅(12 196−4000+26 042)+12 196=871 954 008 ciclos≈0.218 s= 16\,026\,050 + 25\,599 \cdot (12\,196 - 4000 + 26\,042) + 12\,196 = 871\,954\,008 \text{ ciclos} \approx 0.218 \text{ s}

Velocidad media: ≈459\approx 459 MiB/s, peor que con espera activa (508 MiB/s), por la sobrecarga de los cambios de contexto en cada bloque.


6. Acceso directo a memoria (DMA)

6.1 Motivación

TécnicaVelocidad de transferenciaDisponibilidad de la CPU
Por programaAlta (la CPU se dedica en exclusiva)Nula durante la transferencia
InterrupcionesMenor (cambio de contexto y RSI)Alta, pero la CPU sigue copiando cada dato
DMAAlta, cercana a la de por programaAlta, parecida a interrupciones

Con bloques grandes (discos, red, almacenamiento masivo) hace falta mover datos rápido sin cargar a la CPU.

6.2 Concepto y controlador de DMA

El DMA añade un módulo hardware conectado al bus que transfiere un bloque completo entre periférico y memoria, palabra a palabra, sin que la CPU intervenga en cada dato. La CPU solo configura la transferencia y trata su final.

mermaid
flowchart LR
    subgraph DMA ["Controlador de DMA"]
        CP["Contador de palabras<br/>(se decrementa)"]
        DM["Registro de dirección de memoria<br/>(se incrementa)"]
        DP["Registro de dirección del periférico"]
        RDAT["Registro de datos"]
        UC["Unidad de control"]
    end
    CPU["CPU"] -- "petición de DMA / reconocimiento de DMA / interrupción" --- UC
    DMA <--> BUS["Bus del sistema"] <--> MEM["Memoria principal"]
    DMA <--> CES["Controlador de E/S"] <--> PER["Periférico"]
ComponenteFunción
Contador de palabrasPalabras (o bytes) que faltan; se decrementa
Dirección de memoriaDónde leer o escribir el siguiente dato; se incrementa
Dirección del periféricoQué dispositivo y, en su caso, qué posición dentro de él
Registro de datosPalabra en tránsito
Unidad de controlGenera y recibe las señales de petición y reconocimiento de DMA, gobierna lectura y escritura y genera la interrupción final

6.3 Pasos de una transferencia por DMA

mermaid
sequenceDiagram
    participant CPU
    participant DMA as Controlador DMA
    participant MEM as Memoria
    CPU->>DMA: 1. Inicializa: dirección de memoria, dirección del periférico, contador
    DMA->>CPU: 2. Petición de DMA
    CPU-->>DMA: En el siguiente punto de ruptura cede el bus: reconocimiento de DMA
    loop 3. Por cada palabra
        DMA->>MEM: Transfiere la palabra, decrementa el contador e incrementa la dirección
    end
    Note over DMA,CPU: 4. Si el periférico no está listo y el contador no es 0, devuelve el bus temporalmente
    DMA->>CPU: 5. Contador = 0: libera el bus e interrumpe

Clave: cuando la CPU cede el bus en un punto de ruptura no hay cambio de contexto. Simplemente detiene sus accesos a memoria y continúa al recuperar el bus. La CPU solo trabaja activamente al principio y al final:

TDMA=TDMA(inicio)+TDMA(bus)+TDMA(final)T_{DMA} = T_{DMA}(\text{inicio}) + T_{DMA}(\text{bus}) + T_{DMA}(\text{final})

TérminoSignificado
TDMA(inicio)T_{DMA}(\text{inicio})Instrucciones de inicialización
TDMA(bus)T_{DMA}(\text{bus})Tiempo en que la CPU está detenida por haber cedido el bus
TDMA(final)T_{DMA}(\text{final})RSI de la interrupción de fin

6.4 Arbitraje del bus y puntos de ruptura

El bus solo puede tenerlo un dispositivo a la vez, así que hace falta arbitraje. La CPU no cede el bus en cualquier momento, sino en puntos de ruptura de DMA, situados entre las fases del ciclo de instrucción. Hay también puntos de ruptura de interrupción, donde la CPU comprueba si hay interrupciones pendientes.

text
Ciclo de instrucción:
 | Búsqueda | Decodificación | Búsqueda operandos | Ejecución | Almacenar resultado |
            ^                ^                    ^           ^                     ^
            puntos de ruptura de DMA (entre fases)     punto de ruptura de interrupción (al final)

La CPU solo queda detenida si necesita la memoria: si sus datos e instrucciones están en caché, sigue trabajando aunque haya DMA en curso.

6.5 Estrategias de DMA

text
                      CPU                        Bus usado por el DMA
Ráfagas con parada    ███████░░░░░░░░░░░███████   ░░░░░░░█████████████░░░░░░
Robo de ciclos        █████░█████░█████░█████░   ░░░░░█░░░░░█░░░░░█░░░░░█
Transparente          ████████████████████████   ░█░░█░░█░░█░░█░░█░░█░░█░
Ráfagas sin parada    ████████████████████████   ░░░░░░░█████████████░░░░░░
                      (█ = trabajando)            (█ = transfiriendo)
EstrategiaCómo usa el busVelocidad de transferenciaEfecto sobre la CPUUso actual
Ráfagas con paradaToma el bus y no lo suelta hasta acabar el bloqueMáximaParada toda la ráfagaConcepto inicial
Ráfagas sin paradaRáfagas por buses dedicados; la CPU trabaja desde la cachéMáximaPrácticamente ningunoLo habitual hoy (PCIe, SATA, AMBA AXI)
Robo de ciclosUn ciclo por palabra y devuelve el busMenorPierde un ciclo por palabraMicrocontroladores e IoT (ARM Cortex-M), periféricos lentos (ADC, UART, SPI)
TransparenteSolo en ciclos en que la CPU no usa el busBastante menorNingunoEn desuso (multinúcleo), interés histórico

Las tres estrategias clásicas son un compromiso: cuanto más tiempo retiene el DMA el bus en cada intervención, más rápida es la transferencia y más se penaliza a la CPU.

Por qué las ráfagas son imprescindibles hoy. La luz es "lenta" a escala de un computador moderno: si cada transferencia exige ida y vuelta de señales de confirmación, el tiempo de propagación domina.

Ver ejemplo 3.14: byte a byte frente a ráfagas en un bus serie

Bus serie a 16 GHz, 1 bit por ciclo (16 Gb/s), disco a 15 cm, c=3⋅108c = 3 \cdot 10^8 m/s. Cada transacción: el emisor envía (IR) y espera la confirmación (TR).

  • Propagación: tp=0.15/(3⋅108)=0.5t_p = 0.15 / (3 \cdot 10^8) = 0.5 ns.

a) Byte a byte

  • tt=8/(16⋅109)=0.5t_t = 8 / (16 \cdot 10^9) = 0.5 ns.
  • T=2tp+tt=1.5T = 2t_p + t_t = 1.5 ns.
  • BW=8 bits/1.5 ns=5.33BW = 8\text{ bits}/1.5\text{ ns} = 5.33 Gb/s, solo el 33 % del máximo.

b) Ráfaga de 4 KiB

  • ttb=32 768/(16⋅109)=2048t_{tb} = 32\,768 / (16 \cdot 10^9) = 2048 ns.
  • Tb=2⋅0.5+2048=2049T_b = 2 \cdot 0.5 + 2048 = 2049 ns.
  • BWb=32 768/2049 ns=15.99BW_b = 32\,768 / 2049\text{ ns} = 15.99 Gb/s, el 99.95 %.

Ver ejemplo 3.15: robo de ciclos

CPU a 1 GHz (tc=1t_c = 1 ns), 5 ciclos por instrucción, bus de 32 bits por ciclo, bloque de 4 KiB.

  • Transferencias: N=4096 B/4 B=1024N = 4096\text{ B} / 4\text{ B} = 1024.
  • Cada palabra: 5 ciclos de instrucción y 1 ciclo robado, 6 ciclos en total.
  • T=6⋅1024⋅1 ns=6.144T = 6 \cdot 1024 \cdot 1\text{ ns} = 6.144 µs.
  • Bus dedicado a la E/S: 1/6=16.7 %1/6 = 16.7\ \%; CPU disponible: 83.3 %83.3\ \%.

Ver ejemplo 3.16: DMA transparente

Mismo escenario; el DMA usa el bus en las fases de decodificación y ejecución (2 transferencias por instrucción de 5 ciclos) y empieza justo en una decodificación.

  • Instrucciones: 1024/2=5121024/2 = 512, que son 512⋅5=2560512 \cdot 5 = 2560 ciclos.
  • El primer ciclo (búsqueda) y el último (almacenar) no cuentan: N=2560−2=2558N = 2560 - 2 = 2558 ciclos, es decir T=2.558T = 2.558 µs.
  • Bus en E/S: 1024/2558≈40 %1024/2558 \approx 40\ \%.
  • CPU disponible: 100 %, porque nunca compite por el bus.

6.6 Coherencia de caché con DMA

La CPU accede a la memoria a través de la caché, pero el DMA va directo a memoria principal. Un mismo dato puede tener dos valores distintos: es un problema de incoherencia.

CasoQué fallaQué hay que hacer
Lectura de disco por DMA hacia un buffer (ej. 3.17)El DMA actualiza la memoria, pero la CPU lee la copia antigua de la cachéInvalidar las líneas del buffer en caché
Envío de un buffer a la red por DMA (ej. 3.18)Con post-escritura, los datos nuevos están solo en caché (líneas sucias); el DMA envía la memoria desactualizada ("basura")Limpiar (clean/flush): escribir en memoria las líneas modificadas antes del DMA
mermaid
flowchart TD
    Q{"¿El hardware garantiza<br/>coherencia de E/S?"}
    Q -->|Sí| H["Soluciones hardware"]
    H --> H1["Espionaje del bus (snooping):<br/>la caché observa el bus e invalida, actualiza<br/>o suministra el dato"]
    H --> H2["Coherencia en el interconector:<br/>x86 con PCIe (root complex), ARM con ACE/CHI"]
    Q -->|No| S["Soluciones software (driver)"]
    S --> S1["Limpieza (clean/flush) antes de que el DMA lea"]
    S --> S2["Invalidación antes de que la CPU lea lo que escribió el DMA"]
    S --> S3["Regiones de memoria no cacheables"]

Las soluciones hardware hacen la coherencia transparente al software, a costa de más complejidad y tráfico de consultas (snoops), que afecta a latencia y consumo.

6.7 Ventajas e inconvenientes del DMA

VentajasInconvenientes
Transferencias de bloques a alta velocidadHardware adicional (controlador de DMA)
La CPU solo interviene al principio y al finalNecesita arbitraje del bus y mecanismos de coherencia de caché
No hay cambio de contexto al ceder el busLa CPU puede quedar detenida mientras el bus está cedido
No acelera la transferencia en sí: reduce el tiempo de CPU

Ver ejemplo 3.19: leer un bloque con DMA

La CPU escribe tres registros del DMA (origen, destino y longitud): tinicio=3⋅4=12t_{inicio} = 3 \cdot 4 = 12 ciclos.

  • Datos listos: 16 026 053.6616\,026\,053.66; el DMA los detecta en el siguiente ciclo de bus: T=16 026 056T = 16\,026\,056.
  • El DMA copia el bloque: tcopia=4096t_{copia} = 4096 ciclos (la CPU no participa).
  • Interrupción final: tint=2tcc+te=8000+100=8100t_{int} = 2t_{cc} + t_e = 8000 + 100 = 8100 ciclos (ya no incluye la copia).
  • Total: 16 026 056+4096+8100=16 038 25216\,026\,056 + 4096 + 8100 = 16\,038\,252 ciclos.
  • CPU dedicada: 12+8100=811212 + 8100 = 8112 ciclos, es decir 0.05 %.

Ver ejemplo 3.20: cargar 100 MiB con DMA

El orden cambia (primero el DMA lee y luego hay cambio de contexto), pero el tiempo total es prácticamente el mismo que con interrupciones: 871 954 010871\,954\,010 ciclos ≈0.218\approx 0.218 s y ≈459\approx 459 MiB/s.

Lo que cambia es el trabajo de la CPU:

TCPU,DMA=25 600⋅8100+12=207 360 012 ciclosT_{CPU,DMA} = 25\,600 \cdot 8100 + 12 = 207\,360\,012 \text{ ciclos}

TCPU,INT=25 600⋅12 196+8=312 217 608 ciclosT_{CPU,INT} = 25\,600 \cdot 12\,196 + 8 = 312\,217\,608 \text{ ciclos}

Mejora: 312 217 608−207 360 012312 217 608⋅100=33.6 %\dfrac{312\,217\,608 - 207\,360\,012}{312\,217\,608} \cdot 100 = 33.6\ \% menos de CPU. La duración de la E/S no se reduce.


7. Procesadores de E/S (PE/S)

7.1 Motivación y concepto

Incluso con DMA, la CPU inicializa cada transferencia y atiende cada interrupción final. Con muchos periféricos o gestiones complejas, esa carga residual se acumula. Además, el DMA sigue usando el bus del sistema.

Un canal o procesador de E/S (PE/S) es un módulo que libera casi por completo a la CPU. Tiene memoria local propia y puede tener un repertorio de instrucciones propio orientado a E/S: es, en la práctica, un computador especializado dentro del computador.

Se comunica con tres elementos usando una técnica distinta con cada uno:

Con quiénTécnica
CPUE/S mediante interrupciones
Controladores de E/S de sus periféricosE/S controlada por programa
Memoria principalDMA

7.2 Arquitectura

mermaid
flowchart TB
    CPU["CPU"] --- BS["Bus del sistema"]
    MP["Memoria principal"] --- BS
    BS --- PES1["PE/S 1"]
    BS --- PES2["PE/S 2"]
    BS --- PESn["PE/S n"]
    PES1 --- BES1["Bus de E/S 1"]
    BES1 --- C11["Controlador E/S"] & C12["Controlador E/S"]
    PES2 --- BES2["Bus de E/S 2"]
    BES2 --- C21["Controlador E/S"] & C22["Controlador E/S"]

Dos niveles de buses: el bus del sistema (CPU, memoria, PE/S) y un bus de E/S por cada PE/S. La gestión detallada de cada dispositivo queda aislada de la CPU y del bus del sistema.

7.3 Canal selector y canal multiplexor

TipoFuncionamientoVelocidad máxima del canalAdecuado para
SelectorVarios dispositivos rápidos, pero en cada instante atiende a uno solovT=max⁡{vT1,vT2,…}v_T = \max\{v_{T1}, v_{T2}, \ldots\}Discos y dispositivos de alta velocidad
MultiplexorAtiende a todos a la vez, entrelazandovT=vT1+vT2+⋯v_T = v_{T1} + v_{T2} + \cdotsMuchos dispositivos lentos (terminales, cintas lentas)

En ambos, el tiempo para transferir un byte lo marca el más lento entre el bus y el canal:

tcanal=1 BvT(canal)tT=max⁡{tbus, tcanal}P=tbustT⋅100 %t_{canal} = \frac{1\text{ B}}{v_T(\text{canal})} \qquad t_T = \max\{t_{bus},\ t_{canal}\} \qquad P = \frac{t_{bus}}{t_T} \cdot 100\ \%

Si tbus≥tcanalt_{bus} \geq t_{canal}, entonces P=100 %P = 100\ \%: el bus está saturado y la velocidad la limita el bus (1 B/tbus1\text{ B}/t_{bus}), no el canal.

Ver ejemplo 3.21: 2 discos de 100 MB/s y 2 cintas de 10 MB/s, bus de 5 ns por byte

a) Selector

  • vT=100v_T = 100 MB/s, tcanal=10t_{canal} = 10 ns.
  • tT=max⁡{5,10}=10t_T = \max\{5, 10\} = 10 ns.
  • P=5/10=50 %P = 5/10 = 50\ \%.

b) Multiplexor

  • vT=100+100+10+10=220v_T = 100 + 100 + 10 + 10 = 220 MB/s, tcanal=4.55t_{canal} = 4.55 ns.
  • tT=max⁡{5,4.55}=5t_T = \max\{5, 4.55\} = 5 ns, P=100 %P = 100\ \%: el bus está saturado.

7.4 Ventajas e inconvenientes

VentajasInconvenientes
Liberan casi totalmente a la CPU: el PE/S inicializa cada transferencia, controla el estado, encadena operaciones y notifica al finalMás hardware: buses de E/S adicionales
Canales dedicados: menos uso del bus del sistema y más ancho de bandaProtocolos de comunicación propios entre PE/S y periféricos
El selector aprovecha al máximo los dispositivos rápidos; el multiplexor gestiona muchos lentos

Ver ejemplo 3.22: un bloque con PE/S

  • Inicio: 3 escrituras, 12 ciclos. Transferencia desde T=16 026 056T = 16\,026\,056.
  • El PE/S lee del disco y escribe en memoria por buses distintos y a la vez, así que la copia va al ritmo del disco: tcopia=26 042t_{copia} = 26\,042 ciclos.
  • tint=8100t_{int} = 8100 ciclos.
  • Total: 16 026 056+26 042+8100=16 060 19816\,026\,056 + 26\,042 + 8100 = 16\,060\,198 ciclos.
  • CPU: 81128112 ciclos, es decir 0.051 %. Con un solo bloque la mejora es pequeña.

Ver ejemplo 3.23: 100 MiB con PE/S

La transferencia se inicia una sola vez y el PE/S hace el resto a 600 MiB/s:

  • tcopia=100 MiB600 MiB/s⋅10.25 ns≈666 666 667t_{copia} = \dfrac{100\text{ MiB}}{600\text{ MiB/s}} \cdot \dfrac{1}{0.25\text{ ns}} \approx 666\,666\,667 ciclos.
  • TF=16 026 056+666 666 667+8100=682 700 823T_F = 16\,026\,056 + 666\,666\,667 + 8100 = 682\,700\,823 ciclos ≈0.171\approx 0.171 s.
  • Velocidad media: ≈585\approx 585 MiB/s, muy cerca de los 600 MiB/s del disco.

8. E/S de gráficos

La salida de vídeo es un dispositivo especialmente exigente por el ancho de banda necesario para refrescar la pantalla. Además, las GPU son clave en inteligencia artificial.

8.1 Gráficos gestionados por la CPU

En los primeros PC, la salida gráfica era E/S mapeada en memoria: una región, el framebuffer (memoria de vídeo), formaba parte del mapa de direcciones de la CPU. Un controlador de vídeo sencillo (CRTC 6845, ULA del Spectrum) la recorría sincronizado con el barrido del monitor y la convertía en señal de vídeo.

  • Todo el dibujo lo hacía la CPU, con instrucciones normales de memoria (E/S controlada por programa), byte a byte.
  • Modos de texto: la CPU escribía un código de carácter y un byte de atributo (color); una ROM generadora de caracteres lo convertía en la matriz de puntos, ahorrando memoria y trabajo.
  • Problema: CPU y controlador compartían memoria y bus, lo que provocaba esperas de la CPU ("contención" del Spectrum) o parpadeos ("nieve" de la CGA) si se escribía durante el barrido.
  • Solución: el controlador avisaba con una interrupción al terminar el barrido vertical, el momento seguro para modificar la imagen.

Al crecer la resolución, el ancho de banda y el uso de CPU se vuelven insostenibles.

Ver ejemplo 3.24: 4K a 30 fps calculado por la CPU

3840 × 2160 píxeles, 24 bits por píxel, CPU a 30 fps, pantalla refrescada a 60 Hz, bus de 8 B por ns, 10 instrucciones de 0.25 ns por píxel.

CálculoResultado
Píxeles3840⋅2160=8 294 4003840 \cdot 2160 = 8\,294\,400
Tamaño del frame8 294 400⋅3=24 883 2008\,294\,400 \cdot 3 = 24\,883\,200 B ≈24.9\approx 24.9 MB
Transferencias de bus24 883 200/8=3 110 40024\,883\,200/8 = 3\,110\,400, que son ≈3.11\approx 3.11 ms
Bus por escritura de la CPU (30 fps)3.11⋅30/1000≈9.3 %3.11 \cdot 30 / 1000 \approx 9.3\ \%
Bus por lectura del controlador (60 Hz)18.6 %18.6\ \% (incluso si la imagen no cambia)
Bus total27.9 %27.9\ \%
Cálculo de un frame8 294 400⋅2.5 ns=20.78\,294\,400 \cdot 2.5\text{ ns} = 20.7 ms
CPU en cálculo (30 fps)≈62.1 %\approx 62.1\ \%
CPU total (cálculo y E/S)≈71.4 %\approx 71.4\ \%: inviable

8.2 Gráficos gestionados por la GPU

Con VGA y los aceleradores 2D y 3D, la CPU deja de generar píxeles y envía instrucciones a un dispositivo dedicado. La tarjeta gráfica tiene un procesador gráfico (GPU) y su propia memoria muy rápida (VRAM, hoy GDDR o HBM, con muchos canales simultáneos). CPU y GPU ya no compiten por el bus de memoria principal, y el refresco no afecta al resto del sistema.

mermaid
flowchart LR
    subgraph TG ["Tarjeta gráfica"]
        GPU["Procesador de comandos"] --> CORES["Miles de núcleos"]
        CORES <--> VRAM["VRAM (GDDR/HBM)"]
        VRAM --> FB["Framebuffer"]
        FB --> DE["Display Engine"]
    end
    CPU["CPU<br/>driver: lista de instrucciones"] -->|"PCIe: órdenes y datos"| GPU
    RAM["Memoria RAM<br/>texturas, geometría, pesos"] -->|"la GPU lee directamente"| VRAM
    SSD["SSD NVMe"] -.->|"en algunas GPU"| VRAM
    DE -->|"HDMI / DisplayPort"| MON["Monitor"]

Funcionamiento:

  1. La CPU envía datos a la GPU por un bus dedicado de alta velocidad (PCIe), o los deja en la RAM.
  2. El driver crea una lista de instrucciones; la GPU expone registros donde la CPU indica que hay trabajo.
  3. La GPU lee de la RAM lo que necesita (texturas, geometría, variables de IA) y lo copia a la VRAM. Algunas incluso leen directamente de un SSD NVMe.
  4. El procesador de comandos reparte el trabajo entre miles de núcleos. Cada núcleo no es más rápido que la CPU, pero hay muchísimos: son mucho más rápidos en tareas paralelizables. La VRAM supera el terabyte por segundo.
  5. Los núcleos escriben los píxeles en el framebuffer de la VRAM y el Display Engine los convierte en señal de vídeo por HDMI o DisplayPort.

Las GPU se usan hoy para cualquier cálculo paralelizable, en especial el cálculo de tensores en IA: leen pesos y datos de entrenamiento de la RAM o del disco, hacen inferencia o entrenamiento y devuelven los resultados a la RAM en lugar de a la pantalla.

Ver ejemplo 3.25: la misma imagen 4K con una GPU por PCIe de 60 GB/s

100 000 instrucciones de dibujo de 64 bits por frame; la CPU tarda 10 ciclos en construir cada una en su caché.

CálculoResultado
Datos por frame100 000⋅8 B=0.8100\,000 \cdot 8\text{ B} = 0.8 MB
Transmisión por PCIe0.8 MB/60 GB/s≈0.01330.8\text{ MB}/60\text{ GB/s} \approx 0.0133 ms
Construcción de órdenes105⋅10⋅0.25 ns=0.02510^5 \cdot 10 \cdot 0.25\text{ ns} = 0.025 ms
CPU en transmisión (30 fps)0.4 %0.4\ \%
CPU en cálculo (30 fps)0.75 %0.75\ \%
CPU total1.15 %, frente al 71.4 % sin GPU

Si la imagen no cambia, la GPU refresca la pantalla sola, sin usar el bus del sistema ni la CPU.


9. Comparación final de las técnicas

Resultados del computador de referencia (CPU a 4 GHz, disco de 4 ms de búsqueda y 600 MiB/s):

TécnicaUn bloque: CPU dedicada a E/S100 MiB: tiempo100 MiB: velocidad media
Por programa99.97 %0.197 s508 MiB/s
Interrupciones0.076 %0.218 s459 MiB/s
DMA0.05 %0.218 s459 MiB/s
PE/S0.051 %0.171 s585 MiB/s

Lecturas de la tabla:

  • Pasar de programa a interrupciones libera la CPU, pero en ráfagas largas la transferencia es más lenta por los cambios de contexto.
  • El DMA no acelera la transferencia: reduce el trabajo de CPU (un 33.6 % menos que con interrupciones en la ráfaga).
  • El PE/S es el único que se acerca a la velocidad del dispositivo, porque inicia la operación una sola vez y usa buses separados.
  • Los dispositivos dedicados (GPU) no solo transfieren: procesan, y reducen el uso de CPU de forma drástica.

Errores comunes de examen

ErrorCorrección
Restar la memoria del espacio de direcciones en E/S aisladaEn E/S aislada NDP=2nN_{DP} = 2^n; el tamaño de la memoria no interviene
Olvidar restar la memoria en E/S localizadaNDP=2n−NDMN_{DP} = 2^n - N_{DM}
Decir que una excepción es asíncronaExcepciones y trampas son síncronas; solo las interrupciones hardware son asíncronas
Confundir excepción y trampaLa trampa la inserta voluntariamente el programador (llamada al SO); la excepción es una operación no permitida
Hacer que una interrupción más prioritaria corte una RSI sin anidamientoSin anidamiento espera a que termine la RSI en curso
Atender con nivel C=AC = AHace falta C>AC > A, estrictamente
Leer mal la máscaraPasar a binario, identificar qué bit es cada línea (MSB = PI1 en los ejercicios) y recordar que 1 = permitida
Atender la petición más prioritaria aunque esté enmascaradaPrimero se filtra con la máscara y luego se elige por prioridad
Contar un solo cambio de contexto por interrupciónHay dos: al entrar y al salir
Creer que ceder el bus al DMA exige cambio de contextoNo: la CPU solo deja de usar el bus
Pensar que el DMA hace más rápida la E/SReduce el tiempo de CPU, no la duración de la transferencia
Usar la suma en un canal selectorSelector: máximo; multiplexor: suma
No comprobar la saturación del bus en un canaltT=max⁡{tbus,tcanal}t_T = \max\{t_{bus}, t_{canal}\}; si manda el bus, P=100 %P = 100\ \%
Invalidar cuando hay que limpiar (o al revés)Antes de que el DMA lea de memoria: limpiar (flush). Antes de que la CPU lea lo que escribió el DMA: invalidar
Pensar que con GPU el refresco sigue gastando bus del sistemaEl refresco sale de la VRAM; si la imagen no cambia no se usa ni el bus ni la CPU
En espera activa, no alinear al ciclo de busLa CPU detecta el estado al acabar un ciclo de bus (múltiplo de 4 ciclos de CPU en el ejemplo); con interrupciones basta el siguiente ciclo de CPU

Test de autoevaluación

1. Un computador tiene 22 líneas de dirección, una memoria de 2 Mi unidades direccionables y usa E/S localizada en memoria. Si cada periférico ocupa 8 direcciones, ¿cuántos periféricos caben como máximo?

Ver solución

ND=222N_D = 2^{22}; NDP=222−221=221N_{DP} = 2^{22} - 2^{21} = 2^{21}; periféricos =221/23=218=262 144= 2^{21}/2^3 = 2^{18} = 262\,144.

2. El mismo computador usa ahora E/S aislada con 22 líneas. ¿Cuántos periféricos de 8 direcciones caben?

Ver solución

En E/S aislada NDP=222N_{DP} = 2^{22} y la memoria no influye: 222/23=219=524 2882^{22}/2^3 = 2^{19} = 524\,288.

3. Prioridad PI1 > PI2 > ... > PI8, enmascaramiento individual con MSB = PI1 y 1 = permitida. La máscara vale 6C166C_{16} y llegan a la vez PI1, PI4 y PI5. ¿Cuál se atiende?

Ver solución

6C16=0110 110026C_{16} = 0110\,1100_2: M1=0M_1 = 0, M4=0M_4 = 0, M5=1M_5 = 1. PI1 y PI4 están enmascaradas, así que se atiende PI5.

4. Prioridad PI3 > PI2 > PI1, cada RSI dura 2 ut. Llegan PI1 en t = 0, PI2 en t = 1 y PI3 en t = 1.5. Indica cuándo termina cada RSI sin anidamiento y con anidamiento.

Ver solución

Sin anidamiento: PI1 de 0 a 2; luego la pendiente más prioritaria, PI3, de 2 a 4; luego PI2 de 4 a 6.

Con anidamiento: PI1 de 0 a 1; PI2 la interrumpe de 1 a 1.5; PI3 interrumpe a PI2 de 1.5 a 3.5; PI2 termina su 1.5 ut restante en 5; PI1 termina su 1 ut restante en 6.

RSISin anidamientoCon anidamiento
PI343.5
PI265
PI126

5. El reloj interrumpe 500 veces por segundo. Cada interrupción tiene dos cambios de contexto de 1 µs y una RSI de 3 µs. ¿Cuál es la sobrecarga?

Ver solución

500⋅(1+3+1) µs=2.5500 \cdot (1 + 3 + 1)\text{ µs} = 2.5 ms por segundo, es decir 0.25 %.

6. Un disco transfiere 512 B por interrupción, con tRI=40t_{RI} = 40 ns y una RSI de 160 ns. ¿Qué ancho de banda máximo se alcanza?

Ver solución

tI=40+160=200t_I = 40 + 160 = 200 ns; BW=512 B/200 ns=2.56BW = 512\text{ B}/200\text{ ns} = 2.56 GB/s.

7. Un canal multiplexor controla 3 dispositivos de 100 MB/s y transferir un byte ocupa el bus 4 ns. ¿Ocupación del bus y velocidad efectiva?

Ver solución

vT=300v_T = 300 MB/s, tcanal=3.33t_{canal} = 3.33 ns. tT=max⁡{4,3.33}=4t_T = \max\{4, 3.33\} = 4 ns, así que P=100 %P = 100\ \% (bus saturado) y vef=1 B/4 ns=250v_{ef} = 1\text{ B}/4\text{ ns} = 250 MB/s.

8. CPU a 1 GHz con instrucciones de 3 ciclos, bus de 64 bits por ciclo, DMA por robo de ciclos para un bloque de 8 KiB. ¿Duración, uso del bus para E/S y CPU disponible?

Ver solución

N=8192/8=1024N = 8192/8 = 1024 transferencias; cada una cuesta 3+1=43 + 1 = 4 ciclos. T=4⋅1024⋅1 ns=4.096T = 4 \cdot 1024 \cdot 1\text{ ns} = 4.096 µs. Bus en E/S: 1/4=25 %1/4 = 25\ \%; CPU disponible: 75 %75\ \%.

9. Sin coherencia por hardware, un disco escribe por DMA un bloque en un buffer que la CPU va a leer. ¿Qué debe hacer el driver?

Ver solución

Invalidar las líneas de caché del buffer, para que la CPU lea de memoria los datos nuevos y no la copia antigua de la caché.

10. Bus serie de 8 GHz (1 bit por ciclo), dispositivo a 30 cm, c=3⋅108c = 3 \cdot 10^8 m/s. Con confirmación tras cada byte, ¿qué ancho de banda efectivo se obtiene?

Ver solución

tp=0.3/(3⋅108)=1t_p = 0.3/(3 \cdot 10^8) = 1 ns; tt=8/(8⋅109)=1t_t = 8/(8 \cdot 10^9) = 1 ns; T=2tp+tt=3T = 2t_p + t_t = 3 ns. BW=8 bits/3 ns=2.67BW = 8\text{ bits}/3\text{ ns} = 2.67 Gb/s, un 33 % de los 8 Gb/s.

11. Verdadero o falso: "Las MSI eliminan el cambio de contexto".

Ver solución

Falso. Su ventaja es identificar la fuente sin líneas físicas dedicadas. El controlador de interrupciones, el cambio de contexto y la RSI siguen existiendo.

12. ¿Qué estrategia clásica de DMA no altera la velocidad de ejecución de la CPU y por qué está en desuso?

Ver solución

El DMA transparente: solo usa el bus cuando la CPU no lo necesita. Está en desuso porque exige un bus más rápido que la CPU y un único hilo accediendo a memoria, algo que no se da en las CPU multinúcleo. Lo ha sustituido el DMA por ráfagas sin parada del procesador.

David González Lombraña

Apuntes, laboratorio y proyectos de IA, Linux y redes.