Une interruption est en fait un signal appelé IRQ (demande d'interruption) envoyé par le matériel ou le logiciel.
Les interruptions permettent à des appareils tels que des claviers, des cartes série, des ports parallèles, etc. d'indiquer qu'ils nécessitent le processeur.
Une fois que le processeur reçoit une demande d'interruption, le processeur arrête temporairement l'exécution du programme en cours d'exécution et appelle un programme spécifique appelé gestionnaire d'interruption ou routine de service d'interruption.
La routine de service d'interruption ou le gestionnaire d'interruption se trouve dans la table des vecteurs d'interruption, qui se trouve à une adresse fixe en mémoire. Une fois l'interruption traitée par la CPU, l'exécution du programme précédemment interrompu reprendra.
En fait, lorsque la machine démarre, le système a déjà identifié tous les périphériques et chargé les gestionnaires d'interruptions correspondants dans la table des interruptions.
Il existe deux façons de demander l'attention du processeur :
1 Basé sur des interruptions
2 Basé sur une interrogation
Tous les systèmes d'exploitation Linux sont basés sur des pilotes d'interruption.
Lorsque nous appuyons sur une touche du clavier, le clavier indiquera au CPU qu'une touche a été enfoncée. Dans ce cas, la tension dans la ligne IRQ du clavier changera une fois, et ce changement de tension est une demande de l'appareil, ce qui équivaut à dire que l'appareil a une demande qui doit être traitée.
Fichier/proc/interrupts
Sur les machines Linux, le fichier /proc/interrupts contient des informations sur les interruptions utilisées et le nombre de fois où chaque processeur a été interrompu.
# cat /proc/interrupts
CPU0 CPU1 CPU2 CPU3
0 : 3710374484 0 0 Minuterie IO-APIC-edge
1 : 20 0 0 0 IO-APIC-edge i8042
6 ) 0 0 IO-APIC-edge rtc
9 : 0 0 0 0 acpi au niveau IO-APIC
12 : 240 0 0 0 IO-APIC-edge i8042
14 : 11200026 0 0 0 IO-APIC -edge ide0
5 1 : 61281329 0 0 0 ioc0 au niveau IO-APIC
59 : 1 0 0 0 vmci au niveau IO-APIC
67 : 19386473 0 0 0 eth0 au niveau IO-APIC 75 : 945953 40 0 0 0 IO-APIC-level eth1
NMI ) 🎜>
La sortie du fichier ci-dessus est expliquée comme suit :
● La première colonne indique le numéro d'IRQ
● Les deuxième, troisième et quatrième colonnes indiquent le nombre de fois où le cœur du processeur correspondant a été interrompu. Dans l'exemple ci-dessus, timer représente le nom de l'interruption (qui est l'horloge système). 3710374484 signifie que CPU0 a été interrompu 3710374484 fois. i8042 représente le contrôleur de clavier qui contrôle le clavier et la souris.
● Pour les interruptions comme rtc (horloge en temps réel), le CPU ne sera pas interrompu. Parce que le RTC existe dans les appareils électroniques et est utilisé pour suivre le temps.
● NMI et LOC sont des pilotes utilisés par le système et ne peuvent pas être consultés ni configurés par les utilisateurs.
Par exemple, si le processeur reçoit des interruptions du clavier et de l'horloge système en même temps, le processeur desservira d'abord l'horloge système car son numéro IRQ est 0.
● IRQ0 : horloge système (ne peut pas être modifiée)
● IRQ1 : contrôleur de clavier (ne peut pas être modifié)
● IRQ3 : contrôleur de port série du port série 2 (s'il y a le port série 4, il utilise également cette interruption)
● IRQ4 : Contrôleur de port série du port série 1 (s'il y a le port série 3, il utilise également cette interruption)
● IRQ6 : Contrôleur de disquette
● IRQ7 : Port parallèle 1. Il s'utilise avec des imprimantes ou, s'il n'y a pas d'imprimante, peut être utilisé avec n'importe quel port parallèle.
Pour un processeur comme un joystick (ou un contrôleur de jeu), il n'attend pas que l'appareil envoie une interruption. Étant donné que le joystick est principalement utilisé pour les jeux, le mouvement du joystick doit être très rapide, il est donc idéal d'utiliser l'interrogation pour détecter si l'appareil a besoin de l'attention du processeur. L'inconvénient de l'utilisation de la méthode d'interrogation est que le processeur est dans un état d'attente occupé car il vérifiera le périphérique plusieurs fois. Mais il faut savoir que sous Linux, cette manière de traiter les signaux est également indispensable.
Interruption dure
Les scénarios évoqués ci-dessus sont tous des exemples d'interruptions dures. Les interruptions matérielles sont principalement divisées en deux catégories :
1. Interruptions non masquables (NMI) : tout comme la signification littérale de ce type d'interruption, cette interruption ne peut pas être ignorée ou annulée par le CPU. NMI est envoyé sur une ligne d'interruption distincte et est généralement utilisé pour les erreurs matérielles critiques, telles que les erreurs de mémoire, les pannes de ventilateur, les pannes de capteur de température, etc.
2. Interruptions masquables : ces interruptions peuvent être ignorées ou retardées par le CPU. Ce type d'interruption sera généré lorsque la broche externe du contrôleur de cache est déclenchée, et le registre de masque d'interruption masquera ces interruptions. On peut mettre un bit à 0 pour désactiver l'interruption déclenchée sur cette broche.
Interruptions logicielles
Ces interruptions sont générées lorsque le CPU exécute des instructions (c'est-à-dire lorsque le processus est en cours d'exécution), car lors de l'exécution d'instructions, le CPU (pour être précis, il doit être dans l'opérateur du CPU ) générera lui-même une exception (l'exception ici peut également être comprise comme une interruption logicielle).
Par exemple, diviser un nombre par 0 (bien sûr, c'est impossible) entraînera une exception de division par zéro, obligeant l'ordinateur à annuler le calcul ou à afficher un message d'erreur.
Le fichier /proc/stat contient des informations statistiques sur le noyau du système et des informations sur les interruptions.
# cat /proc/stat
cpu 17028082 5536753 5081493 1735530500 42592308 90006 479750 0
cpu0 5769176 1170683 1495750 4033683 5 4 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 4 17756956 --- Sortie tronquée
Dans la ligne intr, il montre les interruptions générées depuis le démarrage du système . nombre. La première colonne représente le nombre de toutes les interruptions traitées. Chaque colonne suivante représente le nombre total d'interruptions pour une interruption spécifique.
SMP_AFFINITY
SMP fait référence à un multiprocesseur symétrique. Le fichier smp_affinity est principalement utilisé pour déterminer à quel cœur de processeur une IRQ spécifique est liée. Il existe un fichier smp_affinity dans le répertoire /proc/irq/IRQ_NUMBER/ Dans ce fichier, le cœur CPU représenté est exprimé en hexadécimal. Par exemple, le numéro d'interruption de la carte réseau est :
grep eth0 /proc/interrupts
67 : 23834931 0 0 0 IO-APIC-level eth0
cat /proc/irq /67/smp_affinity
00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
La décimale correspondant à l'hexadécimal ci-dessus est 1, ce qui signifie que toutes les interruptions liées au le pilote de la carte réseau est CPU0 fournit des services.
Nous pouvons lier l'IRQ au cœur du processeur spécifié en modifiant manuellement la valeur dans le fichier smp_affinity, ou activer le service irqbalance pour lier automatiquement l'IRQ au cœur du processeur.
IRQ Balance
Irqbalance est un utilitaire Linux, principalement utilisé pour distribuer les demandes d'interruption au cœur du processeur, contribuant ainsi à améliorer les performances. Son objectif est de rechercher un équilibre entre économie d’énergie et optimisation des performances. Vous pouvez utiliser yum pour installer :
# rpm -qa | grep irqbalance
irqbalance-0.55-15.el5
# yum search irqbalance
# yum install irqbalance.x86_64
Après le démarrage du service irqbalance, la répartition des interruptions sur le CPU est la suivante :
# cat /proc/interrupts
mais 0 minuterie de bord IO-APIC
1 : 13 0 0 0 0 IO-APIC-EDGE I8042
6 : 96 10989 470 0 IO-APIC-EDGE FLOPPY
7 : 0 0 0 0 0 IO-Edge Parport0
8 : 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge rtc
9 : 0 0 0 IO -Acpi au niveau API
12 : 109 1787 0 0 0 IO-APIC-edge i8042
15 : 99 84813914 0 0 IO-APIC- edge ide1
51 : 17371 0 46689970 ioc0 au niveau IO-APIC
67 : 1741 0 0 225409160 PCI- MSI eth0
83 : 0 0 0 PCI-MSI vmci
NMI : 0 0 1 C'est très utile pour les systèmes centraux. Parce que les interruptions ne sont généralement traitées que par le premier cœur du processeur.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!