Interruzione (interrupt): definizione, tipi e funzionamento
Scopri cosa sono le interruzioni (interrupt), come funzionano, i tipi e la gestione: guida chiara su segnali hardware/software e risposte immediate del processore.
Un'interruzione è un evento che fa sì che un microprocessore interrompa temporaneamente il normale flusso di esecuzione di un programma per gestire qualcosa che richiede attenzione urgente. Nella maggior parte dei casi l'interruzione viene generata perché il processore riceve un segnale dall'hardware, ma può anche essere prodotta dal software in esecuzione. Tra gli esempi più comuni ci sono la pressione di tasti su una tastiera, lo scattare di un timer incorporato, il completamento di un trasferimento di dati o qualsiasi altro evento che richiede un'azione immediata. Le interruzioni possono avvenire in qualsiasi punto durante l'esecuzione del programma, indipendentemente da dove si trovi il codice sorgente (codice sorgente).
Tipi di interruzioni
- Hardware vs Software: le interruzioni hardware provengono da dispositivi esterni (es. tastiera, controller disco), mentre quelle software sono generate da istruzioni del programma (es. chiamate di sistema, istruzione trap).
- Maskable vs Non-maskable: alcune interruzioni possono essere disabilitate (maskable) per evitare loro di interrompere il processore in certi momenti; altre (non-maskable) sono critiche e non possono essere ignorate, per esempio errori hardware gravi.
- Synchronous vs Asynchronous: le interruzioni sincrone (es. eccezioni come divisione per zero) avvengono in corrispondenza dell'istruzione in esecuzione; quelle asincrone (es. un dispositivo che segnala completamento I/O) avvengono indipendentemente dal punto di esecuzione.
- Vectored vs Non-vectored: nelle interruzioni vettorizzate il processore riceve un numero di vettore che identifica direttamente la routine da eseguire; nelle non-vettorizzate è necessario interrogarre l'hardware o il controller per determinare la sorgente.
- Eccezioni e fault: alcune interruzioni (eccezioni) sono generate dalla CPU per condizioni interne (p. es. pagina non presente, illegal instruction) e richiedono un trattamento specifico.
Come funzionano in pratica
- Rilevamento: un dispositivo o il software genera una richiesta d'interruzione (IRQ) inviando un segnale al processore o a un controller degli interrupt (es. PIC, APIC).
- Priorità e mascheramento: il controller decide, in base alle priorità e alle maschere attive, se inoltrare l'interruzione al processore o ritardarla.
- Salvataggio del contesto: quando il processore accetta l'interruzione, salva lo stato corrente (registro programma, registri di uso generale, flag) per poter riprendere l'esecuzione dopo il servizio.
- Vettore e ISR: il processore individua il vettore dell'interruzione e chiama la corrispondente routine di servizio dell'interruzione (ISR – Interrupt Service Routine), che esegue il trattamento necessario.
- Restauro e ritorno: terminata l'ISR, il processore ripristina il contesto salvato e riprende l'esecuzione del programma interrotto.
Dettagli tecnici e criteri pratici
- Durata e latenza: è buona pratica mantenere l'ISR breve per ridurre la latenza dell'intero sistema. Operazioni lunghe vanno differite a meccanismi di livello inferiore (bottom half, tasklet, thread di servizio).
- Nesting: alcune architetture permettono l'annidamento di interruzioni (un'ISR può essere a sua volta interrotta da ISR a priorità più alta); questo richiede gestione attenta del contesto e delle priorità.
- Edge vs Level triggered: gli interrupt possono essere generati su fronte (edge) o stato (level); la scelta influisce su rimbalzi (bounce) e su come rilevare interruzioni persistenti.
- Condivisione e spurious interrupts: su alcuni bus più dispositivi condividono la stessa linea IRQ; l'ISR deve quindi verificare la sorgente. Possono anche verificarsi interruzioni spurie che non corrispondono a un evento reale.
- Sicurezza del codice: le ISR non dovrebbero eseguire operazioni bloccanti o non ri-entranti. La protezione degli accessi condivisi (es. con spinlock) è importante quando si aggiornano strutture dati comuni.
Dove si usano e alternative
- Sistemi operativi: le interruzioni sono fondamentali per il multitasking, la gestione dell'I/O e le chiamate di sistema.
- Sistemi embedded e microcontrollori: usate estensivamente per reagire rapidamente a eventi esterni (sensori, timer, comunicazioni).
- DMA (Direct Memory Access): spesso usato insieme alle interruzioni: la periferica trasferisce dati autonomamente e notifica la CPU tramite un'interruzione quando il trasferimento è completo.
- Polling: alternativa in cui la CPU interroga periodicamente un dispositivo; è semplice ma inefficiente rispetto alle interruzioni per eventi rari o asincroni.
Consigli pratici per gli sviluppatori
- Mantenere le ISR rapide e minimizzare il lavoro svolto direttamente nell'interrupt context.
- Deferire lavoro non critico a thread o code di lavoro per evitare blocchi prolungati.
- Proteggere le risorse condivise e gestire correttamente l'abilitazione/disabilitazione delle interruzioni.
- Testare casi limite come interruzioni frequenti, condivisione di IRQ e interruzioni spurie.
In sintesi, le interruzioni permettono al microprocessore di reagire prontamente a eventi esterni o a condizioni interne, migliorando efficienza e reattività del sistema. Comprendere i diversi tipi di interruzione, il loro funzionamento e le buone pratiche di progettazione è essenziale per sviluppare software affidabile sia in ambito desktop sia in sistemi embedded.

Questo grafico mostra cosa succede quando viene chiamato un interrupt
Come funzionano gli interrupt
Una chiamata hardware o software per un'interruzione (conosciuta come richiesta di interruzione, o IRQ) è presa in carico da un "gestore di interruzione" o "routine di servizio di interruzione" (ISR) nel processore. Mette ciò che sta facendo in quel momento in uno stack e poi segue certe istruzioni che fanno un dato compito per conto del sistema, che non deve essere parte del programma che fa. Una volta che ha finito di seguire le istruzioni, l'ISR riprende quello che ha messo in pila e continua con quello che stava facendo prima che avvenisse l'interruzione.
Molti controllori di interrupt dei processori di oggi usano un vettore di interrupt per ordinare gli interrupt in base alla loro provenienza, tra gli altri modi. Il vettore tipicamente contiene il codice che deve essere eseguito quando avviene l'interrupt. Gli ISR sono generalmente responsabili di gestire, o "servire", l'interrupt, insieme a mantenere se stessi in ordine.
Usi degli interrupt
- Attivazione di compiti a intervalli regolari
- Manutenzione di un dispositivo esterno che può avvenire in qualsiasi momento
- Rimuovere la necessità del polling sincrono
- Attivazione di un sistema operativo (OS) per intraprendere un'azione
Domande e risposte
D: Che cos'è un'interruzione?
R: Un'interruzione è un'azione intrapresa da un microprocessore che non fa parte del programma in esecuzione, a causa di eventi esterni.
D: Cosa fa sì che gli interrupt si verifichino più spesso in un processore?
R: Gli interrupt si verificano più spesso in un processore a causa della ricezione di segnali dall'hardware.
D: Gli interrupt possono essere causati dal software?
R: Sì, gli interrupt possono essere causati anche da un software che funziona parallelamente al programma in esecuzione.
D: Elenchi alcuni esempi di eventi che possono causare un'interruzione.
R: Esempi di eventi che possono causare un'interruzione sono la pressione dei tasti su una tastiera, l'attivazione di un timer e il trasferimento di dati.
D: Un interrupt dipende dal luogo di esecuzione del programma?
R: No, gli interrupt possono verificarsi in qualsiasi momento durante l'esecuzione del programma, indipendentemente dalla posizione del programma nel codice sorgente.
D: L'interrupt è un evento auspicabile per un microprocessore?
R: Gli interrupt sono generalmente eventi indesiderati per un microprocessore, poiché interrompono l'esecuzione del programma e richiedono un'attenzione immediata.
D: Come risponde un microprocessore a un interrupt?
R: Un microprocessore sospende temporaneamente il programma in esecuzione ed esegue una routine di servizio di interrupt (ISR) per gestire l'interrupt prima di tornare al programma in esecuzione.
Cerca nell'enciclopedia