Welche Beziehung besteht zwischen Systemaufrufen, Nachrichtenübergabe und Interrupts?


15

Ich lese den Wikipedia-Artikel zum Prozessmanagement . Mein Fokus liegt auf Linux. Ich kann die Beziehung und Unterschiede zwischen Systemaufruf, Nachrichtenübergabe und Unterbrechung in ihren Konzepten und Zwecken nicht herausfinden. Sind sie alle für Prozesse, um Anfragen an den Kernel für Ressourcen und Services zu richten?

Einige Zitate aus dem Artikel und einige andere:

  1. Es gibt zwei Möglichkeiten, wie ein Betriebssystem während der Ausführung eines Programms die Kontrolle über den Prozessor wiedererlangen kann, damit das Betriebssystem die Zuordnung aufheben oder die Zuordnung aufheben kann:

    1. Der Prozess gibt einen Systemaufruf aus (manchmal als Software-Interrupt bezeichnet). Beispielsweise wird bei einer E / A-Anforderung der Zugriff auf eine Datei auf der Festplatte angefordert.
    2. Ein Hardware-Interrupt tritt auf. Zum Beispiel wurde eine Taste auf der Tastatur gedrückt oder ein Timer läuft ab (wird beim präventiven Multitasking verwendet).
  2. Es gibt zwei Techniken, mit denen ein Programm, das im Benutzermodus ausgeführt wird, die Dienste des Kernels anfordern kann:

    * System call
    * Message passing
    
  3. Ein Interrupt ist ein asynchrones Signal, das die Notwendigkeit von Aufmerksamkeit anzeigt, oder ein synchrones Ereignis in der Software, das die Notwendigkeit einer Änderung der Ausführung anzeigt.

    Ein Hardware-Interrupt veranlasst den Prozessor, seinen Ausführungsstatus zu speichern und die Ausführung eines Interrupt-Handlers zu starten. Software-Interrupts werden in der Regel als Befehle im Befehlssatz implementiert, die einen Kontextwechsel zu einem Interrupt-Handler ähnlich einem Hardware-Interrupt verursachen.


2
Sehr gute Frage!
Stéphane Gimenez

Antworten:


12
  1. Alle modernen Betriebssysteme unterstützen Multitasking. Dies bedeutet, dass das System mehrere Prozesse gleichzeitig ausführen kann. entweder pseudo-parallel (wenn nur eine CPU verfügbar ist) oder heutzutage mit parallelen Mehrkern-CPUs (eine Task / ein Kern).

    Nehmen wir den einfacheren Fall, dass nur eine CPU verfügbar ist. Dies bedeutet, dass wenn Sie zwei verschiedene Prozesse gleichzeitig ausführen (z. B. einen Webbrowser und einen Musikplayer), das System diese nicht wirklich gleichzeitig ausführen kann. Was passiert, ist, dass die CPU die ganze Zeit von einem Prozess zum anderen wechselt. Dies geschieht jedoch extrem schnell, so dass Sie es nie bemerken.

    Nehmen wir nun an, dass Sie während der Ausführung dieser beiden Prozesse die Reset-Taste (Bad Boy) drücken. Die CPU stoppt sofort alle Vorgänge und startet das System neu. Herzlichen Glückwunsch: Sie haben einen Interrupt generiert.

    Ähnlich verhält es sich beim Programmieren, wenn Sie einen Service von der CPU anfordern möchten. Der Unterschied besteht darin, dass Sie in diesem Fall Softwarecode ausführen - normalerweise Bibliotheksprozeduren, die Systemaufrufe ausführen (zum Beispiel fopenzum Öffnen einer Datei).

    Daher beschreibt 1 zwei verschiedene Wege, um Aufmerksamkeit von der CPU zu erhalten.

  2. Die meisten modernen Betriebssysteme unterstützen zwei Ausführungsmodi: Benutzermodus und Kernelmodus. Standardmäßig wird ein Betriebssystem im Benutzermodus ausgeführt. Der Benutzermodus ist sehr eingeschränkt. Zum Beispiel ist jede Eingabe / Ausgabe verboten. Sie dürfen also keine Datei von Ihrer Festplatte öffnen. In der Realität passiert das natürlich nie, denn wenn Sie eine Datei öffnen, wechselt das Betriebssystem transparent vom Benutzer- in den Kernel-Modus. Im Kernel-Modus haben Sie die vollständige Kontrolle über die Hardware.

    Wenn Sie sich fragen, warum diese beiden Modi existieren, ist die einfachste Antwort der Schutz. Auf Betriebssystemen auf Mikrokernel-Basis (z. B. MINIX 3) werden die meisten Dienste im Benutzermodus ausgeführt, wodurch sie weniger schädlich sind. Bei monolithischen Kerneln (wie Linux) werden fast alle Dienste im Kernelmodus ausgeführt. Daher ist es unwahrscheinlich, dass ein Treiber, der unter MINIX 3 abstürzt, das gesamte System zum Absturz bringt, während dies unter Linux nicht ungewöhnlich ist.

    Systemaufrufe sind das Grundelement, das in monolithischen Kerneln (Shared Data Model) für den Wechsel vom Benutzer- in den Kernelmodus verwendet wird. Die Nachrichtenübergabe ist das in Mikrokernen verwendete Grundelement (Client / Server-Modell). Genauer gesagt, verwenden Programmierer in einem Message-Passing-System auch Systemaufrufe, um die Aufmerksamkeit der CPU auf sich zu ziehen. Die Nachrichtenübergabe ist nur für die Entwickler des Betriebssystems sichtbar. Monolithische Kernel, die Systemaufrufe verwenden, sind schneller, aber weniger zuverlässig, während Mikrokernel, die Nachrichtenübermittlung verwenden, langsamer sind, aber eine bessere Fehlerisolierung aufweisen.

    Daher werden in 2 zwei verschiedene Arten des Wechsels vom Benutzer- in den Kernelmodus erwähnt.

  3. Die häufigste Methode zum Erstellen eines Software-Interrupts, auch Trap genannt, ist das Ausführen eines Systemaufrufs. Interrupts hingegen werden rein hardwaremäßig erzeugt.

    Wenn wir die CPU unterbrechen (entweder durch Software oder durch Hardware), muss sie irgendwo ihren aktuellen Status speichern - den Prozess, den sie ausführt, und an welchem ​​Punkt sie angehalten hat - sonst kann sie den Prozess beim Zurückschalten nicht fortsetzen . Dies wird als Kontextwechsel bezeichnet und ist sinnvoll: Bevor Sie Ihren Computer ausschalten, um etwas anderes zu tun, müssen Sie zunächst sicherstellen, dass Sie alle Ihre Programme / Dokumente usw. gespeichert haben, damit Sie an dem Punkt weitermachen können, an dem Sie den Vorgang beendet haben nächstes Mal wirst du es einschalten :)

    3 erklärt also, was nach dem Ausführen eines Traps oder Interrupts zu tun ist und wie ähnlich die beiden Fälle sind.


1
Vielen Dank! (1) Meinen Sie unter 1 die beiden Möglichkeiten, die Aufmerksamkeit der CPUs auf sich zu ziehen, Software-Interrupt (Beispiel für ein Programm mit Systemaufruf) und Hardware-Interrupt (Beispiel für einen Reset-Schlüssel)? (2) Meinen Sie in 2, dass Systemaufruf und Nachrichtenübergabe zwei Arten von Software-Interrupts sind? (3) Ist es richtig, dass der Zweck des Software-Interrupts darin besteht, Kerneldienste und -ressourcen anzufordern, und der Zweck des Hardware-Interrupts nicht ? Wenn ja, wozu dient ein Hardware-Interrupt?
Tim

1
(1) Richtig. (2) Nun, Systemaufrufe und Nachrichtenübermittlung sind zwei verschiedene Techniken, die zum Erreichen der Interprozesskommunikation verwendet werden können. Aber es ist wahr, dass beide softwarebasiert sind. Um die Aufmerksamkeit der CPU auf sich zu ziehen, führen Sie einen Trap (Software-Interrupt) aus. (3) In gewissem Sinne ja. Ein Beispiel für das Anfordern eines Kernel-Dienstes ist das Ausführen einer Bibliotheksprozedur (die in mindestens einen Systemaufruf übersetzt wird) wie das creatErstellen einer neuen Datei. Ein Beispiel für eine Unterbrechung ist, dass der Drucker ein Signal an die CPU sendet, um sie über den Abschluss des Druckvorgangs zu informieren.
Sakisk

1
Vielen Dank! In Bezug auf (3), meinst du in gewissem Sinne nein? Was sind die allgemeinen Zwecke eines Hardware-Interrupts und eines Software-Interrupts?
Tim

1
Ein Systemreset ist kein Interrupt. es speichert keinen Zustand, um danach fortzufahren.
Psusi

1
@faif reset und NMI (Non Maskable Interrupt) sind zwei verschiedene Pins auf der CPU. Letzteres führt zu einem Interrupt, dh es wird der Status gespeichert und zum Handler gesprungen. Ersteres initialisiert die CPU (verwirft absichtlich alle Zustände) genau wie beim Einschalten (das Zurücksetzen wird beim Einschalten automatisch aktiviert). Da ein Teil der Definition eines Interrupts darin besteht, dass der Status gespeichert wird, entspricht das Zurücksetzen nicht dieser Definition.
Psusi

9

Systemaufrufe, Nachrichtenübermittlung (wie im Wikipedia-Artikel beschrieben) und Interrupts sind alles Dinge, die einen Kontextwechsel oder einen Wechsel vom Benutzer in den Kernelmodus verursachen. Wie Sie wahrscheinlich wissen:

  • Kernel-Modus: Programme haben eine flache oder reale Ansicht des Speichers, und Programme können direkt und ohne Einschränkung frei in den gesamten Speicher und auf alle Hardwaregeräte lesen / schreiben.

  • Benutzermodus: Programme haben eine virtualisierte Ansicht des Speichers, Programme können nicht frei in den gesamten Speicher lesen / schreiben und Hardware-Geräte nicht direkt lesen / schreiben. Um mehr Speicher zu erhalten oder auf Hardwaregeräte zuzugreifen, muss das Benutzermodusprogramm den Kernel aufrufen . Systemaufrufe und Nachrichtenübergabe sind zwei Methoden, um dies zu tun.

Bei Systemaufrufen wird ein bestimmter CPU-Befehl oder ein Befehlssatz ausgeführt, durch den die CPU zu einer vordefinierten Adresse (die nicht in den Benutzermodus geschrieben werden kann) springt (indem sie zuerst die Rücksprungadresse auf dem Stapel speichert) und die CPU vom Benutzermodus in den Kernelmodus (Ring) versetzt 3 bis 0 in der Intel-Architektur klingeln).

Hardware-Interrupts machen fast dasselbe, sie bringen die CPU dazu, zu einer vordefinierten Adresse zu springen (indem sie zuerst die Rücksendeadresse auf dem Stapel speichert) und die CPU vom Benutzermodus in den Kernelmodus zu versetzen. In vielen CPUs kann der gleiche Mechanismus von der Software aufgerufen werden (als "Software-Interrupt" bezeichnet) und für CPU-Aufrufe verwendet werden.

Das Weiterleiten von Nachrichten impliziert (zumindest für mich), dass der Kernel ein "laufender Prozess" ist, der einen Nachrichtenstrom empfängt und dass eine im Benutzermodus zugängliche Funktion vorhanden ist, die solche Nachrichten sendet. Oder es kann sein, dass die "send" -Funktion nur Werte auf einem Stack verschiebt und beim nächsten Mal, wenn der Kernel die Kontrolle hat (entweder wenn ein Prozess blockiert oder ein Interrupt auftritt), Nachrichten vom Stack abruft und entsprechend an interne Routinen weiterleitet.

In einer Mikrokernel-Architektur, in der der eigentliche "Kernel" sehr klein ist und die meisten Funktionen, die ein Kernel bereitstellt, auf "Server" -Prozesse verlagert werden, die möglicherweise alle gleichzeitig auf einem System mit mehreren CPUs ausgeführt werden, könnte dies mehr sein nützlich als der einfache alte Systemaufruf-Ansatz. Das Interpretieren und Weiterleiten von "Nachrichten" an den entsprechenden "Server" des Kernels wäre eine der wenigen Aufgaben des Mikrokerns.


3
Der Kernelmodus verwendet dieselben Seitentabellen und zeigt dieselbe Ansicht des virtuellen Speichers wie der Benutzermodus. Der Unterschied besteht darin, dass es Zugriff auf die Seiten hat, die als auf den Kernel-Modus beschränkt markiert sind.
Psusi

5

Das Weiterleiten von Nachrichten ist ein übergeordnetes Konzept eines Prozesses, der eine Nachricht an einen anderen sendet. Es wird durch einen Systemaufruf (Kernel) implementiert, der den Kernel auffordert, die Nachricht an den anderen Prozess weiterzuleiten. Systemaufrufe fordern den Kernel auf, verschiedene Dienste für den Prozess auszuführen. Sie werden von einem Software-Interrupt / System-Trap implementiert, der bewirkt, dass die CPU einen bestimmten Status auf dem Stack speichert, damit sie später zurückkehren kann, dann in den Kernel-Modus wechselt und zum Kernel-Handler springt.

Sowohl Hardware- als auch Software-Interrupts bewirken, dass die CPU den Status speichert, in den Kernel-Modus wechselt und zu einem definierten Handler für diesen Interrupt springt. Der Unterschied besteht darin, dass Hardware-Interrupts von externer Hardware generiert werden, wenn sie etwas Aufmerksamkeit erfordern, z. B. eine Tastatur, die angibt, dass eine Taste gedrückt wurde. Der Tastatur-Handler kann dann den Tastatur-E / A-Anschluss lesen, um festzustellen, welche Taste gedrückt wurde, und die entsprechenden Maßnahmen ergreifen und dann zu dem Programm zurückkehren, das unterbrochen wurde.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.