Eine eingehende Analyse der Interrupts von Linux-Gerätetreibern (1) (3)
6. Nichtwiedereintritt von Interrupt-Handlern
Im vorherigen Abschnitt haben wir erwähnt, dass es manchmal notwendig ist, Interrupts zu maskieren, aber warum sollten wir diesen Interrupt maskieren? Dies liegt nicht daran, dass es technisch unmöglich ist, dieselbe Interrupt-Routine zu parallelisieren, sondern an Managementüberlegungen. Der Grund, warum neue Interrupts von demselben IRQ während der Interrupt-Verarbeitung blockiert werden müssen, liegt darin, dass der Interrupt-Handler nicht wiedereintrittsfähig ist, sodass derselbe Interrupt-Handler nicht parallel ausgeführt werden kann. Hier geben wir ein Beispiel. Anhand dieses Beispiels können wir erkennen, dass die Treibersperre wahrscheinlich auftritt, wenn ein Interrupt-Handler parallelisiert werden kann. Wenn der Treiber gesperrt ist, stürzt Ihr Betriebssystem nicht unbedingt ab, aber das vom gesperrten Treiber unterstützte Gerät kann nicht mehr verwendet werden – wenn der Gerätetreiber ausfällt, stirbt auch das Gerät.
Das Ereignis, das PS1 auslöst, führt dazu, dass A1 einen Interrupt generiert, dann liest B1 die vorhandenen Daten in R1 und dann schreibt der Code C1 Daten in R2. Das Ereignis, das PS2 auslöst, veranlasst A2, einen Interrupt zu generieren, dann löscht B2 die Daten in R1 und dann liest C2 die Daten in R2.
Wenn PS1 zuerst generiert wird und wenn PS2 generiert wird, generiert A2 einen Interrupt und unterbricht PS2 (hängt dann am Ende der Task-Warteschlange). R1 wurden gelöscht. Wenn PS2 zu C2 läuft, wird C2 hier angehalten, da C1 noch keine Daten auf R2 geschrieben hat, und PS2 schläft auf Code C2, bis es durch ein Signal geweckt wird, wenn Daten lesbar sind. Dies liegt daran, dass die Daten in R1, die B2 in PS1 ursprünglich lesen wollte, von B2 in PS2 gelöscht wurden, sodass die PS1-Seite auf B1 ruht, bis sie durch ein Signal geweckt wird, wenn Daten zum Lesen vorhanden sind. Auf diese Weise wird das Ereignis, das PS1 und PS2 aufweckt, nie eintreten, sodass PS1 und PS2 gesperrt sind.
Da sich der Gerätetreiber mit den Geräteregistern befassen muss, ist es schwierig, wiedereintrittsfähigen Code zu schreiben, da es sich bei den Geräteregistern um globale Variablen handelt. Daher besteht der einfachste Weg darin, die Parallelität der Interrupt-Handler desselben Geräts zu verhindern, dh der Interrupt-Handler des Geräts ist nicht wiedereintrittsfähig.
Eines muss klar sein: Im Linux-Kernel nach Version 2.0 sind alle oberen Hälften unterbrechungsfrei (die Operationen der oberen Hälfte sind atomar); die unteren Hälften verschiedener Geräteabschnitte können sich gegenseitig unterbrechen, aber Eine bestimmte untere Hälfte kann nicht allein unterbrochen werden (d. h. dieselbe untere Hälfte kann nicht parallel sein).
Da Interrupt-Handler nicht wiedereintrittsfähig sein müssen, müssen sich Programmierer keine Gedanken über das Schreiben von wiedereintrittsfähigem Code machen. Meiner Erfahrung nach ist das Schreiben wiedereintrittsfähiger Gerätetreiber möglich, aber das Schreiben wiedereintrittsfähiger Interrupt-Handler ist sehr selten und fast unmöglich.
7. Vermeiden Sie das Auftreten von Race Conditions
Wir alle wissen, dass es beim Eintreten einer Race Condition zu einem Deadlock kommen kann und in schweren Fällen das gesamte System gesperrt werden kann. Vermeiden Sie daher unbedingt Rennbedingungen. Ich werde hier nicht viel sagen, aber jeder muss nur auf eines achten: Die meisten durch Interrupts verursachten Race Conditions werden durch den Kernel-Prozess verursacht, bei dem Interrupts in den Ruhezustand versetzt werden. Daher müssen Sie bei der Implementierung von Interrupts darauf achten, den Prozess in den Ruhezustand zu versetzen. Bei Bedarf können Sie cli, sti oder save_flag, restart_flag verwenden. Spezifische Einzelheiten entnehmen Sie bitte dem in diesem Artikel genannten Nachschlagewerk.
8. Implementierung
Wie die Interrupt-Routine des Treibers implementiert wird, bleibt den Lesern überlassen. Solange Sie den Quellcode der kurzen Routine sorgfältig lesen und die Regeln zum Schreiben von Treiber-Interrupt-Routinen verstehen, können Sie Ihre eigene Interrupt-Routine schreiben. Solange die Konzepte korrekt sind und Ihr Code nach den richtigen Regeln geschrieben ist, ist es sinnvoll. Ich betone immer, dass Konzepte an erster Stelle stehen und wie viel Code geschrieben werden kann, zweitrangig ist. Wir müssen die richtigen Konzepte haben, um richtig denken zu können.
(T114)
Das Obige ist die ausführliche Analyse von Linux-Gerätetreiber-Interrupts (1) (3). Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www .php.cn)!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Die Schritte zum Starten von Apache sind wie folgt: Installieren Sie Apache (Befehl: sudo apt-Get-Get-Installieren Sie Apache2 oder laden Sie ihn von der offiziellen Website herunter). (Optional, Linux: sudo systemctl

Wenn der Port -80 -Port der Apache 80 besetzt ist, lautet die Lösung wie folgt: Finden Sie den Prozess, der den Port einnimmt, und schließen Sie ihn. Überprüfen Sie die Firewall -Einstellungen, um sicherzustellen, dass Apache nicht blockiert ist. Wenn die obige Methode nicht funktioniert, konfigurieren Sie Apache bitte so, dass Sie einen anderen Port verwenden. Starten Sie den Apache -Dienst neu.

In diesem Artikel wird beschrieben, wie die SSL -Leistung von NGINX -Servern auf Debian -Systemen effektiv überwacht wird. Wir werden Nginxexporter verwenden, um Nginx -Statusdaten in Prometheus zu exportieren und sie dann visuell über Grafana anzeigen. Schritt 1: Konfigurieren von Nginx Erstens müssen wir das Modul stub_status in der nginx -Konfigurationsdatei aktivieren, um die Statusinformationen von Nginx zu erhalten. Fügen Sie das folgende Snippet in Ihre Nginx -Konfigurationsdatei hinzu (normalerweise in /etc/nginx/nginx.conf oder deren inklusive Datei): location/nginx_status {stub_status

In diesem Artikel werden zwei Methoden zur Konfiguration eines Recycling -Bin in einem Debian -System eingeführt: eine grafische Schnittstelle und eine Befehlszeile. Methode 1: Verwenden Sie die grafische Schnittstelle Nautilus, um den Dateimanager zu öffnen: Suchen und starten Sie den Nautilus -Dateimanager (normalerweise als "Datei") im Menü Desktop oder Anwendungen. Suchen Sie den Recycle Bin: Suchen Sie nach dem Ordner recycelner Behälter in der linken Navigationsleiste. Wenn es nicht gefunden wird, klicken Sie auf "Andere Speicherort" oder "Computer", um sie zu suchen. Konfigurieren Sie Recycle Bin-Eigenschaften: Klicken Sie mit der rechten Maustaste auf "Recycle Bin" und wählen Sie "Eigenschaften". Im Eigenschaftenfenster können Sie die folgenden Einstellungen einstellen: Maximale Größe: Begrenzen Sie den im Recycle -Behälter verfügbaren Speicherplatz. Aufbewahrungszeit: Legen Sie die Erhaltung fest, bevor die Datei automatisch im Recyclingbehälter gelöscht wird

In Debian -Systemen werden Readdir -Systemaufrufe zum Lesen des Verzeichnisinhalts verwendet. Wenn seine Leistung nicht gut ist, probieren Sie die folgende Optimierungsstrategie aus: Vereinfachen Sie die Anzahl der Verzeichnisdateien: Teilen Sie große Verzeichnisse so weit wie möglich in mehrere kleine Verzeichnisse auf und reduzieren Sie die Anzahl der gemäß Readdir -Anrufe verarbeiteten Elemente. Aktivieren Sie den Verzeichnis -Inhalt Caching: Erstellen Sie einen Cache -Mechanismus, aktualisieren Sie den Cache regelmäßig oder bei Änderungen des Verzeichnisinhalts und reduzieren Sie häufige Aufrufe an Readdir. Speicher -Caches (wie Memcached oder Redis) oder lokale Caches (wie Dateien oder Datenbanken) können berücksichtigt werden. Nehmen Sie eine effiziente Datenstruktur an: Wenn Sie das Verzeichnis -Traversal selbst implementieren, wählen Sie effizientere Datenstrukturen (z.

Befolgen Sie die folgenden Schritte, um den Apache -Server neu zu starten: Linux/MacOS: Führen Sie sudo systemCTL RESTART APache2 aus. Windows: Net Stop Apache2.4 und dann Net Start Apache2.4 ausführen. Führen Sie Netstat -a | Findstr 80, um den Serverstatus zu überprüfen.

Obwohl in den Suchergebnissen "Debiansniffer" und ihre spezifische Anwendung bei der Netzwerküberwachung nicht direkt erwähnt werden, können wir schließen, dass sich "Sniffer" auf ein Tool für Netzwerkpaket -Capture -Analyse bezieht, und seine Anwendung im Debian -System unterscheidet sich nicht wesentlich von anderen Linux -Verteilungen. Die Netzwerküberwachung ist entscheidend für die Aufrechterhaltung der Netzwerkstabilität und die Optimierung der Leistung, und Tools für die Analyse der Paketerfassung spielen eine Schlüsselrolle. Im Folgenden werden die wichtige Rolle von Tools zur Netzwerküberwachung (z. B. in Debian-Systemen ausgeführt) erklärt: Der Wert von Netzwerküberwachungstools: Schneller Fehlerstandort: Echtzeitüberwachung von Netzwerkmetriken, wie z.

In diesem Leitfaden werden Sie erfahren, wie Sie Syslog in Debian -Systemen verwenden. Syslog ist ein Schlüsseldienst in Linux -Systemen für Protokollierungssysteme und Anwendungsprotokollnachrichten. Es hilft den Administratoren, die Systemaktivitäten zu überwachen und zu analysieren, um Probleme schnell zu identifizieren und zu lösen. 1. Grundkenntnisse über syslog Die Kernfunktionen von Syslog umfassen: zentrales Sammeln und Verwalten von Protokollnachrichten; Unterstützung mehrerer Protokoll -Ausgabesformate und Zielorte (z. B. Dateien oder Netzwerke); Bereitstellung von Echtzeit-Protokoll- und Filterfunktionen. 2. Installieren und Konfigurieren von Syslog (mit Rsyslog) Das Debian -System verwendet standardmäßig Rsyslog. Sie können es mit dem folgenden Befehl installieren: sudoaptupdatesud
