Gestore di interrupt
In informatica un gestore di interrupt è una routine la cui esecuzione è innescata dal verificarsi di un interrupt.
È l'evoluzione di una Interrupt Service Routine (ISR), una funzione informatica, di tipo callback, che viene avviata dal sistema operativo in risposta a un Interrupt.
Descrizione
[modifica | modifica wikitesto]Quando arriva un interrupt, la CPU deve mandare in esecuzione l'ISR predisposta ad hoc dal programmatore per quel particolare interrupt. Affinché il meccanismo dell'interruzione funzioni correttamente, è necessario che tutte le azioni svolte dall'ISR siano trasparenti rispetto al programma interrotto, cioè che al termine venga ripristinato tutto come era prima dell'interrupt, in altre parole, che la ISR sia perfettamente rientrante (attraverso l'istruzione Return). Per fare ciò bisogna che la CPU, prima di mandare in esecuzione l'ISR, faccia una commutazione di contesto, ovvero salvi tutto quello che stava facendo (cioè il suo contesto attuale), ed alla fine dell'ISR lo ripristini com'era.
L'interrupt va gestito rapidamente, e quindi non va perso tempo per salvare tutto il contesto attuale (variabili, stato del programma, l'immagine sullo schermo ecc..) ma solo quello che effettivamente verrà modificato dall'ISR. D'altra parte la CPU non sa esattamente che cosa modificherà l'ISR e quindi non può conoscere a priori cosa salvare.
Quindi quando si verifica un'interruzione l'hardware deve provvedere ad effettuare la commutazione di almeno la seguente porzione del contesto:
- Il registro PC (Program counter)
- Il registro che definisce lo stato dell'interrompibilità del processore
Nei moderni sistemi i gestori di interrupt sono divisi in due parti:
- gestori di primo livello (FLIH, First-Level Interrupt Handler)
- gestori di secondo livello (SLIH, Second-Level Interrupt Handlers)
I gestori di primo livello (FLIH) funzionano nello stesso modo delle vecchie routine di interrupt. In risposta ad un interrupt avviene una commutazione di contesto e il codice per gestire l'interrupt viene caricato in memoria ed eseguito. Il compito del FLIH, comunque, non è quello di gestire l'interrupt, bensì quello di schedulare la successiva esecuzione del gestore di secondo livello (SLIH), nonché quello di tenere traccia e di memorizzare tutte le eventuali informazioni importanti che fossero disponibili soltanto nel momento in cui si verifica l'interrupt.
Il gestore SLIH rimane nella coda pronti del sistema operativo finché, quando si rende disponibile tempo macchina del processore, arriva il suo turno di esecuzione, e può essere eseguito il codice per gestire l'evento che ha innescato l'interrupt.