Welche Rolle spielen Linux-Softirqs und Arbeitswarteschlangen?

青灯夜游
Freigeben: 2022-04-14 16:41:32
Original
2605 Leute haben es durchsucht

Die Funktion von Soft-Interrupts und Arbeitswarteschlangen unter Linux besteht darin, die Interrupt-Verarbeitung zu implementieren. Soft-Interrupts und Arbeitswarteschlangen sind die Implementierungsmechanismen der unteren Hälfte der oberen und unteren Interrupt-Mechanismen. Soft-Interrupts können nicht schlafen, blockieren oder zwischen Prozessen wechseln und können nur durch Hardware-Interrupts unterbrochen werden, während die Arbeitswarteschlange schlafen oder blockiert werden kann und zwischen verschiedenen Prozessen wechseln kann, um verschiedene Aufgaben auszuführen.

Welche Rolle spielen Linux-Softirqs und Arbeitswarteschlangen?

Die Betriebsumgebung dieses Tutorials: Linux5.9.8-System, Dell G3-Computer.

Die Rolle von Soft-Interrupts und Arbeitswarteschlangen unter Linux besteht darin, die Interrupt-Verarbeitung zu implementieren.

1. Interrupt-Konzept

Unterbrechung bezieht sich darauf, dass die CPU das laufende Programm aufgrund von internen und externen Ereignissen oder aufgrund von programmvorab vereinbarten Ereignissen während des normalen Betriebs der CPU vorübergehend stoppt und stattdessen zum B. interne oder externe Ereignisse oder vorab vereinbarte Ereignisdienste, und kehren Sie dann zurück, um das vorübergehend unterbrochene Programm nach Abschluss des Dienstes weiter auszuführen. Linux wird normalerweise in „externe Interrupts“ (auch Hardware-Interrupts genannt) und „interne Interrupts“ (auch Ausnahmen genannt) unterteilt. Im echten Adressmodus nutzt die CPU den 1 KB-Speicherplatz beginnend bei 0 im Speicher als Interrupt-Vektortabelle. Jeder Eintrag in der Tabelle belegt 4 Bytes. Im geschützten Modus entspricht die aus diesen 4-Byte-Einträgen bestehende Interrupt-Vektortabelle jedoch nicht den tatsächlichen Anforderungen. Daher besteht der Interrupt-Vektortabelleneintrag aus 8 Bytes Die Interrupt-Vektortabelle wird auch Interrupt-Deskriptortabelle (IDT) genannt. Der CPU wird ein Register (IDTR) zur Beschreibung der Interrupt-Deskriptortabelle hinzugefügt, um die Startadresse der Interrupt-Deskriptortabelle zu speichern. 2. Linux-Interrupt-Verarbeitung sind die 256 Interrupt-Beschreibungen, die im IDT-Symbol enthalten sind (entsprechend 256 Interrupt-Vektoren).

 

Die Interrupt-Vektoren 0-31 sind von Intel für die Behandlung abnormaler Ereignisse reserviert und können nicht für andere Zwecke verwendet werden. Für die Interrupt-Vektoren Nr. 0-31 muss das Betriebssystem lediglich einen Ausnahmehandler bereitstellen. Wenn eine Ausnahme auftritt, übergibt der Prozessor automatisch die Kontrolle an den Eintrag des entsprechenden Handlers und führt tatsächlich den entsprechenden Handler aus 32 Interrupt-Vektoren, die Ausnahmen behandeln, die

2.6-Version von Linux bietet nur Handler für die Interrupt-Vektoren Nr. 0-17. Die entsprechenden Handler finden Sie in der folgenden Tabelle, nämlich in der Interrupt-Vektor- und Ausnahmeereignis-Korrespondenztabelle , Interrupt-Vektoren Nr. 17-31 sind leer und unbenutzt.

. General _protection14SeitenausnahmeSeitenfehler15 (intel. reserviert)Spurious_interrupt_bug16CoprozessorfehlerCoprozessorfehler17 Ausrichtungsprüfung unterbrochenAusrichtungsprüfung
Interrupt-Vektornummer Ausnahmeereignis Linux-Handler
0 Teilungsfehler pide_error
1 DebugException Debug
2 NMI-Interrupt Nmi
3 Einzelnes Byte, int 3 Int3
4 Überlauf Überlauf
5 Grenzüberwachungsausfall Grenzen
6 Ungültiger Opcode Invalid_op
7 Gerät_nicht_verfügbar Gerät_nicht_verfügbar
8 . Doppelter_Fehler Double_fault
9 Coprozessor-Segmentüberlauf Coprocessor_segment_overrun
10 Invalid TSS Incalid_tss
11 Mi ssing segment interrupt Segment_not_present

  Die Interrupt-Vektoren 0-31 wurden reserviert, sodass insgesamt 224 Interrupt-Vektoren 32-255 verfügbar sind. Wie werden diese 224 Interrupt-Vektoren zugewiesen? In der 2.6-Version von Linux werden die anderen, mit Ausnahme von 0x80 (SYSCALL_VECTOR), der als Systemaufrufallgemeiner Eintrag verwendet wird, für externe Hardware-Interrupt-Quellen verwendet, einschließlich der 15 IRQs des programmierbaren Interrupt-Controllers 8259A; Wenn CONFIG_X86_IO_APIC nicht definiert ist, werden nur 15 der anderen 223 (außer 0x80) Interrupt-Vektoren ab dem 32. verwendet und die anderen 208 bleiben leer. 2.2 Interrupt-Anfrage

 Das Gerät sendet über die entsprechende Interrupt-Leitung einen hohen Pegel an den Interrupt-Controller, um ein Interrupt-Signal zu erzeugen, und das Betriebssystem erhält den auf dieser Interrupt-Leitung generierten Interrupt vom Statusbit des Interrupt-Controllers. Und nur wenn das Gerät die Kontrolle über eine bestimmte Interrupt-Leitung hat, kann es ein Signal an diese Interrupt-Leitung senden. Auch weil es heutzutage immer mehr Peripheriegeräte gibt, sind Interrupt-Leitungen sehr wertvolle Ressourcen und können nicht eins zu eins zugeordnet werden. Daher müssen Sie vor der Nutzung der Interrupt-Leitung die entsprechende Interrupt-Leitung beantragen. Unabhängig davon, ob die Shared-Interrupt-Methode oder ein exklusiver Interrupt verwendet wird, besteht der Anwendungsprozess darin, zunächst alle Interrupt-Leitungen zu scannen, um herauszufinden, welche nicht von anderen belegt sind, und eine davon als IRQ des Geräts auszuwählen. Zweitens beantragen Sie den entsprechenden IRQ über die Interrupt-Anwendungsfunktion. Überprüfen Sie abschließend, ob der Interrupt basierend auf dem Anwendungsergebnis ausgeführt werden kann. 2.2.2 Interrupt-bezogene Strukturen Definition von DIRQ_DESC in include/Linux/IRQ.H ined in include/linux: irq_chip chipbezogene Verarbeitungsfunktionssammlung

/**
 * struct irq_desc - interrupt descriptor
 *
 * @handle_irq:        highlevel irq-events handler [if NULL, __do_IRQ()]
 * @chip:        low level interrupt hardware access
 * @msi_desc:        MSI descriptor
 * @handler_data:    per-IRQ data for the irq_chip methods
 * @chip_data:        platform-specific per-chip private data for the chip
 *            methods, to allow shared chip implementations
 * @action:        the irq action chain
 * @status:        status information
 * @depth:        disable-depth, for nested irq_disable() calls
 * @wake_depth:        enable depth, for multiple set_irq_wake() callers
 * @irq_count:        stats field to detect stalled irqs
 * @irqs_unhandled:    stats field for spurious unhandled interrupts
 * @lock:        locking for SMP
 * @affinity:        IRQ affinity on SMP
 * @cpu:        cpu index useful for balancing
 * @pending_mask:    pending rebalanced interrupts
 * @dir:        /proc/irq/ procfs entry
 * @affinity_entry:    /proc/irq/smp_affinity procfs entry on SMP
 * @name:        flow handler name for /proc/interrupts output */struct irq_desc {
    irq_flow_handler_t    handle_irq;    struct irq_chip        *chip;    struct msi_desc        *msi_desc;    void            *handler_data;    void            *chip_data;    struct irqaction    *action;    /* IRQ action list */
    unsigned int        status;        /* IRQ status */

    unsigned int        depth;        /* nested irq disables */
    unsigned int        wake_depth;    /* nested wake enables */
    unsigned int        irq_count;    /* For detecting broken IRQs */
    unsigned int        irqs_unhandled;
    spinlock_t        lock;
#ifdef CONFIG_SMP
    cpumask_t        affinity;
    unsigned int        cpu;#endif#if defined(CONFIG_GENERIC_PENDING_IRQ) || defined(CONFIG_IRQBALANCE)
    cpumask_t        pending_mask;#endif#ifdef CONFIG_PROC_FS    struct proc_dir_entry    *dir;#endif
    const char        *name;
} ____cacheline_internodealigned_in_smp;
Nach dem Login kopieren
2.2.3 Interrupt-Anforderungsimplementierung

Mechanismus der oberen und unteren Hälfte
Wir hoffen, dass der Interrupt-Handler schnell läuft, und Ich möchte, dass mehr Arbeit erledigt wird. Diese beiden Ziele beschränken sich gegenseitig, wie man den Mechanismus der oberen und unteren Hälfte löst.

Wir haben die Interrupt-Verarbeitung halbiert. Der Interrupt-Handler ist der obere Teil – „akzeptiert den Interrupt“ und beginnt sofort mit der Ausführung, kann jedoch nur mit einem strengen Zeitlimit arbeiten. Arbeiten, die später abgeschlossen werden können, werden auf die zweite Hälfte verschoben und dann zu gegebener Zeit die zweite Hälfte zur Ausführung freigegeben. Die erste Hälfte ist einfach und schnell und beseitigt einige oder alle Unterbrechungen während der Ausführung.

 Die zweite Hälfte wird später ausgeführt und auf alle Unterbrechungen kann während der Ausführung reagiert werden. Durch dieses Design kann das System im Interrupt-Abschirmungszustand so kurz wie möglich gehalten werden, wodurch die Reaktionsfähigkeit des Systems verbessert wird. Die obere Hälfte verfügt nur über den Interrupt-Handler-Mechanismus, während die untere Hälfte über die Soft-Interrupt-Implementierung, die Tasklet-Implementierung und die Arbeitswarteschlangen-Implementierung verfügt.

Wir nutzen Netzwerkkarten, um diese beiden Hälften zu erklären. Wenn die Netzwerkkarte das Datenpaket empfängt, benachrichtigt sie den Kernel und löst einen Interrupt aus. Die sogenannte erste Hälfte besteht darin, das Datenpaket rechtzeitig in den Speicher einzulesen, um Verluste aufgrund von Verzögerungen zu verhindern. Nach dem Lesen des Speichers ist die Verarbeitung dieser Daten nicht mehr dringend. Zu diesem Zeitpunkt kann der Kernel das Programm ausführen, das vor dem Interrupt ausgeführt wurde, und die Verarbeitung von Netzwerkdatenpaketen wird der unteren Hälfte überlassen.

Prinzip der Aufteilung der oberen und unteren Hälfte  1)

Wenn eine Aufgabe sehr zeitkritisch ist, legen Sie sie zur Ausführung in den Interrupt-Handler;

 2) Wenn eine Aufgabe mit der Hardware zusammenhängt, legen Sie sie zur Ausführung in den Interrupt-Handler.

 3) Wenn eine Aufgabe sicherstellen möchte, dass sie nicht durch andere Interrupts unterbrochen wird, fügen Sie sie in den Interrupt ein Handler-Ausführung;

  4) Für alle anderen Aufgaben sollten Sie erwägen, sie zur Ausführung in der unteren Hälfte zu platzieren.

Soft Interrupt des Implementierungsmechanismus der unteren Hälfte

Als Vertreter des Mechanismus der unteren Hälfte entstand Soft Interrupt mit der Entstehung von SMP (Share-Memory-Prozessor) und ist es auch Die Basis der Tasklet-Implementierung (tasklet fügt eigentlich nur einen bestimmten Mechanismus hinzu, der auf Soft-Interrupts basiert). Softirq ist im Allgemeinen der allgemeine Begriff für "aufschiebbare Funktion", manchmal einschließlich tasklet (Leser werden gebeten, anhand des Kontexts zu schließen, ob tasklet enthalten ist, wenn sie darauf stoßen). Dies liegt daran, dass die oben vorgeschlagene Unterscheidung zwischen der oberen und unteren Hälfte erfüllt sein muss, damit zeitunabhängige Aufgaben verschoben werden können. Der Soft-Interrupt führt die verbleibenden Aufgaben aus, die ihm vom Interrupt-Handler überlassen wurden, und kann auf mehreren parallel ausgeführt werden CPU erhöht die Gesamtsystemeffizienz. Zu seinen Funktionen gehören:

a

) Es kann nicht sofort nach der Generierung ausgeführt werden und muss vorher auf die Kernel-Planung warten sein hingerichtet. Soft-Interrupts können nicht von selbst unterbrochen werden, sondern nur durch Hardware-Interrupts (oberer Teil).

 b

) kann gleichzeitig auf mehreren CPU (sogar demselben Typ) ausgeführt werden. Daher müssen Soft-Interrupts als wiedereintrittsfähige Funktionen konzipiert sein (die den gleichzeitigen Betrieb mehrerer CPU ermöglichen), sodass auch Spin-Locks zum Schutz ihrer Datenstrukturen verwendet werden müssen.

Die untere Hälfte des Implementierungsmechanismus – Tasklet

Tasklet

wird durch Soft-Interrupts implementiert, sodass es selbst auch ein Soft-Interrupt ist.

Soft-Interrupts werden abfragend verarbeitet. Wenn es sich um den letzten Interrupttyp handelt, müssen alle Interrupttypen durchlaufen werden, bevor die entsprechende Verarbeitungsfunktion endgültig ausgeführt werden kann. Um die Effizienz der Abfrage sicherzustellen, haben die Entwickler die Anzahl der Interrupts natürlich auf

32 begrenzt.

 Um die Anzahl der Interrupt-Verarbeitungen zu erhöhen und die Verarbeitungseffizienz zu verbessern, wurde der

tasklet-Mechanismus erstellt.

  Tasklet verwendet einen undifferenzierten Warteschlangenmechanismus und wird nur bei einer Unterbrechung ausgeführt, wodurch der Aufwand einer zyklischen Tabellensuche entfällt. TaskletAls neuer Mechanismus kann es offensichtlich weitere Vorteile bieten. Zu dieser Zeit wurde SMP immer beliebter, daher wurde der SMP-Mechanismus zu tasklet hinzugefügt, um sicherzustellen, dass dieselbe Art von Interrupt nur auf einer CPU ausgeführt werden kann. Im Zeitalter der Soft-Interrupts gab es diese Überlegung offensichtlich nicht. Daher kann derselbe Soft-Interrupt auf zwei CPU gleichzeitig ausgeführt werden, was wahrscheinlich zu Konflikten führt.

Zusammenfassung der Vorteile von tasklet:

  (1. ) Keine Begrenzung der Typenanzahl

  (2 ) Hohe Effizienz, keine Notwendigkeit, eine Tabellensuche durchzuführen sind wie folgt:

) Ein bestimmtes tasklet dieser Art kann nur auf einer CPU ausgeführt werden und kann nicht parallel, sondern nur seriell ausgeführt werden.

 2) Mehrere

Tasklets

unterschiedlicher Art können parallel auf mehreren CPU ausgeführt werden.  3) Soft-Interrupts werden statisch zugewiesen und können nach der Kompilierung des Kernels nicht mehr geändert werden. Aber

tasklet

ist viel flexibler und kann zur Laufzeit geändert werden (z. B. beim Hinzufügen von Modulen). Die untere Hälfte des Implementierungsmechanismus - Arbeitswarteschlange

Die oben eingeführte aufschiebbare Funktion wird im Interrupt-Kontext ausgeführt (ein Prüfpunkt des Soft-Interrupts ist die Ausstiegszeit von

do_IRQ), was verursacht hat Einige Probleme: Soft-Interrupts können nicht schlafen oder blockieren. Da sich der Interrupt-Kontext im Kernel-Status befindet und kein Prozesswechsel erfolgt, kann der Soft-Interrupt, wenn er in den Ruhezustand versetzt oder blockiert wird, diesen Status nicht verlassen, was dazu führt, dass der gesamte Kernel einfriert. Blockierungsfunktionen können jedoch nicht im Interrupt-Kontext implementiert werden und müssen im Prozesskontext ausgeführt werden, z. B. Funktionen, die auf Datenblöcke auf der Festplatte zugreifen. Daher können Blockierungsfunktionen nicht über Softirqs implementiert werden. Aber sie haben oft aufschiebbare Eigenschaften. Die oben eingeführten aufschiebbaren Funktionen werden im Interrupt-Kontext ausgeführt, was zu einigen Problemen führt, was darauf hinweist, dass sie nicht angehalten werden können, was bedeutet, dass Soft-Interrupts nicht schlafen oder blockieren können. Der Grund dafür ist, dass der Interrupt-Kontext außerhalb liegt Im Kernel-Status gibt es keine Prozessumschaltung. Wenn der Soft-Interrupt also in den Ruhezustand wechselt oder blockiert wird, kann er diesen Status nicht verlassen, was dazu führt, dass der gesamte Kernel einfriert. Daher können Blockierungsfunktionen nicht über Softirqs implementiert werden. Aber sie haben oft aufschiebbare Eigenschaften. Und da es seriell ausgeführt wird, führt eine lange Verarbeitungszeit zu einer Verzögerung bei der Reaktion anderer Interrupts. Um diese unmöglichen Aufgaben zu erledigen, entstand eine Arbeitswarteschlange, die zwischen verschiedenen Prozessen wechseln kann, um verschiedene Aufgaben zu erledigen.

  Wenn die verschobene Aufgabe Schlaf erfordert, wählen Sie die Arbeitswarteschlange. Wenn kein Schlaf erforderlich ist, wählen Sie „Soft Interrupt“ oder „Tasklet“. Arbeitswarteschlangen können im Prozesskontext ausgeführt werden und Arbeit an einen Kernel-Thread delegieren. Vereinfacht ausgedrückt handelt es sich bei der Arbeitswarteschlange um eine Gruppe von Kernel-Threads, die als Interrupt-Daemon-Threads verwendet werden. In einem Thread können mehrere Interrupts platziert werden, oder jedem Interrupt kann ein Thread zugewiesen werden. Wir verwenden die Struktur workqueue_struct zur Darstellung des Worker-Threads, der mithilfe des Kernel-Threads implementiert wird. Wie führt der Worker-Thread die verschobene Arbeit aus ——Es gibt eine solche verknüpfte Liste, die aus der Struktur work_struct besteht und diese work_struct eine Arbeit beschreibt. Sobald die Arbeit abgeschlossen ist, wird die entsprechende work_struct Das Objekt wird aus der verknüpften Liste entfernt. Wenn keine weiteren Objekte in der verknüpften Liste vorhanden sind, bleibt der Arbeitsthread im Ruhezustand. Da Arbeitswarteschlangen Threads sind, können wir alle Methoden verwenden, die in Threads verwendet werden können.

Welche Rolle spielen Soft-Interrupts und Arbeitswarteschlangen in Linux? Ja, unterbrechen Sie die Interrupt-Verarbeitung halber Implementierungsmechanismus in den oberen und unteren Mechanismen.

  1.

Soft-Interrupt ist im Allgemeinen der allgemeine Name von "aufschiebbare Funktion". Es kann nicht in den Interrupt-Kontext versetzt werden und kann nicht von selbst unterbrochen werden . Kann durch Hardware-Interrupts unterbrochen werden (oberer Teil) und kann gleichzeitig auf mehreren

CPU

laufen. Daher müssen Soft-Interrupts als wiedereintrittsfähige Funktionen konzipiert werden, sodass zum Schutz ihrer Datenstrukturen auch Spin-Locks erforderlich sind.   2.Die Funktion in der Arbeitswarteschlange befindet sich im Prozesskontext. Sie kann ruhen oder blockiert sein und zwischen verschiedenen Prozessen wechseln, um verschiedene Aufgaben auszuführen.

Weder die aufschiebbare Funktion noch die Arbeitswarteschlange können auf den Prozessraum des Benutzers zugreifen. Wenn die aufschiebbare Funktion ausgeführt wird, kann kein Prozess ausgeführt werden Userspace-Adresse.

Verwandte Empfehlungen: „Linux-Video-Tutorial

Das obige ist der detaillierte Inhalt vonWelche Rolle spielen Linux-Softirqs und Arbeitswarteschlangen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage