Heim  >  Artikel  >  Betrieb und Instandhaltung  >  CPU-Interrupts unter dem Linux-Betriebssystem

CPU-Interrupts unter dem Linux-Betriebssystem

巴扎黑
巴扎黑Original
2017-07-24 11:05:252091Durchsuche

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.

Es gibt zwei Möglichkeiten, die Aufmerksamkeit der CPU anzufordern:
1. Basierend auf Interrupts
2. Basierend auf Abfragen

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 der Aussage entspricht, dass das Gerät eine Anforderung hat, die verarbeitet werden muss.

/proc/interrupts-Datei
Auf Linux-Maschinen 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 IO-APIC-Edge-Timer
1: 20 0 0 0 IO-APIC-Edge i8042
6 ) 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
5 1: 61281329 0 0 0 IO-APIC-Ebene ioc0
59: 1 0 0 0 IO-APIC-Ebene vmci
67: 19386473 0 0 0 IO-APIC-Ebene eth0 75 : 945953 40 0 0 0 IO-APIC-level eth1
NMI ) 🎜>
Die Ausgabe der obigen Datei wird wie folgt erklärt:
● Die erste Spalte gibt die IRQ-Nr. 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 gleichzeitig Interrupts von der Tastatur und 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 (falls vorhanden, wird auch der serielle Port 4 verwendet Dieser 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 einer CPU wie einem Joystick (oder Gamecontroller) 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.

Harter Interrupt
Die oben besprochenen 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-Interrupts
Diese Interrupts werden generiert, wenn die CPU Anweisungen ausführt (dh wenn der Prozess ausgeführt wird), da sich die CPU beim Ausführen von Anweisungen (genauer gesagt im CPU-Operator) befinden sollte ) selbst generiert eine Ausnahme (die Ausnahme kann hier auch als Soft-Interrupt verstanden werden).

Zum Beispiel führt die Division 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 Systemkern und einige Interrupt-Informationen.
# cat /proc/stat
cpu 17028082 5536753 5081493 1735530500 42592308 90006 479750 0
cpu0 5769176 1170683 1495750 4033683 54 39406374 90006 284864 0
CPU1 3714389 1451937 1186134 444082258 1084780 0 64876 0
CPU2 3791544 1471013 1211868 443988514 1056981 0 64764 0
intr. 417756956 --- Ausgabe abgeschnitten

In der Intr-Zeile werden die seit dem Systemstart generierten Interrupts angezeigt . Nummer. 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 bezieht sich auf symmetrischen Multiprozessor. Die Datei smp_affinity wird hauptsächlich verwendet, um zu bestimmen, an welchen CPU-Kern ein bestimmter IRQ gebunden ist. Es gibt eine smp_affinity-Datei im Verzeichnis /proc/irq/IRQ_NUMBER/. In dieser Datei wird der dargestellte CPU-Kern hexadezimal ausgedrückt. Die Interrupt-Nummer der Netzwerkkarte lautet beispielsweise:

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

Die dem obigen Hexadezimalwert entsprechende Dezimalzahl ist 1, was bedeutet, dass alle Interrupts zusammenhängen zum Netzwerkkartentreiber gehören CPU0 stellt Dienste bereit.

Wir können den IRQ an den angegebenen CPU-Kern binden, indem wir den Wert in der Datei smp_affinity manuell ändern, oder den irqbalance-Dienst aktivieren, um den IRQ automatisch an den CPU-Kern zu binden.

IRQ Balance
Irqbalance ist ein Linux-Dienstprogramm, das hauptsächlich zur Verteilung von Interrupt-Anfragen an den CPU-Kern verwendet wird und so zur Verbesserung der Leistung beiträgt. Ziel ist es, ein Gleichgewicht zwischen Energieeinsparung und Leistungsoptimierung zu finden. Sie können yum verwenden, um Folgendes zu installieren:
# rpm -qa | 🎜>

Nach dem Start des irqbalance-Dienstes ist die Verteilung der Interrupts auf der CPU wie folgt:
# cat /proc/interrupts
                                                                                                                                                             aber 0 IO-APIC-Edge-Timer
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 -APIC-level acpi
12: 109 1787 0 0 0 IO-APIC-edge i8042
15: 99 84813914 0 0 IO-APIC-edge ide1
51: 17371 0 46689970 IO-APIC-level ioc0
67: 1741 0 0 225409160 PCI-MSI eth0
83: 0 0 0 PCI-MSI vmci
NMI: 0 0 1 Es ist sehr nützlich für Kernsysteme. Denn normalerweise werden Interrupts nur vom ersten CPU-Kern bedient.

Das obige ist der detaillierte Inhalt vonCPU-Interrupts unter dem Linux-Betriebssystem. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn