Gli interrupt sono segnali inviati tramite IRQ (Interrupt Request Line) da un hardware o software.
Gli interrupt consentono a dispositivi come tastiera, schede seriali e porte parallele di indicare che richiede l'attenzione della CPU.
Una volta che la CPU riceve la richiesta di interruzione, la CPU interromperà temporaneamente l'esecuzione del programma in esecuzione e invocherà un programma speciale chiamato Interrupt Handler o ISR (Interrupt Service Routine).
È possibile trovare la routine Interrupt Service o Interrupt Handler nella tabella Vettore di interrupt che si trova a un indirizzo fisso in memoria. Dopo che l'interrupt è stato gestito, la CPU riprende il programma interrotto.
Al momento dell'avvio, il sistema identifica tutti i dispositivi e i gestori di interrupt appropriati vengono caricati nella tabella degli interrupt.
I seguenti sono due modi per richiedere l'attenzione della CPU:
- Basato su interrupt
- Basato su polling
Tutti i sistemi operativi basati su Linux sono basati su interrupt.
Quando premiamo un tasto sulla tastiera, la tastiera dice alla CPU che è stato premuto un tasto. Ma la CPU può essere impegnata nell'elaborazione di alcune cose dalla RAM, dall'orologio di sistema, dalla scheda NIC, dal video o dal bus PCI. In tal caso, Keyboard pone una tensione sulla linea IRQ assegnata a quell'hardware, qui in questo caso [Keyboard]. Questa variazione di tensione funge da richiesta dal dispositivo che indica che il dispositivo ha una richiesta che deve essere elaborata.
/proc/interrupts File
Su una macchina Linux, il file /proc/interrupts contiene informazioni sugli interrupt in uso e quante volte il processore è stato interrotto
# cat /proc/interrupts CPU0 CPU1 CPU2 CPU3 0: 3710374484 0 0 0 IO-APIC-edge timer 1: 20 0 0 0 IO-APIC-edge i8042 6: 5 0 0 0 IO-APIC-edge floppy 7: 0 0 0 0 IO-APIC-edge parport0 8: 0 0 0 0 IO-APIC-edge rtc 9: 0 0 0 0 IO-APIC-level acpi 12: 240 0 0 0 IO-APIC-edge i8042 14: 11200026 0 0 0 IO-APIC-edge ide0 51: 61281329 0 0 0 IO-APIC-level ioc0 59: 1 0 0 0 IO-APIC-level vmci 67: 19386473 0 0 0 IO-APIC-level eth0 75: 94595340 0 0 0 IO-APIC-level eth1 NMI: 0 0 0 0 LOC: 3737150067 3737142382 3737145101 3737144204 ERR: 0 MIS: 0
Nel file sopra:
- La prima colonna è il numero IRQ.
- La seconda colonna dice quante volte il core della CPU è stato interrotto. Nell'esempio precedente il timer è il nome dell'interrupt [Orologio di sistema] e 3710374484 è il numero di volte in cui la CPU0 è stata interrotta. I8042 è il controller della tastiera che controlla le tastiere e il mouse PS/2 nei PC.
- Per interrupt come rtc [Real time clock] la CPU non è stata interrotta. Gli RTC sono presenti nei dispositivi elettronici per tenere traccia del tempo.
- NMI e LOC sono driver utilizzati sul sistema che non sono accessibili/configurati dall'utente.
Il numero IRQ determina la priorità dell'interrupt che deve essere gestito dalla CPU.
Un piccolo valore del numero IRQ significa priorità più alta.
Ad esempio, se la CPU riceve contemporaneamente l'interrupt dalla tastiera e dall'orologio di sistema. La CPU servirà per prima l'orologio di sistema poiché ha il numero IRQ 0.
- IRQ 0 — timer di sistema (non modificabile);
- IRQ 1 — controller da tastiera (non modificabile)
- IRQ 3 — controller della porta seriale per la porta seriale 2 (condivisa con la porta seriale 4, se presente);
- IRQ 4 — controller della porta seriale per la porta seriale 1 (condivisa con la porta seriale 3, se presente);
- IRQ 5:porta parallela 2 e 3 o scheda audio;
- IRQ 6 — controller del floppy disk;
- IRQ 7 — porta parallela 1. Viene utilizzata per le stampanti o per qualsiasi porta parallela se non è presente una stampante.
Per dispositivi come joystick, la CPU non attende che il dispositivo invii un interrupt. Poiché il joystick utilizzato per i giochi e il movimento del joystick sarà veloce, sarà l'ideale utilizzare il polling e verificare se il dispositivo ha bisogno di attenzione. Lo svantaggio di questo metodo è che la CPU può entrare in attesa, controllando il dispositivo molte volte.
In una nota correlata, è anche essenziale gestire correttamente i segnali in Linux.
Interruzioni hardware
Tutti gli scenari sopra discussi sono esempi di interrupt hardware.
Gli interrupt di processo sono ulteriormente classificati in due categorie principali:
- Interrupt non mascherabili [NMI]:come suggerisce il nome, questi tipi di interrupt non possono essere ignorati o soppressi dalla CPU. Gli MNI vengono inviati su una linea di interrupt separata ed è generalmente utilizzato per errori hardware critici come errori di memoria, trappole hardware che indicano guasto della ventola, guasto del sensore di temperatura ecc.
- Interrupt mascherabili:questi interrupt possono essere ignorati o ritardati dalla CPU. Il registro della maschera di interruzione maschera gli interrupt attivati sui pin esterni del controller della cache. Impostando un bit scrivendo uno 0, disabilita l'attivazione dell'interrupt sul pin
Interruzioni software
Questi interrupt vengono generati quando la CPU esegue un'istruzione che può causare una condizione di eccezione nella CPU stessa [unità ALU].
Ad esempio, dividere un numero per zero che non è possibile, porterà all'eccezione di divisione per zero, facendo sì che il computer abbandoni il calcolo o visualizzi un messaggio di errore.
Il file /proc/stat è anche una parte del file system /proc, che contiene informazioni sulle statistiche del kernel di sistema, contiene anche alcune informazioni sugli interrupt.
# cat /proc/stat cpu 17028082 5536753 5081493 1735530500 42592308 90006 479750 0 cpu0 5769176 1170683 1495750 403368354 39406374 90006 284864 0 cpu1 3714389 1451937 1186134 444082258 1084780 0 64876 0 cpu2 3791544 1471013 1211868 443988514 1056981 0 64764 0 cpu3 3752971 1443119 1187740 444091373 1044172 0 65244 0 intr 417756956 --- Output Truncated
La riga intr mostra il conteggio dell'interrupt servito dal momento dell'avvio. La prima colonna è il totale di tutti gli interrupt gestiti. Ogni colonna successiva è il totale di un particolare interrupt.
SMP_AFFINITY
La multielaborazione simmetrica è l'elaborazione di programmi da parte di più processori.
Il file smp_affinity contiene il valore di affinità dell'interrupt per un numero IRQ. Il file smp_affinity associato a ciascun numero IRQ è memorizzato nel file /proc/irq/IRQ_NUMBER/smp_affinity. Il valore nel file è memorizzato in una maschera di bit esadecimale che rappresenta tutti i core della CPU nel sistema. smp_affinity funziona per dispositivi con driver di dispositivo abilitati IO-APIC.
Ad esempio, la voce smp_affinity per il driver Ethernet è mostrata di seguito:
grep eth0 /proc/interrupts 67: 23834931 0 0 0 IO-APIC-level eth0
Il numero IRQ per eth0 è 67 e il file smp_affinity corrispondente si trova in:
cat /proc/irq/67/smp_affinity 00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
L'equivalente decimale per il valore '000000001' è '1'. cioè Tutti gli interrupt relativi al driver Ethernet saranno serviti da CPU0.
Possiamo modificare manualmente l'affinità del processore modificando i valori nel file smp_affinity per un particolare controller o utilizzando irqbalance.
Saldo IRQ
Irqbalance è un'utilità Linux che distribuisce gli interrupt sui core del processore nel sistema del computer, contribuendo a migliorare le prestazioni.
L'obiettivo di Irqbalance è trovare un equilibrio tra risparmio energetico e prestazioni ottimali.
Se irqbalance non è installato sul tuo sistema, installalo usando yum come mostrato di seguito.
# rpm -qa | grep irqbalance irqbalance-0.55-15.el5 # yum search irqbalance # yum install irqbalance.x86_64
Avvia il servizio irqbalance:
service irqbalance start
Quello che segue è un esempio di output da una macchina Linux in cui è installato irqbalance. Abbiamo potuto vedere che gli interrupt ora vengono distribuiti tra le CPU.
# cat /proc/interrupts CPU0 CPU1 CPU2 CPU3 0: 950901695 0 0 0 IO-APIC-edge timer 1: 13 0 0 0 IO-APIC-edge i8042 6: 96 10989 470 0 IO-APIC-edge floppy 7: 0 0 0 0 IO-APIC-edge parport0 8: 1 0 0 0 IO-APIC-edge rtc 9: 0 0 0 0 IO-APIC-level acpi 12: 109 1787 0 0 IO-APIC-edge i8042 15: 99 84813914 0 0 IO-APIC-edge ide1 51: 17371 0 46689970 0 IO-APIC-level ioc0 67: 1741 0 0 225409160 PCI-MSI eth0 83: 0 0 0 0 PCI-MSI vmci NMI: 0 0 0 0 LOC: 950902917 950903742 950901202 950901400 ERR: 0 MIS: 0
Irqbalance è particolarmente utile su sistemi con processori multi-core, poiché gli interrupt verranno generalmente gestiti solo dal primo core.