L’unità di I/O — il confine tra CPU e mondo esterno
CPU e memoria centrale, da sole, non possono fare nulla di utile: hanno bisogno di ricevere dati dall’esterno e di restituire risultati. L’unità di Input/Output è il sottosistema che rende possibile questa comunicazione — è il confine fisico e logico tra il sistema di elaborazione e l’ambiente esterno.
Senza il sottosistema di I/O, la CPU non saprebbe come parlare con una tastiera, un disco o una scheda di rete — dispositivi con velocità, protocolli e formati completamente diversi tra loro e dal bus di sistema.
Le interfacce di I/O — il modulo intermedio
Non è possibile collegare una periferica direttamente al bus di sistema: le differenze di velocità, formato dei segnali e protocollo lo impediscono. Serve sempre un modulo intermedio: l’interfaccia di I/O (o controller di I/O).
Il buffer — soluzione al dislivello di velocità
Il problema più critico nell’I/O è il dislivello di velocità tra CPU e periferiche. La CPU opera a miliardi di cicli al secondo; una tastiera produce forse 10 caratteri al secondo. Senza un meccanismo di compensazione, la CPU dovrebbe aspettare la periferica — sprecando cicli preziosi.
Indirizzamento delle periferiche
Ogni periferica deve avere un indirizzo univoco che la CPU può usare per comunicare con essa. Esistono due approcci architetturali distinti:
; x86 — I/O isolato (port-mapped)
IN AL, 60h ; legge un byte dalla porta 0x60 (tastiera)
OUT 61h, AL ; scrive un byte sulla porta 0x61 (speaker)
; ARM — I/O memory-mapped
LDR R0, =0x40021000 ; indirizzo registro GPIO
STR R1, [R0] ; scrive sul registro — come fosse RAMModalità di comunicazione I/O
Esistono tre approcci fondamentali con cui la CPU gestisce la comunicazione con le periferiche. Differiscono per efficienza, complessità hardware e impatto sulla CPU.
Modalità 1 — I/O Programmato (Polling)
La CPU interroga periodicamente la periferica verificando il registro di stato: “sei pronta?” Se il dato non è ancora disponibile, la CPU riprova al ciclo successivo — finché non ottiene risposta positiva.
; esempio polling — attesa tastiera
poll_loop:
IN AL, STATUS_PORT ; leggi stato
TEST AL, 01h ; bit "dato pronto"?
JZ poll_loop ; no → riprova
IN AL, DATA_PORT ; sì → leggi datoModalità 2 — I/O con Interrupt
La periferica lavora in autonomia. Quando è pronta, invia un segnale di interruzione (INT) alla CPU. La CPU sospende il programma corrente, salva il contesto nello stack, esegue la routine di gestione dell’interrupt (ISR — Interrupt Service Routine), poi riprende esattamente dove si era fermata.
INT sul bus di controllo.PC e dei registri vengono salvati nello stack — il programma corrente viene “congelato”.RETI recupera dallo stack il vecchio PC — il programma principale riprende esattamente dove era stato interrotto.Modalità 3 — DMA (Direct Memory Access)
Per trasferimenti di grandi quantità di dati — un file da disco, un frame video, un pacchetto di rete — gestire ogni byte via CPU (anche con interrupt) sarebbe ancora troppo costoso. Il DMA risolve il problema: un controller hardware dedicato trasferisce i dati direttamente tra periferica e RAM, senza coinvolgere la CPU byte per byte.
Confronto tra le tre modalità
| Caratteristica | Polling | Interrupt | DMA |
|---|---|---|---|
| Coinvolgimento CPU | Continuo — aspetta attivamente | Intermittente — gestisce la ISR | Minimo — solo setup e fine |
| Efficienza CPU | Bassa — cicli sprecati | Media — dipende dalla frequenza | Alta — CPU libera durante il trasf. |
| Complessità hardware | Minima | Media — serve controller interrupt | Alta — richiede controller DMA |
| Volume dati gestito | Byte singoli | Byte / piccoli blocchi | Grandi blocchi (KB–MB) |
| Latenza risposta | Dipende dal ciclo di poll | Bassa — reazione immediata | Bassa per il blocco, alta per il primo byte |
| Applicazioni tipiche | MCU semplici, sensori lenti | Tastiera, mouse, timer | Disco, GPU, scheda di rete, audio |
Classificazione delle periferiche
Le periferiche si classificano in tre categorie in base alla direzione del flusso di dati rispetto alla CPU.
Periferiche interne vs esterne
Riepilogo
- L’unità di I/O è il sottosistema che connette CPU e memoria all’ambiente esterno — gestisce traduzione, sincronizzazione, trasferimento e indirizzamento delle periferiche
- Le interfacce di I/O (controller) sono necessarie perché le periferiche non possono connettersi direttamente al bus — sono troppo lente e usano formati incompatibili
- Ogni interfaccia espone tre registri: dato (il contenuto in transito), stato (è pronta?) e controllo (comandi dalla CPU)
- Il buffer dell’interfaccia compensa il dislivello di velocità tra CPU e periferica — la CPU scarica i dati nel buffer e torna libera
- Nell’I/O memory-mapped le periferiche occupano indirizzi nello spazio RAM — si accede con istruzioni standard. Nell’I/O isolato (x86) le periferiche hanno spazio dedicato — si usano
IN/OUT - Il polling è semplice ma spreca cicli CPU in attesa attiva
- Gli interrupt lasciano la CPU libera — la periferica la chiama solo quando è pronta; la CPU salva il contesto, esegue la ISR e riprende
- Il DMA trasferisce grandi blocchi direttamente tra periferica e RAM, con un solo interrupt finale — ideale per disco, GPU e rete
- Le periferiche si classificano in input (tastiera, sensori), output (monitor, attuatori) e memorizzazione (SSD, HDD)