This content is currently only available in Spanish. English translation is on the roadmap — in the meantime, here's the original.
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:
| Dificultad | En qué consiste | Consecuencia |
|---|---|---|
| Disparidad de velocidades | La 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ón | La CPU no puede quedarse esperando sin perder rendimiento |
| Heterogeneidad | Los periféricos difieren en naturaleza física, velocidad, formato de datos y forma de operar | Hace 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écnica | Quién mueve los datos | Qué hace la CPU mientras el periférico trabaja | Coste hardware |
|---|---|---|---|
| E/S controlada por programa | La CPU | Espera activa: consulta el estado una y otra vez | Mínimo |
| E/S mediante interrupciones | La CPU (dentro de la RSI) | Ejecuta otros programas; el controlador avisa con una interrupción | Medio |
| DMA | Un controlador de DMA | Solo inicia y atiende la interrupción final | Alto |
| Procesador de E/S (PE/S) | Un procesador dedicado con sus propios buses | Solo pone en marcha la operación | Más alto |
| Dispositivos dedicados (GPU, tarjeta de sonido) | El dispositivo, que además procesa los datos | Envía órdenes de alto nivel | Muy alto |
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
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:
| Registro | Funció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ón | Qué implica |
|---|---|
| Control y temporización | Coordinar 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ón | Con 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 temporal | Registros o buffers que compensan la diferencia de velocidad |
| Detección de errores | Informar 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.
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 líneas de dirección, las direcciones se reparten:
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 direcciones:
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ón | Espacio de direcciones | Instrucciones de E/S | Ventaja | Inconveniente |
|---|---|---|---|---|
| Localizada en memoria | Compartido: | Las mismas de memoria (p. ej. mov) | Sencillez, repertorio simple | Resta direcciones a la memoria |
| Aislada | Separados: cada uno | Específicas (p. ej. IN, OUT) | Toda la memoria disponible | Necesita instrucciones especiales |
| Buses independientes | Por bus o unificado | Según diseño | Gran ancho de banda | Más hardware |
El número máximo de periféricos es el espacio de E/S dividido entre las direcciones que ocupa cada uno:
Ver ejemplo 3.1: 21 líneas, memoria de 1 Mi, E/S localizada
- ; .
- direcciones.
- Periféricos de 2 direcciones: .
- Periféricos de 8 direcciones: .
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.
; con 16 direcciones por periférico: 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
INyOUT. Se mantiene por compatibilidad (teclado 0x60/0x64, COM1 0x3F8, configuración PCI 0xCF8/0xCFC).
| Rango | Uso |
|---|---|
| 0x0000_0000 a 0x0009_FFFF | RAM baja (640 KB históricos) |
| 0x000A_0000 a 0x000B_FFFF | Memoria de vídeo VGA (MMIO) |
| 0x000C_0000 a 0x000F_FFFF | ROM de opciones y BIOS |
| 0x0010_0000 a 0xBFFF_FFFF | RAM (hasta 3 GiB) |
| 0xC000_0000 a 0xFFFF_FFFF | Hueco PCI (MMIO bajo 4 GiB) |
Tamaño del hueco: direcciones 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:
- Comprobar el estado del dispositivo leyendo el RE.
- Enviar la orden de lectura o escritura al controlador.
- 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.
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ámetro | Valor | En ciclos de CPU |
|---|---|---|
| CPU | 64 bits, 4 GHz, 1 instrucción por ciclo | ns |
| Bus | 1 GHz, una palabra de 64 bits por ciclo | ns ciclos |
| Búsqueda del bloque en disco | 4 ms | 16 000 000 ciclos |
| Bloque | 4 KiB a 600 MiB/s | ciclos |
| Palabras por bloque |
Ver ejemplo 3.4: leer un bloque con espera activa
- Inicio: la CPU escribe dos registros del disco (operación y número de bloque): ciclos.
- Datos listos: ciclos.
- 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 ciclos.
- Copia: la CPU es intermediaria, así que cada palabra necesita dos operaciones de bus (leer del disco y escribir en memoria):
- Total: ciclos.
- Tiempo en el bucle de espera:
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: .
- Primer bloque: ciclos y .
- Bloques siguientes (sin búsqueda, bloques contiguos): ciclos (múltiplo de 4).
- Total:
- Velocidad media: MiB/s, por debajo de los 600 MiB/s del disco.
4.4 Ventajas e inconvenientes
| Ventajas | Inconvenientes |
|---|---|
| La técnica más sencilla, en hardware y en software | Bajo rendimiento de CPU: millones de ciclos desperdiciados; cuanto más lento el periférico, peor |
| No necesita gestión de interrupciones ni hardware dedicado | No 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ínea | Sentido | Función |
|---|---|---|
| PI (petición de interrupción) | Controlador a CPU | El controlador pide atención |
| RI (reconocimiento de interrupción) | CPU a controlador | La 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
| Tipo | Origen | Sincronía | ¿Repetible? | Ejemplo |
|---|---|---|---|---|
| Interrupción hardware | Módulo externo al procesador (controlador de E/S, reloj) | Asíncrona: puede llegar en cualquier instante | No: aparece en puntos distintos si se repite el programa | Disco con el dato listo |
| Excepción | El propio procesador, al intentar una operación no permitida | Síncrona | Sí: siempre en el mismo punto | División por cero, dirección ilegal, desbordamiento de pila |
| Trampa (trap) | Una instrucción del repertorio insertada voluntariamente por el programador | Síncrona | Sí | 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
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.
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).
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: µs.
- Con interrupciones: ue.
- Con espera activa: ue.
- Ahorro: .
Aunque la CPU no tenga otra cosa que hacer, las interrupciones ahorran energía.
5.5 Interrupciones múltiples: anidables o no
| Organización | Qué pasa si llega mientras se atiende |
|---|---|
| Un único nivel (no anidables) | espera hasta que termine, aunque sea más prioritaria. Al acabar, se atiende la pendiente de mayor prioridad |
| Múltiples niveles (anidables) | Si es estrictamente más prioritaria, interrumpe a la RSI de , 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:
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:
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.
| Intervalo | Se ejecuta | Motivo |
|---|---|---|
| 0 a 10 | Disco 1 | Máxima prioridad; impresora y CD-ROM esperan |
| 10 a 14 | CD-ROM | El pendiente más prioritario |
| 14 a 24 | Disco 2 | Interrumpe al CD-ROM (le quedan 26 ut) |
| 24 a 50 | CD-ROM | Termina sus 26 ut |
| 50 a 65 | Impresora | Última pendiente |
El CD-ROM termina en t = 50 ut.
5.6 Líneas de interrupción y controlador de interrupciones (PIC)
| Esquema | Funcionamiento | Ventaja | Inconveniente |
|---|---|---|---|
| Línea única compartida | Todos los controladores comparten una PI | Útil con muchos periféricos | La CPU sabe que hay interrupción, pero no de quién: hay que identificarla |
| Múltiples líneas | Cada controlador tiene su | Identificación directa e inmediata, menor latencia | Muchos pines y conexiones: poco escalable |
| Controlador de interrupciones (PIC) | Un circuito entre periféricos y CPU gestiona todo | Centraliza la gestión | Hardware adicional |
Funciones del PIC (Programmable Interrupt Controller):
- Identificar la fuente de la interrupción.
- Establecer las prioridades de cada periférico.
- Activar o desactivar selectivamente las peticiones.
- 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 con un bit por línea . Convenio del libro: permitida, bloqueada.
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.
| Línea | PI1 | PI2 | PI3 | PI4 | PI5 | PI6 | PI7 | PI8 |
|---|---|---|---|---|---|---|---|---|
| Máscara | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 0 |
| Petición | 1 | 1 | ||||||
| 0 | 1 |
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 . La CPU fija un nivel de prioridad de ejecución , modificable con instrucciones especiales. Regla:
Es muy cómodo para anidar: al entrar en una RSI se eleva 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 anterior.
| Comparación | Individual | Por nivel |
|---|---|---|
| Qué se configura | Un bit por línea | Un número |
| Regla | Atender si | Atender si |
| Ventaja | Control fino, línea a línea | Anidamiento 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.
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 | |
|---|---|
| Desventaja | Se pierde tiempo averiguando el origen; en el peor caso se recorren todos |
| Ventaja | Establece 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:
Si cada interrupción transfiere bytes, el ancho de banda máximo es . 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; ns; 512 B por interrupción.
- Tiempo entre interrupciones: ns.
- Tiempo para la RSI: ns.
- Velocidad de ejecución: instrucciones/s.
- Instrucciones: .
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):
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
| Ventajas | Inconvenientes |
|---|---|
| Eliminan la espera activa: la CPU hace otras tareas y se ahorra energía | Cada interrupción tiene un coste fijo de cambio de contexto; con muchas interrupciones (bloques grandes) es significativo |
| Escalables: atienden varios periféricos de velocidades distintas | Hardware 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ódicamente | La 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 ciclos.
- Coste de la interrupción: 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): .
- Total: ciclos (algo más que con espera activa).
- CPU dedicada a la E/S: 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 ciclos y, como , no hay solapamiento.
Velocidad media: 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écnica | Velocidad de transferencia | Disponibilidad de la CPU |
|---|---|---|
| Por programa | Alta (la CPU se dedica en exclusiva) | Nula durante la transferencia |
| Interrupciones | Menor (cambio de contexto y RSI) | Alta, pero la CPU sigue copiando cada dato |
| DMA | Alta, cercana a la de por programa | Alta, 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.
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"]
| Componente | Función |
|---|---|
| Contador de palabras | Palabras (o bytes) que faltan; se decrementa |
| Dirección de memoria | Dónde leer o escribir el siguiente dato; se incrementa |
| Dirección del periférico | Qué dispositivo y, en su caso, qué posición dentro de él |
| Registro de datos | Palabra en tránsito |
| Unidad de control | Genera 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
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:
| Término | Significado |
|---|---|
| Instrucciones de inicialización | |
| Tiempo en que la CPU está detenida por haber cedido el bus | |
| 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.
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
CPU Bus usado por el DMA
Ráfagas con parada ███████░░░░░░░░░░░███████ ░░░░░░░█████████████░░░░░░
Robo de ciclos █████░█████░█████░█████░ ░░░░░█░░░░░█░░░░░█░░░░░█
Transparente ████████████████████████ ░█░░█░░█░░█░░█░░█░░█░░█░
Ráfagas sin parada ████████████████████████ ░░░░░░░█████████████░░░░░░
(█ = trabajando) (█ = transfiriendo)
| Estrategia | Cómo usa el bus | Velocidad de transferencia | Efecto sobre la CPU | Uso actual |
|---|---|---|---|---|
| Ráfagas con parada | Toma el bus y no lo suelta hasta acabar el bloque | Máxima | Parada toda la ráfaga | Concepto inicial |
| Ráfagas sin parada | Ráfagas por buses dedicados; la CPU trabaja desde la caché | Máxima | Prácticamente ninguno | Lo habitual hoy (PCIe, SATA, AMBA AXI) |
| Robo de ciclos | Un ciclo por palabra y devuelve el bus | Menor | Pierde un ciclo por palabra | Microcontroladores e IoT (ARM Cortex-M), periféricos lentos (ADC, UART, SPI) |
| Transparente | Solo en ciclos en que la CPU no usa el bus | Bastante menor | Ninguno | En 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, m/s. Cada transacción: el emisor envía (IR) y espera la confirmación (TR).
- Propagación: ns.
a) Byte a byte
- ns.
- ns.
- Gb/s, solo el 33 % del máximo.
b) Ráfaga de 4 KiB
- ns.
- ns.
- Gb/s, el 99.95 %.
Ver ejemplo 3.15: robo de ciclos
CPU a 1 GHz ( ns), 5 ciclos por instrucción, bus de 32 bits por ciclo, bloque de 4 KiB.
- Transferencias: .
- Cada palabra: 5 ciclos de instrucción y 1 ciclo robado, 6 ciclos en total.
- µs.
- Bus dedicado a la E/S: ; CPU disponible: .
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: , que son ciclos.
- El primer ciclo (búsqueda) y el último (almacenar) no cuentan: ciclos, es decir µs.
- Bus en E/S: .
- 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.
| Caso | Qué falla | Qué 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 |
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
| Ventajas | Inconvenientes |
|---|---|
| Transferencias de bloques a alta velocidad | Hardware adicional (controlador de DMA) |
| La CPU solo interviene al principio y al final | Necesita arbitraje del bus y mecanismos de coherencia de caché |
| No hay cambio de contexto al ceder el bus | La 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): ciclos.
- Datos listos: ; el DMA los detecta en el siguiente ciclo de bus: .
- El DMA copia el bloque: ciclos (la CPU no participa).
- Interrupción final: ciclos (ya no incluye la copia).
- Total: ciclos.
- CPU dedicada: 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: ciclos s y MiB/s.
Lo que cambia es el trabajo de la CPU:
Mejora: 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én | Técnica |
|---|---|
| CPU | E/S mediante interrupciones |
| Controladores de E/S de sus periféricos | E/S controlada por programa |
| Memoria principal | DMA |
7.2 Arquitectura
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
| Tipo | Funcionamiento | Velocidad máxima del canal | Adecuado para |
|---|---|---|---|
| Selector | Varios dispositivos rápidos, pero en cada instante atiende a uno solo | Discos y dispositivos de alta velocidad | |
| Multiplexor | Atiende a todos a la vez, entrelazando | Muchos 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:
Si , entonces : el bus está saturado y la velocidad la limita el 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
- MB/s, ns.
- ns.
- .
b) Multiplexor
- MB/s, ns.
- ns, : el bus está saturado.
7.4 Ventajas e inconvenientes
| Ventajas | Inconvenientes |
|---|---|
| Liberan casi totalmente a la CPU: el PE/S inicializa cada transferencia, controla el estado, encadena operaciones y notifica al final | Más hardware: buses de E/S adicionales |
| Canales dedicados: menos uso del bus del sistema y más ancho de banda | Protocolos 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 .
- 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: ciclos.
- ciclos.
- Total: ciclos.
- CPU: 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:
- ciclos.
- ciclos s.
- Velocidad media: 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álculo | Resultado |
|---|---|
| Píxeles | |
| Tamaño del frame | B MB |
| Transferencias de bus | , que son ms |
| Bus por escritura de la CPU (30 fps) | |
| Bus por lectura del controlador (60 Hz) | (incluso si la imagen no cambia) |
| Bus total | |
| Cálculo de un frame | ms |
| CPU en cálculo (30 fps) | |
| CPU total (cálculo y E/S) | : 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.
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:
- La CPU envía datos a la GPU por un bus dedicado de alta velocidad (PCIe), o los deja en la RAM.
- El driver crea una lista de instrucciones; la GPU expone registros donde la CPU indica que hay trabajo.
- 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.
- 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.
- 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álculo | Resultado |
|---|---|
| Datos por frame | MB |
| Transmisión por PCIe | ms |
| Construcción de órdenes | ms |
| CPU en transmisión (30 fps) | |
| CPU en cálculo (30 fps) | |
| CPU total | 1.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écnica | Un bloque: CPU dedicada a E/S | 100 MiB: tiempo | 100 MiB: velocidad media |
|---|---|---|---|
| Por programa | 99.97 % | 0.197 s | 508 MiB/s |
| Interrupciones | 0.076 % | 0.218 s | 459 MiB/s |
| DMA | 0.05 % | 0.218 s | 459 MiB/s |
| PE/S | 0.051 % | 0.171 s | 585 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
| Error | Corrección |
|---|---|
| Restar la memoria del espacio de direcciones en E/S aislada | En E/S aislada ; el tamaño de la memoria no interviene |
| Olvidar restar la memoria en E/S localizada | |
| Decir que una excepción es asíncrona | Excepciones y trampas son síncronas; solo las interrupciones hardware son asíncronas |
| Confundir excepción y trampa | La 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 anidamiento | Sin anidamiento espera a que termine la RSI en curso |
| Atender con nivel | Hace falta , estrictamente |
| Leer mal la máscara | Pasar 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é enmascarada | Primero se filtra con la máscara y luego se elige por prioridad |
| Contar un solo cambio de contexto por interrupción | Hay dos: al entrar y al salir |
| Creer que ceder el bus al DMA exige cambio de contexto | No: la CPU solo deja de usar el bus |
| Pensar que el DMA hace más rápida la E/S | Reduce el tiempo de CPU, no la duración de la transferencia |
| Usar la suma en un canal selector | Selector: máximo; multiplexor: suma |
| No comprobar la saturación del bus en un canal | ; si manda el bus, |
| 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 sistema | El 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 bus | La 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
; ; periféricos .
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 y la memoria no influye: .
3. Prioridad PI1 > PI2 > ... > PI8, enmascaramiento individual con MSB = PI1 y 1 = permitida. La máscara vale y llegan a la vez PI1, PI4 y PI5. ¿Cuál se atiende?
Ver solución
: , , . 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.
| RSI | Sin anidamiento | Con anidamiento |
|---|---|---|
| PI3 | 4 | 3.5 |
| PI2 | 6 | 5 |
| PI1 | 2 | 6 |
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
ms por segundo, es decir 0.25 %.
6. Un disco transfiere 512 B por interrupción, con ns y una RSI de 160 ns. ¿Qué ancho de banda máximo se alcanza?
Ver solución
ns; 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
MB/s, ns. ns, así que (bus saturado) y 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
transferencias; cada una cuesta ciclos. µs. Bus en E/S: ; CPU disponible: .
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, m/s. Con confirmación tras cada byte, ¿qué ancho de banda efectivo se obtiene?
Ver solución
ns; ns; ns. 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.