Maison  >  Article  >  Tutoriel système  >  Interruptions du processeur Linux : événements asynchrones et mécanismes de gestion courants

Interruptions du processeur Linux : événements asynchrones et mécanismes de gestion courants

WBOY
WBOYavant
2024-02-11 15:06:40678parcourir

L'interruption Linux est un événement asynchrone qui peut survenir à tout moment et peut interrompre le flux d'exécution normal du programme. Afin de gérer ces interruptions, le noyau Linux fournit un mécanisme général de gestion des interruptions.

Linux CPU 中断:异步事件和通用处理机制

Une interruption est en fait un signal appelé IRQ (demande d'interruption) envoyé par le matériel ou le logiciel.

Les interruptions permettent aux appareils tels que les claviers, les cartes série, les 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 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, et cette table des vecteurs d'interruption est située à 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 appareils et chargé les gestionnaires d'interruptions correspondants dans la table d'interruptions.

Voici deux manières de demander l'attention du processeur :
1. Basé sur les interruptions
2. Basé sur un sondage

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 indique 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.

/proc/fichier interruptions
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  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

La sortie du fichier ci-dessus est expliquée comme suit :
● La première colonne indique le numéro 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 sont pas accessibles ni configurés par les utilisateurs.

Le numéro IRQ détermine la priorité qui doit être traitée par le CPU. Plus le numéro IRQ est petit, plus la priorité est élevée.
Par exemple, si le processeur reçoit des interruptions du clavier et de l'horloge système, le processeur gérera 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 existe un port série 3, il utilise également cette interruption)
● IRQ5 : Port parallèle 2 et 3 ou carte son
● 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 le CPU d'un joystick (ou d'une manette 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 façon de gérer les signaux est également essentielle.

Interruption dure
Les scénarios évoqués ci-dessus sont tous des exemples d’interruptions matérielles. Les interruptions dures 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 processeur. 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.

Interruption douce
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 des instructions, le CPU (en particulier, l'unité arithmétique du CPU) générera lui-même une exception (cette exception peut également être comprise comme des interruptions douces).

Par exemple, diviser un nombre par 0 (bien sûr, c'est impossible) provoquera 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 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 ligne intr indique le nombre d'interruptions générées depuis le démarrage du système. 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 particulière.

SMP_AFFINITY
SMP是指对称多处理器。smp_affinity文件主要用于某个特定IRQ要绑定到哪个CPU核心上。在/proc/irq/IRQ_NUMBER/目录下都有一个smp_affinity文件,这个文件中,所表示的CPU核心以十六进制来表示的。例如,网卡的中断号是:

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

上面的十六进制对应的十进制是1,也就是说所有的和网卡驱动相关的中断都是有CPU0来提供服务的。

我们可以通过手动改变smp_affinity文件中的值来将IRQ绑定到指定的CPU核心上,或者启用irqbalance服务来自动绑定IRQ到CPU核心上。

IRQ Balance
Irqbalance是一个linux的实用程序,它主要是用于分发中断请求到CPU核心上,有助于性能的提升。它的目的是寻求省电和性能优化之间的平衡。你可以使用yum进行安装:

 \# rpm -qa | grep irqbalance 
irqbalance-0.55-15.el5 
\# yum search irqbalance 
\# yum install irqbalance.x86_64

启动irqbalance服务后,中断在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对于包含多个核心的系统来说是非常有用的。因为通常中断只被第一个CPU核心服务。以上就是教程网为各位朋友分享的Linu系统相关内容。想要了解更多Linux相关知识记得关注公众号“Linux”,或扫描下方二维码进行关注,更多干货等着你 !

Linux CPU 中断:异步事件和通用处理机制

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer