Heim  >  Artikel  >  System-Tutorial  >  Linux-CPU-Interrupts: Asynchrone Ereignisse und allgemeine Verarbeitungsmechanismen

Linux-CPU-Interrupts: Asynchrone Ereignisse und allgemeine Verarbeitungsmechanismen

WBOY
WBOYnach vorne
2024-02-11 15:06:40677Durchsuche

Linux-Interrupt ist ein asynchrones Ereignis, das jederzeit auftreten und den normalen Ausführungsfluss des Programms unterbrechen kann. Um diese Interrupts zu verarbeiten, stellt der Linux-Kernel einen allgemeinen Mechanismus zur Interrupt-Behandlung bereit.

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

Ein Interrupt ist eigentlich ein Signal namens IRQ (Interrupt Request), das von Hardware oder Software gesendet wird.

Interrupts ermöglichen es Geräten wie Tastaturen, seriellen Karten, parallelen Ports usw., anzuzeigen, dass sie die CPU benötigen.

Sobald die CPU eine Interrupt-Anfrage empfängt, stoppt die CPU vorübergehend die Ausführung des laufenden Programms und ruft ein bestimmtes Programm auf, das als Interrupt-Handler oder Interrupt-Service-Routine bezeichnet wird.

Die Interrupt-Serviceroutine oder der Interrupt-Handler finden Sie in der Interrupt-Vektortabelle, die sich an einer festen Adresse im Speicher befindet. Nachdem der Interrupt von der CPU verarbeitet wurde, wird die Ausführung des zuvor unterbrochenen Programms fortgesetzt.

Tatsächlich hat das System beim Start der Maschine bereits alle Geräte identifiziert und die entsprechenden Interrupt-Handler in die Interrupt-Tabelle geladen.

Hier gibt es zwei Möglichkeiten, die Aufmerksamkeit der CPU anzufordern:
1. Interruptbasiert
2. Basierend auf Umfragen

Alle Linux-Betriebssysteme basieren auf Interrupt-Treibern.

Wenn wir eine Taste auf der Tastatur drücken, teilt die Tastatur der CPU mit, dass eine Taste gedrückt wurde. In diesem Fall ändert sich die Spannung in der IRQ-Leitung der Tastatur einmal, und diese Spannungsänderung ist eine Anforderung des Geräts, was gleichbedeutend damit ist, dass das Gerät eine Anforderung hat, die verarbeitet werden muss.

/proc/interrupts-Datei
Auf Linux-Rechnern enthält die Datei /proc/interrupts Informationen darüber, welche Interrupts verwendet werden und wie oft jeder Prozessor unterbrochen wurde.

\# 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

Die Ausgabe der obigen Datei wird wie folgt erklärt:
● Die erste Spalte gibt die IRQ-Nummer an
● Die zweite, dritte und vierte Spalte geben an, wie oft der entsprechende CPU-Kern unterbrochen wurde. Im obigen Beispiel stellt der Timer den Interrupt-Namen dar (der die Systemuhr ist). 3710374484 bedeutet, dass CPU0 3710374484 Mal unterbrochen wurde. i8042 stellt den Tastaturcontroller dar, der Tastatur und Maus steuert.
● Bei Interrupts wie RTC (Echtzeituhr) wird die CPU nicht unterbrochen. Weil RTC in elektronischen Geräten vorhanden ist und zur Zeiterfassung verwendet wird.
● NMI und LOC sind vom System verwendete Treiber, auf die Benutzer nicht zugreifen und sie nicht konfigurieren können.

Die IRQ-Nummer bestimmt die Priorität, die von der CPU verarbeitet werden muss. Je kleiner die IRQ-Nummer, desto höher die Priorität.
Wenn die CPU beispielsweise Interrupts sowohl von der Tastatur als auch von der Systemuhr empfängt, bedient die CPU zuerst die Systemuhr, da ihre IRQ-Nummer 0 ist.
● IRQ0: Systemuhr (kann nicht geändert werden)
● IRQ1: Tastaturcontroller (kann nicht geändert werden)
● IRQ3: Serieller Port-Controller des seriellen Ports 2 (wenn es einen seriellen Port 4 gibt, verwendet er auch diesen Interrupt)
● IRQ4: Serieller Port-Controller des seriellen Ports 1 (wenn es einen seriellen Port 3 gibt, verwendet er auch diesen Interrupt)
● IRQ5: Paralleler Port 2 und 3 oder Soundkarte
● IRQ6: Diskettencontroller
● IRQ7: Paralleler Port 1. Es wird mit Druckern verwendet oder kann, wenn kein Drucker vorhanden ist, mit jedem parallelen Anschluss verwendet werden.

Bei der CPU auf einem Joystick (oder Gamepad) wartet sie nicht darauf, dass das Gerät einen Interrupt sendet. Da der Joystick hauptsächlich für Spiele verwendet wird, muss die Bewegung des Joysticks sehr schnell sein. Daher ist es ideal, mithilfe von Abfragen zu ermitteln, ob das Gerät die Aufmerksamkeit der CPU benötigt. Der Nachteil der Abfragemethode besteht darin, dass sich die CPU in einem ausgelasteten Wartezustand befindet, da die CPU das Gerät mehrmals überprüft. Es ist jedoch zu beachten, dass diese Art der Signalverarbeitung auch unter Linux unerlässlich ist.

Harte Unterbrechung
Die oben diskutierten Szenarien sind alles Beispiele für harte Interrupts. Harte Interrupts werden hauptsächlich in zwei Kategorien unterteilt:
1. Nicht maskierbare Interrupts (NMI): Genau wie die wörtliche Bedeutung dieses Interrupt-Typs kann dieser Interrupt von der CPU nicht ignoriert oder abgebrochen werden. NMI wird auf einer separaten Interrupt-Leitung gesendet und normalerweise bei kritischen Hardwarefehlern wie Speicherfehlern, Lüfterfehlern, Temperatursensorfehlern usw. verwendet.
2. Maskierbare Interrupts: Diese Interrupts können von der CPU ignoriert oder verzögert werden. Diese Art von Interrupt wird generiert, wenn der externe Pin des Cache-Controllers ausgelöst wird, und das Interrupt-Maskenregister maskiert solche Interrupts. Wir können ein Bit auf 0 setzen, um den an diesem Pin ausgelösten Interrupt zu deaktivieren.

Soft Interrupt
Diese Interrupts werden generiert, wenn die CPU Anweisungen ausführt (dh wenn der Prozess ausgeführt wird), da die CPU (insbesondere die Recheneinheit in der CPU) selbst beim Ausführen von Anweisungen eine Ausnahme generiert (diese Ausnahmen können auch verstanden werden). als Soft-Interrupts).

Zum Beispiel führt das Teilen einer Zahl durch 0 (das ist natürlich unmöglich) zu einer Division durch Null-Ausnahme, die dazu führt, dass der Computer die Berechnung abbricht oder eine Fehlermeldung anzeigt.

Die Datei /proc/stat enthält einige statistische Informationen über den Systemkernel und einige Interrupt-Informationen.

\# 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

Die Intr-Zeile zeigt die Anzahl der seit dem Systemstart generierten Interrupts. Die erste Spalte stellt die Anzahl aller bedienten Interrupts dar. Jede nachfolgende Spalte stellt die Gesamtzahl der Interrupts für einen bestimmten Interrupt dar.

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 中断:异步事件和通用处理机制

Das obige ist der detaillierte Inhalt vonLinux-CPU-Interrupts: Asynchrone Ereignisse und allgemeine Verarbeitungsmechanismen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:lxlinux.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen