Hinweise zum Betriebssystem – Prozessmanagement

Hinweise zum Betriebssystem – Prozessmanagement

2. Prozessmanagement

2.1 Prozesse und Threads

2.1.1 Einführung des Prozesses

In einem Computer-BetriebssystemDer Prozess ist die Grundeinheit der Ressourcenzuteilung und die Grundeinheit des unabhängigen Betriebs.

Vorläuferdiagramm

Fügen Sie hier eine Bildbeschreibung ein

Der Vorgängergraph ist ein gerichteter azyklischer Graph,Jeder Knoten kann eine Anweisung, ein Programmsegment oder einen Prozess darstellen. Die gerichteten Kanten zwischen Knoten stellen die Teilreihenfolge oder Vorgängerbeziehung zwischen den beiden Knoten dar.

→={(P i , P j )|P i muss abgeschlossen sein, bevor P j mit der Ausführung beginnt}

Fügen Sie hier eine Bildbeschreibung ein

Sequentielle Ausführung von Programmen

Ein Programm besteht in der Regel aus mehreren Programmabschnitten.Sie müssen in einer bestimmten Reihenfolge ausgeführt werden, und nachfolgende Vorgänge können erst ausgeführt werden, nachdem der vorherige Vorgang ausgeführt wurde.Bei dieser Art von Berechnungsprozess handelt es sich um den sequentiellen Ausführungsprozess des Programms. Beispielsweise werden bei der Bearbeitung eines Auftrags immer zuerst das Programm und die Daten des Benutzers eingegeben, dann Berechnungen durchgeführt und schließlich die Ergebnisse ausgedruckt.

  • Sequenzialität. Die Operationen des Prozessors werden streng in der vom Programm vorgegebenen Reihenfolge ausgeführt, d. h. jede Operation muss beendet werden, bevor die nächste Operation beginnt.
  • Nähe. Sobald das Programm ausgeführt wird, werden seine Ausführungsergebnisse nicht durch externe Faktoren beeinflusst. Da das Programm während der Ausführung verschiedene Ressourcen des Systems monopolisiert, kann der Zustand dieser Ressourcen (mit Ausnahme des Anfangszustands) nur von diesem Programm geändert werden.
  • Reproduzierbarkeit. Solange die Anfangsbedingungen und die Ausführungsumgebung bei der Programmausführung gleich sind, wird bei wiederholter Programmausführung das gleiche Ergebnis erzielt (dh das Ausführungsergebnis des Programms hat nichts mit der Zeit zu tun).

Gleichzeitige Ausführung von Programmen

Die gleichzeitige Ausführung eines Programms bedeutet, dass mehrere Programme (oder Programme) gleichzeitig im System laufen. Die Ausführung dieser (Sequenzen) überschneidet sich zeitlich, das heißt, die Ausführung eines Programms (oder Programmabschnitts) hat dies nicht noch nicht beendet, und die Ausführung eines anderen Programms (oder Programmabschnitts) ist noch nicht beendet. Die Programmabschnittszeile wurde gestartet.

Obwohl die gleichzeitige Ausführung von Programmen die Verarbeitungsleistung und Ressourcennutzung des Systems verbessert, bringt sie auch einige neue Probleme mit sich und führt zu einigen Merkmalen, die sich von denen der sequentiellen Ausführung unterscheiden:

  • Wechselnd. Wenn Programme gleichzeitig ausgeführt werden, weil sie Ressourcen gemeinsam nutzen oder miteinander kooperieren, um dieselbe Aufgabe zu erledigen, bilden gleichzeitige Programme eine sich gegenseitig einschränkende Beziehung. Wenn in Abbildung 2-1 C 1 nicht abgeschlossen ist, kann P 1 nicht ausgeführt werden, was dazu führt, dass der Druckvorgang von Job 1 angehalten wird. Dies ist eine direkte Einschränkungsbeziehung, die durch die gegenseitige Zusammenarbeit zur Erledigung derselben Aufgabe verursacht wird: wenn I 1 ist nicht abgeschlossenDann kann I 2 , wodurch der Eingabevorgang von Job 2 gestoppt wird. Dies ist eine indirekte Einschränkungsbeziehung, die durch gemeinsam genutzte Ressourcen verursacht wird. Diese gegenseitige Einschränkungsbeziehung führt dazu, dass gleichzeitige Programme ein intermittierendes Aktivitätsmuster von „Ausführung, Pause, Ausführung, Ausführung“ aufweisen.

  • Verlust der Schließung. Wenn Programme gleichzeitig ausgeführt werden, teilen sich mehrere Programme verschiedene Ressourcen im System, sodass der Status dieser Ressourcen von mehreren Programmen geändert wird, was dazu führt, dass das Programm ohne Abschluss ausgeführt wird. Wenn ein solches Programm ausgeführt wird, wird es unweigerlich von anderen Programmen beeinflusst. Wenn beispielsweise der Prozessor von einem Programm belegt ist, müssen andere Programme warten.

  • Unreproduzierbarkeit. Wenn Programme gleichzeitig ausgeführt werden, geht aufgrund des Verlusts der Schließung auch die Reproduzierbarkeit ihrer Ausführungsergebnisse verloren. Beispielsweise gibt es zwei Schleifenprogramme A und B, die eine Variable N gemeinsam nutzen. Jedes Mal, wenn Programm A ausgeführt wird, müssen N=N+1 Operationen ausgeführt werden; jedes Mal, wenn Programm B ausgeführt wird, müssen print(N)-Operationen ausgeführt werden, und dann ist N=0. Da die Ausführung von Programm A und Programm B beide mit unabhängigen Geschwindigkeiten voranschreitet, kann die N=N+1-Operation von Programm A vor der print(N)-Operation und der N=0-Operation von B gesendet werden oder davor erfolgen . Nach oder in der Mitte. Nehmen Sie an, dass der Wert von N zu einem bestimmten Zeitpunkt n ist. Für die beiden Situationen, in denen N = N + 1 vor und nach den beiden Operationen von B erscheint (siehe Abbildung 2-2), werden die N-Werte nach der Ausführung eines Zyklus gedruckt sind n+ 1 und n.

Fügen Sie hier eine Bildbeschreibung ein

  • Bedingungen für die gleichzeitige Ausführung von Programmen

    Wenn Programme gleichzeitig ausgeführt werden, sind die Ergebnisse nicht reproduzierbar, was nicht das Ergebnis ist, das Benutzer sehen möchten. Zu diesem Zweck müssen Programme geschlossen und reproduzierbar bleiben, wenn sie gleichzeitig ausgeführt werden. Da der Verlust des Abschlusses bei gleichzeitiger Ausführung die Auswirkung gemeinsam genutzter Ressourcen ist, besteht die nun zu erledigende Arbeit darin, diese Auswirkung zu beseitigen.

Fügen Sie hier eine Bildbeschreibung ein

Wenn zwei Programme p 1 und p 2 die folgenden drei Bedingungen erfüllen können, können sie gleichzeitig ausgeführt werden und ihre Ergebnisse sind reproduzierbar.

Fügen Sie hier eine Bildbeschreibung ein

2.1.2 Definition und Beschreibung des Prozesses

In einer Multiprogramming-Umgebung zerstört die gleichzeitige Ausführung von Programmen die Geschlossenheit und Reproduzierbarkeit des Programms, sodass Programme und Berechnungen nicht mehr eins zu eins entsprechen, Programmaktivitäten nicht mehr in einem geschlossenen System stattfinden und viele neue Probleme beim Betrieb entstehen Programmfunktion. In diesem Fall kann das statische Konzept des Programms diese Merkmale der Programmaktivitäten nicht mehr getreu widerspiegeln, sodass ein neues Konzept – der Prozess – eingeführt wird.

Prozessdefinition

  • Ein Prozess ist die Ausführung eines Programms auf einem Prozessor.
  • Ein Prozess ist eine Berechnung, die parallel zu anderen Prozessen ausgeführt werden kann.
  • Ein Prozess ist der laufende Prozess eines Programms für eine Datenerfassung und stellt eine unabhängige Einheit für die Ressourcenzuweisung und -planung im System dar.
  • Ein Prozess kann als eine Datenstruktur und ein Programm definiert werden, das darauf arbeiten kann.
  • Ein Prozess ist die Aktivität, die auftritt, wenn ein Programm eine Datenfolge auf einem Prozessor ausführt.

Merkmale des Prozesses

  • Dynamisch. Ein Prozess ist ein Ausführungsprozess eines Programms auf dem Prozessor, also dynamisch. Die dynamischen Eigenschaften manifestieren sich auch darin, dass sie durch die Erstellung generiert, durch die Planung ausgeführt, aufgrund von Ressourcenmangel ausgesetzt und schließlich durch Abbruch beendet werden.
  • Parallelität. Parallelität bedeutet, dass mehrere Prozesse gleichzeitig im Speicher vorhanden sind und über einen bestimmten Zeitraum gleichzeitig ausgeführt werden können. Der Zweck der Einführung eines Prozesses besteht darin, das Programm in die Lage zu versetzen, gleichzeitig mit anderen Programmen ausgeführt zu werden, um die Ressourcennutzung zu verbessern.
  • Unabhängigkeit. Ein Prozess ist eine Grundeinheit, die unabhängig ausgeführt werden kann und außerdem eine unabhängige Einheit für die Ressourcenzuweisung und -planung durch das System darstellt.
  • Asynchronität. Asynchronität bedeutet, dass Prozesse mit unabhängiger und unvorhersehbarer Geschwindigkeit voranschreiten.
  • Struktur. Um die Bewegungsänderungen des Prozesses zu beschreiben, zu erfassen und einen korrekten Ablauf zu ermöglichen,Für jeden Prozess sollte ein Process ControlBlock (PCB) konfiguriert werden. Strukturell gesehen besteht jeder Prozess aus einem Programmsegment, einem Datensegment und einem Prozesssteuerungsblock.

Die Beziehung zwischen Prozess und Programm

  • Der Prozess ist dynamisch und das Programm ist statisch. Ein Prozess ist die Ausführung eines Programms. Jeder Prozess enthält ein Programmsegment, ein Datensegment und einen Prozesssteuerungsblock (PCB). Ein Programm ist eine Sammlung geordneter Codes ohne Ausführungsbedeutung.
  • Prozesse sind temporär, Programme sind dauerhaft. Ein Prozess ist ein Prozess der Zustandsänderung, und das Programm kann über einen langen Zeitraum gespeichert werden.
  • Die Bestandteile von Prozessen und Programmen sind unterschiedlich.Der Prozess besteht aus Programmsegmenten, Datensegmenten und Prozesskontrollblöcken.
  • Durch mehrere Ausführungen kann ein Programm mehrere unterschiedliche Prozesse generieren, und durch Aufrufbeziehungen kann ein Prozess mehrere Programme ausführen. Prozesse können andere Prozesse erzeugen, aber Programme können keine neuen Programme bilden
  • Prozesse haben parallele Eigenschaften (Unabhängigkeit, Asynchronität), Programme jedoch nicht.

Das Prozessabbild besteht aus drei Teilen: Programmsegment, zugehöriges Datensegment und PCB, auch Prozesseinheit genannt.Das Prozessbild ist statisch, der Prozess ist dynamisch und der Prozess ist der laufende Prozess der Prozessentität.

Der Unterschied zwischen Prozess und Job

Ein Job ist eine Sammlung von Arbeiten, die ein Benutzer vom Computer ausführen muss, um eine bestimmte Aufgabe auszuführen. Der Abschluss eines Auftrags durchläuft vier Phasen: Auftragsübermittlung, Auftragseindämmung, Auftragsausführung und Auftragsabschluss. Der Prozess ist der Ausführungsprozess des übermittelten Jobs und die Grundeinheit der Ressourcenzuweisung.

  • Ein Job ist eine Aufgabeneinheit, die ein Benutzer an einen Computer sendet. Nachdem der Benutzer einen Job an den Computer gesendet hat, stellt das System ihn in die Jobwarteschlange im externen Speicher, um auf die Ausführung zu warten: Der Prozess ist die Ausführungseinheit, die die Aufgabe des Benutzers abschließt, und die Grundeinheit, die dem System zur Zuweisung zugewiesen wird Ressourcen.. Für jeden Prozess gibt es, solange er erstellt wird, immer einen entsprechenden Teil im Speicher.
  • Ein Job kann aus mehreren Prozessen bestehen und muss aus mindestens einem Prozess bestehen, ein Prozess kann jedoch nicht mehrere Jobs bilden
  • Das Konzept der Jobs wird hauptsächlich in Batch-Verarbeitungssystemen verwendet. Time-Sharing-Systeme wie UNIX verfügen nicht über das Konzept von Jobs; das Konzept von Prozessen wird in fast allen Multiprogrammierungssystemen verwendet.

Prozesszusammensetzung

  • Prozesskontrollblock (PCB).Jeder Prozess verfügt über eine PCB, eine Datenstruktur, die sowohl die Existenz des Prozesses identifizieren als auch den Ausführungszeitpunkt charakterisieren kann.. Wenn ein Prozess erstellt wird, weist das System ihm eine entsprechende Leiterplatte zu und erstellt diese.
  • Programmteil.Ein Programmsegment ist ein Programmcodesegment in einem Prozess, das vom Programm zur Ausführung auf der CPU geplant werden kann., kann die entsprechenden spezifischen Funktionen realisieren.
  • Datensegment. Datensegment eines ProzessesDies können die Originaldaten sein, die vom dem Prozess entsprechenden Programm verarbeitet werden, oder es können Zwischen- oder Ergebnisdaten sein, die bei der Ausführung des Programms generiert werden.

Die Leiterplatte ist das einzige Zeichen für die Existenz des Prozesses .

PCB umfasst:

  • Prozesskennung (PID). Jeder Prozess verfügt über eine eindeutige Prozesskennung, um ihn von anderen Prozessen innerhalb des Systems zu unterscheiden. Wenn ein Prozess angelegt wird, weist ihm das System eine eindeutige Prozessidentifikationsnummer zu.
  • Der aktuelle Status des Prozesses. Beschreibt den aktuellen Status des Prozesses als Grundlage für die Zuweisung von Prozessoren durch den Prozessplaner.
  • Zeiger auf die Prozesswarteschlange. Wird zum Aufzeichnen der Adresse der nächsten Leiterplatte in der Leiterplattenwarteschlange verwendet. Leiterplatten im System können in mehreren Warteschlangen organisiert sein, z. B. in der Bereitschaftswarteschlange, der Blockierungswarteschlange usw.
  • Programm- und Datenadressen. Gibt die Adresse an, an der sich die Programme und Daten des Prozesses befinden.
  • Prozesspriorität. Spiegelt die Dringlichkeit der CPU-Anforderungen des Prozesses wider. Prozesse mit höherer Priorität erhalten zuerst den Prozessor.
  • CPU-Standortschutzzone. Wenn der Prozess aus irgendeinem Grund den Prozessor freigibt, werden die lokalen CPU-Informationen (z. B. Zählerstatusregister, allgemeine Register usw.) in diesem Bereich der Leiterplatte gespeichert, sodass der Prozess nach der Wiederherstellung des Prozessors weiter ausgeführt werden kann.
  • Kommunikationsinformationen. Zeichnen Sie den Informationsaustausch auf, der während der Ausführung zwischen einem Prozess und anderen Prozessen stattfindet.
  • Familienverbindungen. Einige Systeme ermöglichen es Prozessen, untergeordnete Prozesse zu erstellen und so einen Prozessstammbaum zu bilden. In PCB muss die Beziehung zwischen diesem Prozess und seiner Familie angegeben werden, beispielsweise die Identifizierung seines untergeordneten Prozesses und seines übergeordneten Prozesses.
  • Liste der Besitzressourcen. Eine Liste der vom Prozess benötigten Ressourcen und der aktuell zugewiesenen Ressourcen.

In einem System gibt es normalerweise viele Prozesse, einige im Bereitschaftszustand, andere im blockierten Zustand, und die Gründe für die Blockierung sind unterschiedlich.Um die Planung und Verwaltung von Prozessen zu erleichtern, müssen die PCBs jedes Prozesses auf geeignete Weise organisiert werden. Zu den derzeit gebräuchlichsten Organisationsmethoden gehören Verlinkung und Indizierung.

Die Rolle von PCB besteht darin, die gleichzeitige Ausführung von Programmen sicherzustellen. Das Erstellen eines Prozesses bedeutet im Wesentlichen das Erstellen der Leiterplatte des Prozesses; und das Abbrechen des Prozesses bedeutet im Wesentlichen das Löschen der Leiterplatte des Prozesses.

Warum ist die Leiterplatte das einzige Zeichen für die Existenz eines Prozesses?

Während des gesamten Lebenszyklus eines Prozesses steuert das System den Prozess immer über die Leiterplatte, dh das System erkennt die Existenz des Prozesses anhand der Leiterplatte des Prozesses. Daher ist die Leiterplatte das einzige Zeichen für die Existenz von der Prozess.

2.1.3 Prozessstatus und Übergänge

5 Grundzustände von Prozessen

  • Bereitzustand. Der Prozess hat alle Ressourcen außer dem Prozessor erhalten. Sobald er den Prozessor erhält, kann er sofort ausgeführt werden. Zu diesem Zeitpunkt befindet sich der Prozess im Bereitschaftszustand.
  • Ausführungsstatus (Laufstatus). Wenn ein Prozess die erforderlichen Ressourcen erhalten hat und auf der CPU ausgeführt wird, befindet sich der Prozess im Ausführungsstatus.
  • Blockierender Zustand (Wartezustand). Der ausgeführte Prozess kann aufgrund des Auftretens eines Ereignisses (z. B. Warten auf den Abschluss der E/A) vorübergehend nicht ausgeführt werden. Zu diesem Zeitpunkt befindet sich der Prozess in einem blockierten Zustand. Wenn ein Prozess blockiert ist, kann er nicht ausgeführt werden, auch wenn ihm der Prozessor zugewiesen ist.

Achten Sie bei der Beantwortung der Fragen besonders auf die Unterscheidung zwischen dem Bereitschaftszustand und dem blockierten Zustand. Der Schlüssel zur Unterscheidung der beiden liegt darin, ob sie sofort ausgeführt werden können, wenn der Prozessor dem Prozess zugewiesen wird. Wenn sie sofort ausgeführt werden können, ist dies der Fall im Bereitschaftszustand. Andernfalls ist es blockiert. Zustand.

  • Status erstellen. Der Prozess wird erstellt und ist noch nicht in den Bereitschaftszustand übergegangen. Beantragen Sie eine leere Leiterplatte und geben Sie einige Informationen über den Steuerungs- und Managementprozess in die Leiterplatte ein. Anschließend weist das System die für die Ausführung des Prozesses erforderlichen Ressourcen zu. Schließlich wird der Prozess in den Bereitschaftszustand versetzt.
  • Endzustand. Der Prozess verschwindet aus dem System. Er kann normal beendet oder aus anderen Gründen unterbrochen werden.

Gegenseitige Konvertierung von Prozesszuständen

Fügen Sie hier eine Bildbeschreibung ein

  • Bereitzustand – Ausführungszustand. Ein Prozess wird vom Prozessplaner ausgewählt.
  • Der Ausführungsstatus ist ein Blockierungsstatus. Fordern Sie ein Ereignis an und warten Sie darauf, dass es eintritt.
  • Der Ausführungsstatus ist der Bereitschaftsstatus. Die Zeitscheibe läuft ab oder ein Prozess mit einer höheren Priorität im präventiven Scheduling wird bereit.
  • Blockierzustand – Bereitschaftszustand. Der Prozess wird aktiviert, weil er auf das Eintreten einer bestimmten Bedingung wartet.

Daraus lässt sich schließen

  • Nicht alle Prozesszustandsübergänge sind reversibel.Ein Prozess kann weder vom Blockierungszustand in den Ausführungszustand noch vom Bereitschaftszustand in den Blockierungszustand wechseln.
  • Die Zustandsübergänge zwischen Prozessen sind nicht alle aktiv. In vielen Fällen sind sie passiv. Nur der Übergang vom Ausführungszustand zum Blockierungszustand ist das Eigenverhalten des Programms (das Blockierungsprimitiv wird aufgrund von Ereignissen aktiv aufgerufen) und der Rest sind passiv.
  • Eindeutigkeit des Prozessstatus. Ein bestimmter Prozess muss und kann sich zu jedem Zeitpunkt nur in einem Zustand befinden.

2.1.4 Prozesskontrolle

Die Aufgabe der Prozesssteuerung besteht darin, alle Prozesse im System effektiv zu verwalten. Zu ihren Funktionen gehören Prozesserstellung, Prozessstornierung, Prozessblockierung und -aktivierung usw. Diese Funktionen werden im Allgemeinen vom Kernel des Betriebssystems implementiert.

Erstellung eines Prozesses

  • Prozessvorläuferdiagramm

Fügen Sie hier eine Bildbeschreibung ein

  • Erstellen Sie Grundelemente

    • Benutzer-Anmeldung. In einem Time-Sharing-System gibt der Benutzer Anmeldeinformationen am Terminal ein. Nachdem das System den Prozess erkannt und bestanden hat, wird ein neuer Prozess für den Terminalbenutzer erstellt und in die Bereitschaftswarteschlange eingefügt.
    • Arbeit planen. Wenn der Job-Scheduler in einem Stapelverarbeitungssystem einen Job gemäß einem bestimmten Algorithmus plant, lädt er den Job in den Speicher, weist ihm Ressourcen zu, erstellt einen Prozess und fügt ihn in die Bereitschaftswarteschlange ein.
    • Service anfordern. Basierend auf den Anforderungen des Prozesses wird ein neuer Prozess erstellt, der eine bestimmte Aufgabe erledigt.

    Das Erstellungsprimitiv des Prozesses ist implementiert und sein Hauptoperationsprozess ist wie folgt:

    • Beantragen Sie zunächst eine kostenlose Leiterplatte aus dem System und geben Sie eine eindeutige Prozesskennung (PID) an.
    • Weisen Sie dem neuen Prozess die erforderlichen Ressourcen zu.
    • Initialisieren Sie die Platine des neuen Prozesses. Geben Sie den Prozessnamen, die Familieninformationen, die Programmdatenadresse, die Priorität und andere Informationen für die Leiterplatte des neuen Prozesses ein.
    • Fügen Sie die Leiterplatte des neuen Prozesses in die Bereitschaftswarteschlange ein.

Prozesspaar rückgängig machen

Ein Prozess sollte nach Abschluss seiner Aufgaben abgebrochen werden, um die verschiedenen von ihm belegten Ressourcen zeitnah freizugeben.Das Abbruchprimitiv kann zwei Strategien anwenden: Eine besteht darin, nur einen Prozess mit der angegebenen Kennung abzubrechen, und die andere darin, den angegebenen Prozess und alle seine Nachkommenprozesse abzubrechen.. Zu den Ereignissen, die zum Abbruch eines Prozesses führen, gehören normale Prozessabbrüche, abnormale Prozessabbrüche und externe Eingriffe.

Die Funktion des Abbruchprimitivs besteht darin, einen Prozess abzubrechen. Sein Hauptoperationsprozess ist wie folgt:

  • Suchen Sie zunächst die Leiterplatte des Rückgängig-Vorgangs in der Leiterplattensammlung.
  • Befindet sich der widerrufene Prozess im Ausführungsstatus, sollte die Ausführung des Prozesses sofort gestoppt und das Neuplanungsflag gesetzt werden, damit der Prozessor nach dem Widerruf des Prozesses anderen Prozessen zugewiesen werden kann.
  • Bei der letztgenannten Widerrufsstrategie sollten, wenn der widerrufene Prozess untergeordnete Prozesse hat, auch die untergeordneten Prozesse des Prozesses widerrufen werden.
  • Recyceln Sie die vom widerrufenen Prozess belegten Ressourcen oder geben Sie sie an den übergeordneten Prozess oder an das System zurück.Schließlich recyceln Sie die Leiterplatte

Prozessblockierung und Erwachen

Die Funktion des Blockierungsgrundelements (P-Grundelement) besteht darin, den Prozess vom Ausführungszustand in den Blockierungszustand zu ändern, während die Funktion des Weckgrundelements (V-Grundelement) darin besteht, den Prozess vom Blockierungszustand in den Bereitschaftszustand zu ändern .

Der Hauptoperationsprozess des Blockierungsprimitivs ist wie folgt:

  • Stoppen Sie zunächst die Ausführung des aktuellen Prozesses. Da der Prozess ausgeführt wird, sollte der Prozessor unterbrochen werden.
  • Speichert den CPU-Kontext des Prozesses, sodass der Prozess später aufgerufen werden kann und die Ausführung an der Stelle der Unterbrechung fortgesetzt wird.
  • Stoppen Sie den Prozess, ändern Sie den Prozessstatus vom Ausführungsstatus in den Blockierungsstatus und fügen Sie den Prozess dann in die Warteschlange für das entsprechende Ereignis ein.
  • Gehen Sie zum Prozessplaner und wählen Sie einen neuen Prozess aus der Bereitschaftswarteschlange zur Ausführung aus.

Der Hauptoperationsprozess des Weckprimitivs ist wie folgt:

  • Entfernen Sie den aktivierten Prozess aus der entsprechenden Warteschlange.
  • Ändern Sie den Status auf „Bereit“ und fügen Sie ihn in die entsprechende Bereitschaftswarteschlange ein.

Prozessumschaltung

Prozesswechsel istBezieht sich auf den Wechsel des Prozessors von der Ausführung eines Prozesses zur Ausführung eines anderen Prozesses. Während dieses Prozesses hat sich die Ausführungsumgebung des Prozesses erheblich verändert.

Der Prozess der Prozessumschaltung ist wie folgt:

  • Speichert Verarbeitung und Kontext, einschließlich Programmzähler und anderen Registern.
  • Aktualisieren Sie die PCB-Informationen.
  • Verschieben Sie die Leiterplatte des Prozesses in die entsprechende Warteschlange, z. B. in die Bereitschaftswarteschlange, die Blockierwarteschlange eines bestimmten Ereignisses usw.
  • Wählen Sie einen anderen Prozess aus, um dessen PCB auszuführen und zu aktualisieren.
  • Aktualisieren Sie die Datenstrukturen der Speicherverwaltung.
  • Prozessorkontext wiederherstellen.

Die Prozessumschaltung führt auf jeden Fall zu einem Interrupt und einer Umschaltung des Prozessormodus, d Vom Benutzermodus in den Kernelmodus wechseln und dann in den Benutzermodus zurückkehren, aber logischerweise belegt derselbe Prozess immer noch den Prozessor zur Ausführung.

2.1.5 Prozesskommunikation

Prozesskommunikation istBezieht sich auf den Informationsaustausch zwischen Prozessen. Der gegenseitige Ausschluss und die Synchronisierung von Prozessen ist eine Kommunikationsmethode zwischen Prozessen. Da die Menge der zwischen dem gegenseitigen Ausschluss und der Synchronisierung des Prozesses ausgetauschten Informationen gering und die Effizienz gering ist, werden diese beiden Prozesskommunikationsmethoden als Prozesskommunikationsmethoden auf niedriger Ebene bezeichnet .

Dementsprechend können die P- und V-Primitive auch als zwei Low-Level-Prozesskommunikationsprimitive bezeichnet werden.

Fortgeschrittene Prozesskommunikationsmethoden können in drei Hauptkategorien unterteilt werden: Shared-Memory-Systeme, Message-Passing-Systeme und Pipeline-Kommunikationssysteme .

Shared-Memory-System

Um große Datenmengen zu übertragen, wird im Speicher ein gemeinsam genutzter Speicherbereich zugewiesen, und mehrere Prozesse können durch Lesen und Schreiben in den gemeinsam genutzten Speicherbereich kommunizieren. Vor der Kommunikation wendet sich der Prozess an das System, um einen gemeinsam genutzten Speicherbereich einzurichten, und gibt das Schlüsselwort des gemeinsam genutzten Speicherbereichs an. Wenn der gemeinsam genutzte Speicherbereich eingerichtet wurde, wird der Deskriptor des gemeinsam genutzten Speicherbereichs an den Antragsteller zurückgegeben. Der Antragsteller fügt dann den erhaltenen gemeinsamen Speicherbereich dem Prozess hinzu. Auf diese Weise kann der Prozess den gemeinsam genutzten Speicherbereich genauso lesen und schreiben wie den normalen Speicher.

Nachrichtensystem

In einem NachrichtensystemDaten werden zwischen Prozessen in Nachrichteneinheiten ausgetauscht, und Benutzer verwenden direkt eine Reihe von Kommunikationsbefehlen (Primitiven), die vom System bereitgestellt werden, um die Kommunikation zu implementieren.. Das Betriebssystem verbirgt die Implementierungsdetails der Kommunikation, vereinfacht Kommunikationsabläufe und ist weit verbreitet.

Messaging-Systeme lassen sich je nach Implementierung in die folgenden zwei Kategorien einteilen:

  • direkte Kommunikationsmethode. Der sendende Prozess sendet die Nachricht direkt an den empfangenden Prozess und hängt sie an die Nachrichtenpufferwarteschlange des empfangenden Prozesses. Der empfangende Prozess erhält die Nachricht aus der Nachrichtenpufferwarteschlange.
  • Indirekte Kommunikationsmethode. Der sendende Prozess sendet die Nachricht an eine Zwischeneinheit (normalerweise als Postfach bezeichnet) und der empfangende Prozess erhält die Nachricht von dort. Diese Kommunikationsmethode wird auch Mailbox-Kommunikation genannt. Diese Kommunikationsmethode wird häufig in Computernetzwerken verwendet und das entsprechende Kommunikationssystem wird als E-Mail-System bezeichnet.

Rohrkommunikationssystem

Eine Pipe ist eine gemeinsam genutzte Datei, die zum Verbinden von Lese- und Schreibprozessen verwendet wird, um die Kommunikation zwischen ihnen zu ermöglichen.. Der Sendeprozess, der Eingaben in die Pipe bereitstellt (d. h. der Schreibprozess), sendet eine große Datenmenge in Form eines Zeichenstroms in die Pipe, und der Prozess, der die Ausgabe der Pipe empfängt (d. h. der Leseprozess) kann Daten von der Pipe empfangen.

2.1.6 Threads

Threads sind eine sehr wichtige Technologie, die in den letzten Jahren im Bereich der Betriebssysteme aufgetaucht ist, und ihre Bedeutung ist nicht weniger wichtig als Prozesse. Die Einführung von Threads verbessert den Grad der gleichzeitigen Ausführung von Programmen und steigert dadurch den Systemdurchsatz weiter.

Das Konzept des Threads

  • Einführung von Threads: Wenn der Zweck der Einführung von Prozessen in das Betriebssystem darin besteht, die gleichzeitige Ausführung mehrerer Programme zu ermöglichen, um die Ressourcennutzung und den Systemdurchsatz zu verbessern, dannDer Zweck der Wiedereinführung von Threads in das Betriebssystem besteht darin, den Zeit- und Platzaufwand zu reduzieren, der bei der gleichzeitigen Ausführung von Programmen entsteht, sodass das Betriebssystem über eine bessere Parallelität verfügt.

  • Definition von Thread

    • Ein Thread ist eine Ausführungseinheit innerhalb eines Prozesses und kleiner als ein Prozess.
    • Ein Thread ist eine planbare Einheit innerhalb eines Prozesses.
    • Ein Thread ist eine relativ unabhängige Kontrollflusssequenz in einem Programm (oder Prozess).
    • Ein Thread selbst kann nicht alleine laufen, er kann nur in einen Prozess eingebunden und nur innerhalb eines Prozesses ausgeführt werden.

    Zusammenfassend können wir einen Thread genauso gut definieren als:Ein Thread ist eine relativ unabhängige, planbare Ausführungseinheit innerhalb eines Prozesses.. Der Thread selbst besitzt grundsätzlich keine Ressourcen, sondern nur einige Ressourcen, die während der Laufzeit wichtig sind (z. B. einen Programmzähler, eine Reihe von Registern und einen Stapel), aber er kann alle Ressourcen, die der Prozess besitzt, mit anderen Threads teilen gehören zum selben Prozess.

  • Thread-Implementierung

    Es gibt viele Möglichkeiten, Thread-Unterstützung im Betriebssystem zu implementieren.Die natürlichste Methode besteht darin, den Thread-Steuerungsmechanismus durch den Betriebssystemkernel bereitzustellen. In einem Betriebssystem, das nur über das Konzept eines Prozesses verfügt, kann das Benutzerprogramm die Funktionsbibliothek verwenden, um einen Thread-Steuerungsmechanismus bereitzustellen.. Ein anderer Ansatz besteht darin, Thread-Kontrollmechanismen sowohl auf der Betriebssystemkernel- als auch auf der Benutzerprogrammebene bereitzustellen.

    • Threads auf Kernel-Ebene. Bezieht sich auf Threads, die vom Kernel abhängen und vom Betriebssystemkernel erstellt und zerstört werden. In einem Betriebssystem, das Threads auf Kernelebene unterstützt, verwaltet der Kernel Kontextinformationen für Prozesse und Threads und führt den Threadwechsel durch.Wenn ein Thread auf Kernelebene aufgrund von E/A-Vorgängen blockiert wird, hat dies keine Auswirkungen auf den Betrieb anderer Threads.. Zu diesem Zeitpunkt wird die Prozessorzeitscheibe den Threads zugewiesen, sodass Prozesse mit mehreren Threads mehr Prozessorzeit erhalten.
    • Threads auf Benutzerebene beziehen sich auf Threads, die nicht auf dem Betriebssystemkern basieren und vom Anwendungsprozess mithilfe der Thread-Bibliothek gesteuert werden, um Funktionen zum Erstellen, Synchronisieren, Planen und Verwalten von Threads bereitzustellen. Da die Wartung von Threads auf Benutzerebene durch den Anwendungsprozess abgeschlossen wird, muss der Betriebssystemkernel die Existenz von Threads auf Benutzerebene nicht kennen, sodass er in Betriebssystemen mit mehreren Prozessen verwendet werden kann, die die Kernelebene nicht unterstützen Threads oder sogar Einzelbenutzer-Betriebssysteme. Für die Thread-Umschaltung auf Benutzerebene sind keine Kernel-Berechtigungen erforderlich, und der Thread-Planungsalgorithmus auf Benutzerebene kann für die Anwendung optimiert werden. Viele Anwendungsprogramme verfügen über eigene Threads auf Benutzerebene. Da die Planung von Threads auf Benutzerebene innerhalb des Anwendungsprozesses erfolgt,Normalerweise werden nicht präventive und einfachere Regeln verwendet, und es ist nicht erforderlich, zwischen Benutzermodus und Kernelmodus zu wechseln, sodass die Geschwindigkeit besonders hoch ist.. Da der Betriebssystemkernel die Existenz von Benutzerthreads nicht kennt, muss der gesamte Prozess natürlich warten, wenn ein Thread blockiert wird . Zu diesem Zeitpunkt wird dem Prozess die Prozessorzeitscheibe zugewiesen. Wenn sich im Prozess mehrere Threads befinden, wird die Ausführungszeit jedes Threads relativ verkürzt.
  • Gewindesperre

    Zu den Thread-Sperren gehören: gegenseitige Ausschlusssperren, bedingte Sperren, Spin-Sperren und Lese-/Schreibsperren. Generell gilt: Je leistungsfähiger das Schloss, desto geringer die Leistung.

    • Mutex-Sperre. Ein Mutex ist ein Semaphor, mit dem der sich gegenseitig ausschließende Zugriff mehrerer Threads auf gemeinsam genutzte Ressourcen gesteuert wird.
    • Bedingte Sperre. Eine bedingte Sperre ist eine Bedingungsvariable. Eine bedingte Sperre kann verwendet werden, um einen Thread zu blockieren, wenn eine bestimmte Bedingung erfüllt ist. Sobald die Bedingung erfüllt ist, wird ein aufgrund der Bedingung blockierter Thread in Form eines „Semaphors“ geweckt.
    • Spin-Lock. Ähnlich einem Mutex, aber anders.Wenn ein Thread keine Mutex-Sperre beantragt, wechselt er zu anderen Aufgaben. Wenn er keine Spin-Sperre beantragt, führt er die Schleife und Erkennung fort.
    • Lese-/Schreibsperre. Sperren für das Leser-Schreiber-Betriebsmodell wurden implementiert.

Thread-Status und Übergänge

Fügen Sie hier eine Bildbeschreibung ein

  • Sechs Thread-Zustände
    • Initial (NEU): Ein neues Thread-Objekt wird erstellt, aber die start()-Methode wurde noch nicht aufgerufen.
    • Bereitzustand (READY): Nachdem das Thread-Objekt erstellt wurde, wird die start()-Methode des Prozesses aufgerufen, und der Prozess tritt in den „ausführbaren Thread-Pool“ ein und wird ausführbar. Er muss nur warten, um das Recht zur Verwendung zu erhalten CPU vor dem Ausführen. Im AugenblickZusätzlich zur CPU hat der Thread im Bereitschaftszustand alle anderen für den Betrieb erforderlichen Ressourcen erhalten.. Da sich der neu erstellte Thread nicht im laufenden Zustand befinden darf, bevor er in den Bereitschaftszustand wechselt, kann er die start()-Methode selbst nicht aufrufen, sondern wird von anderen Threads im laufenden Zustand aufgerufen.
    • Ausführungsstatus (RUNNING): Nachdem der Thread im Bereitschaftsstatus die CPU erhalten hat, beginnt er mit der Ausführung des Thread-Codes.
    • BLOCKIERT: Der Thread gibt aus irgendeinem Grund das Recht auf, die CPU zu nutzen, und wird vorübergehend nicht mehr ausgeführt.
    • Warten (WAITING): Wenn ein Thread die Methode wait () verwendet, wechselt er in den Wartezustand (tritt in die Warteschlange ein). Durch den Eintritt in diesen Zustand werden die belegten Ressourcen freigegeben, was sich vom Blockieren unterscheidet.Dieser Zustand kann nicht automatisch aktiviert werden und muss darauf angewiesen sein, dass andere Threads die notify()-Methode aufrufen, um aktiviert zu werden.
    • Timeout-Warten (TIMED_WAITING): Dieser Zustand unterscheidet sich vom Wartezustand, ist ihm aber ähnlich. Der einzige Unterschied besteht darin, ob es ein Zeitlimit gibt, das heißt, der Thread in diesem Zustand wird nach einer bestimmten Wartezeit aktiviert Natürlich kann es auch vor diesem Zeitpunkt geweckt werden. Zuvor durch die Methode notify() geweckt.
    • TERMINATED: Zeigt an, dass die Ausführung des Threads abgeschlossen ist.

Vergleich von Threads und Prozessen

  • Terminplanung.In herkömmlichen Betriebssystemen ist die Grundeinheit mit Ressourcen und unabhängiger Planung ein Prozess. In Betriebssystemen, die Threads einführen, sind Threads die Grundeinheit der unabhängigen Planung und Prozesse die Grundeinheit des Ressourcenbesitzes.. Im selben Prozess führt der Thread-Wechsel nicht zu einem Prozesswechsel . Der Thread-Wechsel in verschiedenen Prozessen, z. B.
    der Wechsel von einem Thread in einem Prozess zu einem Thread in einem anderen Prozess, führt zu einem Prozesswechsel
    .
  • Ressourcen haben. Unabhängig davon, ob es sich um ein herkömmliches Betriebssystem oder ein Betriebssystem mit Threads handelt, ist ein Prozess die Grundeinheit, die Ressourcen besitzt, und ein Thread besitzt keine Systemressourcen (es gibt einige wesentliche Ressourcen, nicht alle Ressourcen), aber der Thread kann darauf zugreifen untergeordnet Die Systemressourcen des Prozesses.
  • Parallelität. In einem Betriebssystem, das Threads einführt, können nicht nur Prozesse gleichzeitig ausgeführt werden, sondern auch mehrere Threads innerhalb desselben Prozesses können gleichzeitig ausgeführt werden. Dies ermöglicht dem Betriebssystem eine bessere Parallelität und verbessert den Durchsatz des Systems erheblich.
  • Systemaufwand. Denn wenn ein Prozess erstellt oder abgebrochen wird, muss das System ihm Ressourcen wie Speicherplatz, E/A-Geräte usw. zuweisen oder zurückfordern.Der vom Betriebssystem gezahlte Overhead ist viel größer als der Overhead beim Erstellen oder Zerstören von Threads.. In ähnlicher Weise geht es beim Wechseln von Prozessen darum, die CPU-Umgebung des gesamten aktuellen Prozesses zu speichern und die CPU-Umgebung des neu geplanten Prozesses festzulegen: Beim Wechseln von Threads muss nur ein kleiner Teil des Registerinhalts gespeichert und festgelegt werden, sodass ein Overhead entsteht sehr klein. Da mehrere Threads im selben Prozess außerdem den Adressraum des Prozesses gemeinsam nutzen, sind Synchronisierung und Kommunikation zwischen mehreren Threads auch ohne Eingreifen des Betriebssystems sehr einfach zu erreichen.

Multithread-Modell

Einige Systeme unterstützen sowohl Threads auf Benutzerebene als auch Threads auf Kernelebene. Daher gibt es drei verschiedene Multithreading-Modelle, die auf den Verbindungsmethoden von Threads auf Benutzerebene und Threads auf Kernelebene basieren.

  • Viele-zu-eins-Modell. Das Viele-zu-Eins-Modell ordnet mehrere Threads auf Benutzerebene einem Thread auf Kernelebene zu. In Systemen, die dieses Modell verwenden, werden Threads im Benutzerbereich verwaltet und sind relativ effizient. Da jedoch mehrere Threads auf Benutzerebene einem Thread auf Kernelebene zugeordnet sind,Solange ein Thread auf Benutzerebene blockiert, wird der gesamte Prozess blockiert. Und da das System nur einen Thread (Thread auf Kernel-Ebene) erkennen kann, können mehrere Threads auf Benutzerebene des Prozesses, selbst wenn mehrere Prozessoren vorhanden sind, nur einen gleichzeitig ausführen und nicht parallel ausgeführt werden.
  • Eins-zu-eins-Modell. Das Eins-zu-eins-Modell ordnet Threads auf Kernelebene eins zu eins Threads auf Benutzerebene zu. Der Vorteil dabei istWenn ein Thread blockiert wird, hat dies keinen Einfluss auf die Ausführung anderer Threads. Daher ist die Parallelität des Eins-zu-Eins-Modells besser als die des Viele-zu-Eins-Modells.. Und dadurch kann Multi-Thread-Parallelität auf mehreren Prozessoren erreicht werden. Der Nachteil dieses Modells besteht darin, dass zum Erstellen eines Threads auf Benutzerebene ein entsprechender Thread auf Kernelebene erstellt werden muss.
  • Viele-zu-viele-Modell. Das Viele-zu-Viele-Modell ordnet mehrere Threads auf Benutzerebene mehreren Threads auf Kernelebene zu (die Anzahl der Threads auf Kernelebene ist nicht größer als die Anzahl der Threads auf Benutzerebene, und die Anzahl der Threads auf Kernelebene wird basierend auf der Anzahl der Threads bestimmt). unter bestimmten Umständen).Die Einführung eines solchen Modells kann die Einschränkungen der ersten beiden Modelle für Threads auf Benutzerebene aufheben und nicht nur die parallele Ausführung mehrerer Threads auf Benutzerebene im wahrsten Sinne des Wortes ermöglichen, sondern auch die Anzahl der Threads auf Benutzerebene nicht begrenzen.. Benutzern steht es frei, die erforderlichen Threads auf Benutzerebene zu erstellen. Mehrere Threads auf Kernelebene rufen Threads auf Benutzerebene nach Bedarf auf. Wenn ein Thread auf Benutzerebene blockiert, können andere Threads zur Ausführung geplant werden.

2.2 Prozessorplanung

2.2.1 Dreistufige Planung von Prozessoren

Die Planung ist eine Grundfunktion des Betriebssystems und fast alle Ressourcen müssen vor der Verwendung geplant werden. Da die CPU die Hauptressource des Computers ist, dreht sich beim Planungsentwurf alles darum, wie die CPU effizient genutzt werden kann.

In einer Multiprogrammierungsumgebung durchläuft ein Job normalerweise eine mehrstufige Planung von der Übermittlung bis zur Ausführung, z. B. eine Planung auf hoher Ebene, eine Planung auf mittlerer Ebene und eine Planung auf niedriger Ebene. Die Betriebsleistung des Systems hängt in hohem Maße von der Planung ab, sodass die Planung zum Schlüssel für Multiprogramming wird.

Erweiterte Planung (Jobplanung)

Erweiterte Planung wird auch Makroplanung, Jobplanung oder Langzeitplanung genannt.Die Hauptaufgabe besteht darin, nach bestimmten Prinzipien einen oder mehrere Jobs im Backup-Zustand auf dem externen Speicher auszuwählen, ihnen notwendige Ressourcen wie Speicher-Ein-/Ausgabegeräte zuzuweisen und entsprechende Prozesse einzurichten, damit der Job die Möglichkeit hat, einen Wettbewerber zu erhalten Prozessor. Rechte (ein Job ist die Summe der Arbeit, die der Benutzer dem Computer in einem Rechenprozess oder einer Transaktion abverlangt). Die Jobplanung wird seltener ausgeführt, normalerweise alle paar Minuten.

Der Scheduler muss entscheiden, wie viele Jobs das Betriebssystem zulassen kann?

Wie viele Jobs jedes Mal durch die Jobplanung in den Speicher aufgenommen werden, hängt vom Grad der Parallelität des Multiprogramms ab, d. h. davon, wie viele Jobs gleichzeitig im Speicher ausgeführt werden dürfen. Wenn im Speicher zu viele Jobs gleichzeitig ausgeführt werden können, kann dies die Servicequalität des Systems beeinträchtigen und beispielsweise zu einer zu langen Bearbeitungszeit führen. Wenn zu wenige Jobs gleichzeitig im Speicher ausgeführt werden, verringern sich die Auslastung der Systemressourcen und der Durchsatz. Daher sollte der Grad der Parallelität der Multiprogrammierung anhand der Größe und Laufgeschwindigkeit des Systems bestimmt werden.

Der Planer muss entscheiden, welche Jobs er zulässt?

Welche Jobs vom externen Speicher in den Speicher übertragen werden sollen, hängt vom verwendeten Planungsalgorithmus ab. Der einfachste Planungsalgorithmus ist der Planungsalgorithmus „Wer zuerst kommt, mahlt zuerst“, der die frühesten Jobs zuerst in den externen Speicher überträgt. Ein häufiger verwendeter Planungsalgorithmus ist der Planungsalgorithmus „Short-Job First“, der die Jobs mit überträgt Die kürzeste Ausführungszeit auf dem externen Speicher wird zuerst in den Speicher geladen. Jobs werden zuerst in den Speicher geladen, und es gibt andere Planungsalgorithmen.

Zwischenplanung

Zwischenplanung wird auch Mittelplanung oder Schaltplanung genannt.Um die Speicherauslastung und den Systemdurchsatz zu verbessern, wird die Zwischenplanung eingeführt. Ihre Hauptaufgabe besteht darin, die Prozesse mit laufenden Bedingungen im externen Speicher-Swap-Bereich gemäß den vorgegebenen Prinzipien und Strategien in den Speicher zu übertragen und ihren Status in den Bereitschaftszustand zu ändern und darauf zu warten Die Bereitschaftswarteschlange oder der Austausch des vorübergehend inoperablen Prozesses im Speicher in den externen Speicher-Auslagerungsbereich. Der Prozessstatus zu diesem Zeitpunkt wird als angehaltener Status bezeichnet.. Die Zwischenplanung umfasst hauptsächlich die Speicherverwaltung und -erweiterung (tatsächlich kann die Zwischenplanung als die Planung von Seiten zwischen außen und innen während des Pagings verstanden werden).

Low-Level-Scheduling (Prozessplanung)

Low-Level-Scheduling wird auch Mikro-Scheduling, Prozess-Scheduling oder Kurzstrecken-Scheduling genannt.Seine Hauptaufgabe besteht darin, nach einer bestimmten Strategie und Methode einen Prozess aus der Bereitschaftswarteschlange auszuwählen und ihm den Prozessor zuzuweisen. Die Ausführungsfrequenz der Prozessplanung ist sehr hoch, normalerweise alle zehn Millisekunden.

Der Unterschied zwischen High-Level-Planung und Low-Level-Planung:

  • Die Jobplanung bereitet den Prozess auf den Aufruf vor und die Prozessplanung ermöglicht den Aufruf des Prozesses. Mit anderen Worten,Das Ergebnis der Jobplanung ist, dass ein Prozess für den Job erstellt wird, und das Ergebnis der Prozessplanung ist, dass der Prozess ausgeführt wird
  • Die Anzahl der Jobplanungen ist gering und die Häufigkeit der Prozessplanung hoch.
  • Einige Systeme müssen keine Jobplanung festlegen, aber eine Prozessplanung ist erforderlich.

2.2.2 Grundprinzipien der Terminplanung

Unterschiedliche Planungsalgorithmen haben unterschiedliche Planungsstrategien, was auch bestimmt, dass Planungsalgorithmen unterschiedliche Auswirkungen auf verschiedene Arten von Jobs haben. Bei der Auswahl eines Planungsalgorithmus müssen wir die Eigenschaften verschiedener Algorithmen berücksichtigen. Um die Leistung von Planungsalgorithmen zu messen, wurden einige Bewertungskriterien vorgeschlagen.

CPU-Auslastung

Die CPU ist die wichtigste und teuerste Ressource des Systems und ihre Auslastung ist ein wichtiger Indikator für die Bewertung von Planungsalgorithmen. Bei Stapelverarbeitungs- und Echtzeitsystemen muss die CPU-Auslastung im Allgemeinen ein relativ hohes Niveau erreichen. Bei PCs und einigen Systemen, bei denen die Auslastung nicht im Vordergrund steht, ist die CPU-Auslastung jedoch nicht das Wichtigste.

Systemdurchsatz

Der Systemdurchsatz stellt die Anzahl der von der CPU pro Zeiteinheit abgeschlossenen Jobs dar. Bei langen Jobs führt dies zu einer Verringerung des Systemdurchsatzes, da die CPU-Verarbeitung viel Zeit in Anspruch nimmt. Bei kurzen Jobs ist das Gegenteil der Fall.

Reaktionszeit

Im Verhältnis zum Systemdurchsatz und zur CPU-Auslastung ist die Antwortzeit in erster Linie benutzerorientiert. In interaktiven Systemen, insbesondere in Mehrbenutzersystemen, bedienen mehrere Benutzer gleichzeitig das System, alle müssen innerhalb einer bestimmten Zeitspanne antworten, und die Prozesse einiger Benutzer können über einen längeren Zeitraum nicht aufgerufen werden. Aus Sicht des Benutzers sollte die Planungsstrategie daher eine möglichst kurze Antwortzeit gewährleisten, damit die Antwortzeit im für den Benutzer akzeptablen Bereich liegt.

Seitenwechsel

Aus Sicht jedes Auftrags ist die Zeit, die für die Erledigung des Auftrags benötigt wird, von entscheidender Bedeutung und wird normalerweise anhand der Bearbeitungszeit oder der gewichteten Bearbeitungszeit gemessen.

  • Bearbeitungszeit: bezieht sich auf die Zeitspanne von der Übermittlung bis zum Abschluss eines Auftrags, einschließlich Wartezeit und Ausführungszeit. Bearbeitungszeit Ti ; ausgedrückt alsBearbeitungszeit T i von Job i = Fertigstellungszeit von Job i – Abgabezeit von Job i

  • Durchschnittliche Bearbeitungszeit: Die durchschnittliche Bearbeitungszeit bezieht sich auf die durchschnittliche Bearbeitungszeit mehrerer Aufträge (z. B. n Aufträge). Die durchschnittliche Bearbeitungszeit T wird ausgedrückt alsT=(T 1 +T2 2 +…+T n ) /n

  • Gewichtete Bearbeitungszeit: Die gewichtete Bearbeitungszeit ist das Verhältnis der Auftragsbearbeitungszeit zur Laufzeit. Die gewichtete Bearbeitungszeit Wi des Auftrags i wird durch die Formel ausgedrücktW i = Bearbeitungszeit von Job i/Laufzeit von Job i

  • Durchschnittliche gewichtete Bearbeitungszeit: Ähnlich wie die durchschnittliche gewichtete Bearbeitungszeit ist die durchschnittliche gewichtete Bearbeitungszeit der Durchschnitt der gewichteten Bearbeitungszeiten für mehrere Aufträge.

2.2.3 Prozessplanung

In einem Multiprogrammierungssystem ist die Anzahl der Benutzerprozesse oft größer als die Anzahl der Prozessoren, was dazu führt, dass Benutzerprozesse um den Prozessor konkurrieren. Darüber hinaus erfordern Systemprozesse auch den Einsatz des Prozessors. Daher muss das System den Prozessor gemäß einer bestimmten Strategie dynamisch einem Prozess in der Bereitschaftswarteschlange zuweisen, um ihn auszuführen. Vom Prozessor zugewiesene Aufgaben werden vom Prozessplaner erledigt.

Prozessplanungsfunktion

  • Erfassen Sie die relevanten Informationen und Statusmerkmale aller Prozesse im System.
  • Wählen Sie den Prozess aus, um den Prozessor zu erhalten.
  • Prozessorzuordnung.

Was verursacht Prozessplanung?

  • Der aktuell laufende Prozess wird beendet. Es wird normal beendet, weil die Aufgabe abgeschlossen ist, oder es wird abnormal beendet, weil ein Fehler aufgetreten ist.
  • Der aktuell laufende Prozess wechselt aus bestimmten Gründen aus dem laufenden Zustand in den Blockierungszustand, z. B. I/Anforderung, P-Operation, Blockierungsgrundelement usw.
  • Kehren Sie nach dem Ausführen von Systemaufrufen und anderen Systemprogrammen zum Benutzerprozess zurück. Zu diesem Zeitpunkt kann davon ausgegangen werden, dass der Systemprozess ausgeführt wurde, und ein neuer Benutzerprozess kann geplant werden.
  • Wenn in einem System, das präventive Planung verwendet, ein Prozess mit einer höheren Priorität die Nutzung des Prozessors anfordert, wird der aktuell laufende Prozess in die Bereitschaftswarteschlange aufgenommen (dies hängt mit der Planungsmethode zusammen).
  • In einem Time-Sharing-System ist die dem Prozess zugewiesene Zeitscheibe erschöpft (dies hängt vom Systemtyp ab).

Wenn die Prozessplanung nicht durchgeführt werden kann

  • Bei der Verarbeitung von Interrupts. Der Interrupt-Verarbeitungsprozess ist komplex und es ist schwierig, Prozesse in der Implementierung zu wechseln. Darüber hinaus ist die Interrupt-Verarbeitung Teil der Systemarbeit und gehört logischerweise nicht zu einem bestimmten Prozess und sollte nicht von Prozessorressourcen beraubt werden.
  • Im kritischen Abschnitt des Kernelprogramms des Betriebssystems. Nachdem der Prozess in den kritischen Abschnitt gelangt ist, muss er exklusiv auf die freigegebenen Daten zugreifen und muss theoretisch gesperrt werden, um den Zugriff anderer paralleler Programme zu verhindern. Vor dem Entsperren sollte er nicht zu anderen Prozessen wechseln, um die Freigabe der freigegebenen Daten zu beschleunigen.
  • Bei anderen atomaren Vorgängen, die eine vollständige Maskierung von Interrupts erfordern. Atomare Vorgänge wie Sperren, Entsperren, Unterbrechen des Vor-Ort-Schutzes und Wiederherstellung. Atomare Operationen können nicht unterteilt werden und müssen einmal abgeschlossen werden. Eine Prozessumschaltung ist nicht möglich.

Wie Prozesse geplant werden

Die Prozessplanungsmethode istBezieht sich darauf, wie, wenn ein Prozess auf dem Prozessor ausgeführt wird, ein wichtigerer oder dringenderer Prozess verarbeitet werden muss (d. h. ein Prozess mit höherer Priorität in die Bereitschaftswarteschlange eintritt), wie der Prozessor dabei zugewiesen werden soll Zeit?

  • Präventiv: Auch als entzugsfähige Methode bekannt. Diese Planungsmethode bedeutet, dass, wenn ein Prozess auf dem Prozessor ausgeführt wird und ein Prozess mit einer höheren Priorität in die Bereitschaftswarteschlange eintritt, der ausgeführte Prozess sofort angehalten und der Prozessor dem neuen Prozess zugewiesen wird.
  • Nicht-präventive Methode. Auch als unveräußerliche Art bekannt. Diese Methode bedeutet, dass, wenn ein Prozess auf dem Prozessor ausgeführt wird, auch wenn ein Prozess mit einer höheren Priorität in die Bereitschaftswarteschlange eintritt, der ausführende Prozess weiterhin ausgeführt wird, bis der Prozess abgeschlossen ist oder aufgrund eines Ereignisses. Der Prozessor ist dem zugewiesen Neuer Prozess nur dann, wenn er den Abschluss- oder Blockierungsstatus erreicht.

2.2.4 Gängige Planungsalgorithmen

Der Planungsalgorithmus „Wer zuerst kommt, mahlt zuerst“ (Jobplanung, Prozessplanung)

Der First-Come-First-Served-Scheduling-Algorithmus (FCFS) ist der einfachste Planungsalgorithmus und kann für die Jobplanung und Prozessplanung verwendet werden. Die Grundidee besteht darin, Prozessoren in der Reihenfolge zuzuweisen, in der Prozesse in die Bereitschaftswarteschlange gelangen . Der Planungsalgorithmus „Wer zuerst kommt, mahlt zuerst“ verwendet eine nicht präemptive Planungsmethode . Das heißt, sobald ein Prozess (oder Job) den Prozessor belegt, wird er weiter ausgeführt, bis der Prozess (oder Job) seine Arbeit abschließt oder nicht mehr fortgesetzt werden kann aufgrund des Wartens auf ein Ereignis. Der Prozessor wird erst bei der Ausführung freigegeben.

Oberflächlich betrachtet ist der Planungsalgorithmus „Wer zuerst kommt, mahlt zuerst“ gegenüber allen Prozessen (oder Jobs) fair, d. h.Servieren Sie sie in der Reihenfolge, in der sie ankommen. Nehmen wir aber an, es gäbe die gleiche Anzahl an langen Prozessen (10t) und kurzen Prozessen (t). Da die Zahlen gleich sind, ist auch die Wahrscheinlichkeit, wer zuerst ankommt, gleich. Wenn der lange Prozess zuerst kommt, beträgt die Wartezeit des kurzen Prozesses 10 t, und wenn der kurze Prozess zuerst kommt, beträgt die Wartezeit des langen Prozesses nur t. AlsoDer Planungsalgorithmus „Wer zuerst kommt, mahlt zuerst“ eignet sich für lange Prozesse (Jobs) und nicht für kurze Prozesse (Jobs).

Heutzutage wird der Planungsalgorithmus „Wer zuerst kommt, mahlt zuerst“ nur noch selten als Hauptplanungsstrategie verwendet, insbesondere kann er nicht als Hauptplanungsstrategie für Time-Sharing-Systeme und Echtzeitsysteme verwendet werdenWird oft in Kombination mit anderen Planungsstrategien verwendet. Beispielsweise werden in einem System, das Priorität als Planungsrichtlinie verwendet, häufig mehrere Prozesse oder Jobs mit derselben Priorität nach dem Prinzip „Wer zuerst kommt, mahlt zuerst“ verarbeitet.

Planungsalgorithmus für kurze Jobprioritäten (Jobplanung, Prozessplanung)

Der Short Job First (SJF)-Planungsalgorithmus wird bei Verwendung für die Prozessplanung als Short Process First-Planungsalgorithmus bezeichnet . Dieser AlgorithmusEs kann sowohl für die Jobplanung als auch für die Prozessplanung verwendet werden.

Die Grundidee des Prioritätsplanungsalgorithmus für kurze Jobs (oder Prozesse) besteht darin, den Prozessor dem am schnellsten abgeschlossenen Job (oder Prozess) zuzuweisen . Beim Job-Scheduling wählt der Short-Job-Priority-Scheduling-Algorithmus jedes Mal einen oder mehrere Jobs mit der kürzesten geschätzten Laufzeit aus der Backup-Job-Warteschlange aus und überträgt sie in den Speicher, weist Ressourcen zu, erstellt Prozesse und stellt sie in die Bereitschaftswarteschlange. Bei der Prozessplanung wählt der Planungsalgorithmus für kurze Prozessprioritäten jedes Mal den Prozess mit der kürzesten geschätzten Laufzeit aus der Bereitschaftswarteschlange aus und weist ihm den Prozessor zu, sodass der Prozess ausgeführt werden kann und der Prozessor erst freigegeben wird, wenn er abgeschlossen oder für einige blockiert ist Grund.

Wenn alle Jobs gleichzeitig ankommen, ist der SJF-Planungsalgorithmus der beste Algorithmus mit der kürzesten durchschnittlichen Bearbeitungszeit (wenn der kurze Prozess zuerst ausgeführt wird, wartet der lange Prozess länger. Der lange Prozess, der zuerst ausgeführt wird, ist viel kürzer, daher ist die durchschnittliche Wartezeit viel kürzer Die Zeit ist am kürzesten, während der Prozess läuft. Die Zeit wird bestimmt und bleibt unverändert.. Aber der Algorithmus ist offensichtlichDies ist nicht gut für lange Jobs. Wenn ständig viele kurze Jobs in die Bereitschaftswarteschlange gelangen, werden lange Jobs „ausgehungert“, weil sie nicht für eine lange Zeit eingeplant werden können.(Das „Hunger“-Phänomen bedeutet, dass die Ausführung des Prozesses nicht geplant werden kann oder für einen bestimmten Zeitraum nicht die erforderlichen Ressourcen erhalten kann.)

Prioritätsplanungsalgorithmus (Jobplanung, Prozessplanung)

Der Prioritätsplanungsalgorithmus ist ein häufig verwendeter Prozessplanungsalgorithmus, der sowohl für die Jobplanung als auch für die Prozessplanung verwendet werden kann. Die Grundidee besteht darin, den Prozessor dem Prozess mit der höchsten Priorität zuzuweisen. Der AlgorithmusIm Kern geht es um die Priorisierung von Prozessen. Die Priorität eines Prozesses wird verwendet, um die Wichtigkeit des Prozesses auszudrücken, dh die Priorität seiner Ausführung.

Die Priorität eines Prozesses wird normalerweise in zwei Typen unterteilt: statische Priorität und dynamische Priorität.

  • Die statische Priorität wird beim Erstellen des Prozesses festgelegt und ändert sich während des gesamten Prozesses nicht. Die Grundlage für die Bestimmung der statischen Priorität ist wie folgt:
    • Wird durch die Prozessklasse bestimmt. Systemprozesspriorität > Benutzerprozesspriorität
    • Wird basierend auf den Ressourcenanforderungen des Jobs bestimmt. Prozesse, die mehr Ressourcen beanspruchen > Prozesse, die weniger Ressourcen beanspruchen
    • Bestimmt durch Benutzertyp und Anforderungen. Je höher der Gebührenstandard des Benutzers ist, desto höher ist die Priorität des Prozesses, der dem Job des Benutzers entspricht.
  • Dynamische Priorität bedeutet, dass beim Erstellen eines Prozesses eine Priorität basierend auf den Merkmalen des Prozesses und den damit verbundenen Situationen bestimmt wird und die Priorität entsprechend den Änderungen in der Situation während der Ausführung des Prozesses angepasst wird. Die Grundlage für die Bestimmung der dynamischen Priorität ist wie folgt:
    • Wird basierend auf der Zeitspanne bestimmt, die der Prozess die CPU belegt.Je länger ein Prozess die CPU beansprucht, desto niedriger ist seine Priorität., desto unwahrscheinlicher ist es, dass er erneut geplant wird. Umgekehrt gilt: Je kürzer die Zeit, die ein Prozess die CPU belegt, desto höher ist die Priorität und desto größer ist die Wahrscheinlichkeit,
      dass er erneut geplant wird.
    • Es hängt davon ab, wie lange der Prozess zwischen den CPUs wartet.Je länger ein Prozess in der Warteschlange wartet, desto höher ist seine Priorität., desto größer ist die Wahrscheinlichkeit, eingeplant zu werden. Umgekehrt gilt: Je kürzer die Zeit, die ein bereiter Prozess in der Bereitschaftswarteschlange wartet, desto niedriger ist die Priorität und desto geringer ist die Wahrscheinlichkeit, eingeplant zu werden.

Prioritätsbasierte Planungsalgorithmen können gemäß unterschiedlichen Planungsmethoden auch in nicht präventive Prioritätsplanungsalgorithmen und präventive Prioritätsplanungsalgorithmen unterteilt werden.

  • Die Implementierungsidee des nicht präventiven Prioritätsplanungsalgorithmus besteht darin, dass der Prozess weiter ausgeführt wird, bis er aus eigenen Gründen freiwillig aufgibt, sobald das System den Prozessor dem Prozess mit der höchsten Priorität in der Bereitschaftswarteschlange zuweist ( (z. B. Aufgabenerledigung oder Geräteanwendung usw.) Der Prozessor wird einem anderen Prozess mit der höchsten aktuellen Priorität zugewiesen.
  • Die Idee bei der Implementierung des präventiven Prioritätsplanungsalgorithmus besteht darin, die Verarbeitung dem Prozess mit der höchsten Priorität zuzuweisen und ihn laufen zu lassen. Sobald während der Ausführung des Prozesses ein anderer Prozess mit höherer Priorität auftritt (z. B. wenn ein Prozess mit höherer Priorität aufgrund des Auftretens eines Warteereignisses bereit wird), stoppt der Prozessplaner den aktuellen Prozess und verwendet den Prozessor, der ihm neu zugewiesen wird Prozesse mit höherer Priorität.

Zeitscheiben-Round-Robin-Planungsalgorithmus (Prozessplanung)

Die Prozessplanung verwendet normalerweise einen Zeitscheiben-Round-Robin-Planungsalgorithmus. Beim Time-Slice-Round-Robin-Scheduling-Algorithmus ordnet das System alle bereiten Prozesse in der Reihenfolge ihrer Ankunftszeit in einer Warteschlange an. Der Prozessplaner wählt immer den ersten Prozess in der Warteschlange zur Ausführung aus und legt eine bestimmte Ausführungszeit fest, die als a bezeichnet wird Zeitscheibe (z. B. 100 ms).Wenn der Prozess diese Zeitscheibe verbraucht (auch wenn der Prozess noch nicht beendet ist), sendet das System ihn an das Ende der Bereitschaftswarteschlange und weist den Prozessor dann dem nächsten bereiten Prozess zu. Auf diese Weise können die Prozesse in der Bereitschaftswarteschlange abwechselnd einen Zeitabschnitt der Verarbeitungszeit erhalten und dann zum Ende der Warteschlange zurückkehren, um auf die Ausführung zu warten. Dieser Zyklus wird bis zum Abschluss fortgesetzt.

Wenn die Zeitscheibe zu groß eingestellt ist und alle Prozesse innerhalb einer Zeitscheibe ausgeführt werden können, degeneriert der Zeitscheibenrotations-Planungsalgorithmus zu einem „Wer zuerst kommt, mahlt zuerst“-Scheduling-Algorithmus; ist die Zeitscheibe zu klein eingestellt, dann Der Prozessor befindet sich im Prozess. Durch häufiges Umschalten wird die Zeit reduziert, die der Prozessor tatsächlich mit der Ausführung von Benutzerprozessen verbringt. Daher sollte die Zeitscheibengröße entsprechend eingestellt werden.

Die Größe der Zeitscheibe wird durch folgende Faktoren bestimmt:

  • Reaktionszeit des Systems. Das Time-Sharing-System muss die Reaktionszeitanforderungen des Systems erfüllen. Die Beziehung zwischen der Systemantwortzeit und der Zeitscheibe kann ausgedrückt werden als

    T=Nxq
    In,T ist die Antwortzeit des Systems, die Größe der Zeitscheibe und N die Anzahl der Prozesse in der Bereitschaftswarteschlange.. Gemäß dieser Beziehung kann man wissen, dass bei konstanter Anzahl von Prozessen im System die Größe der Zeitscheibe proportional zur Systemantwortzeit ist .

  • Die Anzahl der Prozesse in der Bereitschaftswarteschlange. Wenn die Antwortzeit festgelegt ist, ist die Anzahl der Prozesse in der Bereitschaftswarteschlange umgekehrt proportional zur Größe der Zeitscheibe.

  • Systemverarbeitungsfunktionen. Häufig verwendete Befehle, die normalerweise eine Eingabe durch den Benutzer erfordern, können innerhalb einer Zeitscheibe verarbeitet werden. Je schneller der Computer also ist, desto mehr Befehle kann er pro Zeiteinheit verarbeiten und desto kleiner kann die Zeitscheibe sein.

Prioritätsplanungsalgorithmus mit hohem Antwortverhältnis (Jobplanung)

Der Prioritätsplanungsalgorithmus mit hohem Antwortverhältnis kombiniert die Merkmale des „Wer zuerst kommt, mahlt zuerst“ und des Planungsalgorithmus mit kurzer Jobpriorität, dh er berücksichtigt die beiden Faktoren Jobwartezeit und Joblaufzeit und gleicht die Tatsache aus, dass der vorherige Zwei Planungsalgorithmen berücksichtigen nur einen davon. Unzureichende Faktoren.

Der Prioritätsplanungsalgorithmus mit hohem Antwortverhältnis wird hauptsächlich für die Jobplanung verwendet. Die Grundidee besteht darin, dass jedes Mal, wenn ein Job geplant wird, zunächst die Antwortquote jedes Jobs in der Bereitschaftswarteschlange berechnet wird und dann der Job mit der höchsten Antwortquote ausgewählt und in Betrieb genommen wird.

Antwortverhältnis = Job-Antwortzeit/geschätzte Laufzeit

Im AugenblickAntwortverhältnis = (Auftragswartezeit + geschätzte Laufzeit) / geschätzte Laufzeit

Dieser Algorithmus bevorzugt kurze Jobs (bei gleicher Jobwartezeit gilt: Je kürzer die geschätzte Laufzeit, desto höher das Antwortverhältnis) und berücksichtigt gleichzeitig lange Jobs (sofern die Jobwartezeit lang genug ist, das Antwortverhältnis). wird das Höchste werden.Dieser Algorithmus berücksichtigt sowohl kurze als auch lange Jobs, erhöht jedoch den Systemaufwand, da das Antwortverhältnis jedes Sicherungsjobs berechnet werden muss.

Mehrstufiger Warteschlangenplanungsalgorithmus (Prozessplanung)

Mehrstufiger WarteschlangenplanungsalgorithmusDie Grundidee besteht darin, die Bereitschaftswarteschlange entsprechend der Art oder dem Typ des Prozesses in mehrere unabhängige Warteschlangen aufzuteilen, und jeder Prozess gehört zu einer festen Warteschlange. Jede Warteschlange verwendet einen Planungsalgorithmus, und verschiedene Warteschlangen können unterschiedliche Planungsalgorithmen verwenden.Richten Sie beispielsweise eine Bereitschaftswarteschlange für interaktive Aufgaben ein, die einen Zeitscheiben-Round-Robin-Planungsalgorithmus verwendet. Ein anderes Beispiel besteht darin, eine weitere Bereitschaftswarteschlange für Batch-Aufgaben einzurichten, die einen Planungsalgorithmus nach dem Prinzip „Wer zuerst kommt, mahlt zuerst“ verwendet.

Planungsalgorithmus für mehrstufige Feedback-Warteschlangen (Prozessplanung)

Der mehrstufige Feedback-Warteschlangen-Planungsalgorithmus ist die Synthese und Entwicklung des Zeitscheibenrotations-Planungsalgorithmus und des Prioritäts-Planungsalgorithmus. Durch die dynamische Anpassung der Prozesspriorität und der Zeitscheibengröße kann der mehrstufige Feedback-Warteschlangenplanungsalgorithmus mehrere Systemziele berücksichtigen.

Fügen Sie hier eine Bildbeschreibung ein

Zunächst sollten Sie mehrere Bereitschaftswarteschlangen einrichten und jeder Warteschlange eine andere Priorität zuweisen.Die erste Warteschlange hat die höchste Priorität, die zweite Warteschlange die zweithöchste Priorität und die Prioritäten der übrigen Warteschlangen nehmen sukzessive ab.

Zweitens ist auch die Größe der Ausführungszeitscheibe des Prozesses in jeder Warteschlange unterschiedlich: Je höher die Priorität der Warteschlange, in der sich der Prozess befindet, desto kürzer ist die entsprechende Zeitscheibe.Normalerweise ist die Zeitscheibe der i+1-Warteschlange doppelt so groß wie die Zeitscheibe der i-Warteschlange.

Wenn ein neuer Prozess in das System gelangt, sollte er am Ende der ersten Warteschlange platziert und nach dem Prinzip „Wer zuerst kommt, mahlt zuerst“ in die Warteschlange gestellt werden. Wenn der Prozess an der Reihe ist und er innerhalb dieser Zeitscheibe abgeschlossen werden kann, kann das System auf die Evakuierung vorbereitet werden: Wenn der Prozess am Ende einer Zeitscheibe noch nicht abgeschlossen ist, überträgt der Scheduler den Prozess an die Ende der zweiten Warteschlange. Warten Sie dann auf die Ausführung der Planung nach dem Prinzip „Wer zuerst kommt, mahlt zuerst“: Wenn der Prozess nach der Ausführung in der zweiten Warteschlange für eine Zeitscheibe nicht abgeschlossen ist, wird er in die dritte Warteschlange übertragen gleicher Weg. Anschließend wird in der letzten Warteschlange der Zeitscheiben-Round-Robin-Planungsalgorithmus verwendet.

Schließlich plant der Scheduler, dass der Prozess in der zweiten Warteschlange nur dann ausgeführt wird, wenn die erste Warteschlange inaktiv ist; der Prozess in der -1. Warteschlange ist so geplant, dass er nur ausgeführt wird, wenn die ersten bis -1. Warteschlangen leer sind. Wenn der Prozessor einen Prozess in der i-ten Warteschlange bedient und ein neuer Prozess mit einer höheren Priorität in die Warteschlange eintritt, belegt der neue Prozess den Prozessor des laufenden Prozesses, d. h. der Scheduler wird den ausgeführten Prozess zurückstellen am Ende der Warteschlange und der Prozessor wird dem neuen Prozess neu zugewiesen.

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

2.3 Synchronisierung und gegenseitiger Ausschluss

2.3.1 Grundkonzepte der Prozesssynchronisation

Zwei Arten von Einschränkungen

  • Indirekte gegenseitige Einschränkungsbeziehung (gegenseitiger Ausschluss): Wenn ein Prozess die Verwendung einer bestimmten Ressource erfordert und die Ressource von einem anderen Prozess verwendet wird und die Ressource nicht von zwei Prozessen gleichzeitig verwendet werden darf, dann der Prozess muss auf den Prozess warten, der die Ressource belegt hat. Geben Sie die Ressource frei, bevor Sie sie erneut verwenden. Die Grundform dieser Einschränkungsbeziehung ist „Prozess-Ressource-Prozess“ .

    Diese Einschränkungsbeziehung ergibt sich aus der Notwendigkeit, dass mehrere Prozesse desselben Typs bestimmte Systemressourcen (z. B. Drucker) gemeinsam nutzen müssen.Zwischen Prozessen desselben Typs wird ein gegenseitiger Ausschluss eingerichtet, um einen gegenseitigen exklusiven Zugriff auf Ressourcen zu erreichen (im Produzenten-Konsumenten-Problem müssen Produzenten beispielsweise einen gegenseitigen exklusiven Zugriff auf den Pufferpool benötigen).

  • direkte Zwangsbeziehung (Synchronisation)

    Ein Prozess kann nicht weiterlaufen, wenn er nicht die notwendigen Informationen erhält, die von einem anderen Prozess bereitgestellt werden. Diese Situation weist darauf hin, dass die beiden Prozesse an bestimmten Punkten Informationen austauschen und miteinander über ihren Betriebsstatus kommunizieren müssen. Die Grundform dieser Restriktionsbeziehung ist „Prozess-Prozess“ .

    Diese Einschränkung ergibt sich hauptsächlich aus der Zusammenarbeit zwischen Prozessen.Die Synchronisierung wird zwischen verschiedenen Prozessen festgelegt, um eine Synchronisierung zwischen mehreren Prozessen zu erreichen (z. B. kann beim Produzenten-Konsumenten-Problem der Produzent Produkte produzieren und in den Pufferpool legen, und der Verbraucher nimmt die Produkte zum Verbrauch aus dem Pufferpool. Wenn der Produzent: Wenn der Produzent das Produkt nicht produziert, kann der Verbraucher es nicht konsumieren.

Solange Prozesse desselben Typs in einer sich gegenseitig ausschließenden Beziehung stehen, stehen Prozesse unterschiedlichen Typs in einer Synchronisationsbeziehung. Beispielsweise stehen Verbraucher und Verbraucher in einer sich gegenseitig ausschließenden Beziehung und Verbraucher und Produzenten in einer Synchronisationsbeziehung.

Kritische Ressourcen und kritische Abschnitte

Wenn ein Prozess ausgeführt wird, teilt er im Allgemeinen Ressourcen mit anderen Prozessen, und einige Ressourcen werden exklusiv verwendet.Ressourcen, die jeweils nur von einem Prozess verwendet werden dürfen, werden als kritische Ressourcen bezeichnet. Viele physische Geräte sind kritische Ressourcen, wie Drucker, Plotter usw.

Der Zugriff auf kritische Ressourcen kann in vier Teile unterteilt werden:

Fügen Sie hier eine Bildbeschreibung ein

  • Betreten Sie den Bereich. Um den kritischen Abschnitt zu betreten und kritische Ressourcen zu nutzen, muss geprüft werden, ob der kritische Abschnitt im Eingangsbereich betreten werden kann.Wenn der kritische Abschnitt betreten werden kann, wird normalerweise das entsprechende Flag „Zugriff auf kritischen Abschnitt“ gesetzt, um zu verhindern, dass andere Prozesse gleichzeitig in den kritischen Abschnitt gelangen.
  • Kritischer Abschnitt.Code, der für den Zugriff auf kritische Ressourcen in einem Prozess verwendet wird, auch kritischer Abschnitt genannt
  • Ausgangszone.Der Teil nach dem kritischen Abschnitt, der zum Löschen des Protokolls „Zugriff auf kritische Abschnitte“ verwendet wird
  • verbleibende Fläche. Andere Teile des Prozesses als die oben genannten 3 Teile.

Einfach gesagt,Eine kritische Ressource ist eine Systemressource, auf die verschiedene Prozesse gegenseitigen exklusiven Zugriff erfordern, während ein kritischer Abschnitt ein Codeabschnitt in jedem Prozess ist, der auf kritische Ressourcen zugreift und zum entsprechenden Prozess gehört., müssen der Eingangsbereich und der Ausgangsbereich vor und nach dem kritischen Abschnitt für Inspektion und Wiederherstellung festgelegt werden.Kritische Abschnitte und kritische Ressourcen sind unterschiedlich. Kritische Ressourcen sind Ressourcen, auf die gegenseitig zugegriffen werden muss. Diese Ressource kann nur von einem Prozess gleichzeitig verwendet werden, aber es gibt mehr als einen Prozess, der diese Ressource benötigt. Daher werden Prozesse verwendet, die kritisch sind Ressourcen müssen verarbeitet werden. verwalten, woraus auch das Konzept des kritischen Abschnitts entstand.

Der kritische Abschnittscode jedes Prozesses kann unterschiedlich sein . Welche Vorgänge ein Prozess an kritischen Ressourcen ausführt, hat nichts mit der Verwaltung kritischer Ressourcen und der gegenseitigen Ausschlusssynchronisierung zu tun.

Sich gegenseitig ausschließende Konzepte und Anforderungen

Wenn ein Prozess gemäß der Definition des gegenseitigen Ausschlusses in einen kritischen Abschnitt eintritt, um eine kritische Ressource zu verwenden, muss der andere Prozess warten, bis der Prozess, der die kritische Ressource belegt, den kritischen Abschnitt verlässt, bevor der neue Prozess auf die kritische Ressource zugreifen darf.

Um zu verhindern, dass zwei Prozesse gleichzeitig in den kritischen Abschnitt gelangen, sollte der Softwarealgorithmus oder Synchronisationsmechanismus die folgenden Richtlinien befolgen:

  • Einlass, wenn frei . Wenn sich kein Prozess im kritischen Abschnitt befindet, kann einem Prozess, der den Eintritt in den kritischen Abschnitt anfordert, gestattet werden, sofort seinen eigenen kritischen Abschnitt zu betreten.
  • Wenn Sie beschäftigt sind, warten Sie . Wenn ein Prozess seinen kritischen Abschnitt betreten hat, müssen andere Prozesse, die versuchen, in den kritischen Abschnitt einzutreten, warten.
  • Begrenzte Wartezeit . Prozesse, die Zugriff auf kritische Ressourcen erfordern, sollten garantiert innerhalb einer begrenzten Zeit in ihren kritischen Abschnitt gelangen können.
  • Lass die Kraft warten . Wenn ein Prozess aus irgendeinem Grund nicht in seinen kritischen Abschnitt gelangen kann, sollte der Prozessor für andere Prozesse freigegeben werden.

Synchronisationskonzept und Implementierungsmechanismus

Im Allgemeinen ist die Geschwindigkeit, mit der ein Prozess im Verhältnis zu einem anderen Prozess ausgeführt wird, undefiniert. Mit anderen Worten: Prozesse laufen in einer asynchronen Umgebung. Doch wechselseitig kooperative Prozesse erfordern eine Koordinierung ihrer Anstrengungen an bestimmten kritischen Punkten.Die sogenannte Prozesssynchronisation bedeutet, dass mehrere kooperierende Prozesse an einigen Schlüsselpunkten möglicherweise aufeinander warten oder Informationen miteinander austauschen müssen. Diese gegenseitige Einschränkungsbeziehung wird als Prozesssynchronisation bezeichnet.. Die Synchronisierung kann mithilfe von Semaphoren erreicht werden .

2.3.2 Methode zur Implementierung des gegenseitigen Ausschlusses

Gegenseitiger Ausschluss kann entweder mit Software- oder Hardwaremethoden implementiert werden.

Software-Ansatz

Algorithmus 1: Legen Sie eine öffentliche Ganzzahlvariable turn fest, um die Prozess-ID darzustellen, die den kritischen Abschnitt betreten darf. Wenn turn 0 ist, darf Prozess P 0 in den kritischen Abschnitt eintreten; andernfalls wird die Variable in einer Schleife überprüft, bis turn zur Identität des Prozesses wird; im Ausgangsbereich ist die Identität des Prozesses P 0, der eintreten darf geändert auf 1. Der Algorithmus für Prozess P 1 ist diesem ähnlich. Die Programmstruktur der beiden Prozesse ist wie folgt:

Fügen Sie hier eine Bildbeschreibung ein

Diese Methode garantiert einen sich gegenseitig ausschließenden Zugriff auf kritische Ressourcen, aberDas Problem besteht darin, dass es leicht zu einer unzureichenden Ressourcenauslastung führen kann, wenn zwei Prozesse gezwungen werden, in abwechselnder Reihenfolge in den kritischen Abschnitt einzutreten.

Wenn beispielsweise Prozess P 0 den kritischen Abschnitt verlässt, wird turn auf 1 gesetzt, um Prozess P 1 den Eintritt in den kritischen Abschnitt zu ermöglichen. Wenn jedoch Prozess P 1 vorübergehend keinen Zugriff auf die kritische Ressource benötigt und P 0 darauf zugreifen möchte Wenn Sie die kritische Ressource erneut aufrufen, kann der kritische Abschnitt nicht betreten werden. Es ist ersichtlich, dass dieser Algorithmus die Umsetzung des Kriteriums „Leerlauf nachgeben“ nicht garantieren kann .

Algorithmus 2: Setzen Sie das Flag-Array-Flag, um anzuzeigen, ob der Prozess im kritischen Abschnitt ausgeführt wird und die Anfangswerte alle falsch sind. Bevor jeder Prozess auf die kritische Ressource zugreift, prüfen Sie zunächst, ob sich ein anderer Prozess im kritischen Abschnitt befindet. Wenn nicht, ändern Sie das Flag für den kritischen Abschnitt dieses Prozesses auf „True“ und geben Sie den kritischen Abschnitt ein. Ändern Sie das Flag für den kritischen Abschnitt dieses Prozesses in „False“. Ausgangsbereich. . Die Programmstruktur der beiden Prozesse ist wie folgt:

Fügen Sie hier eine Bildbeschreibung ein

Dieser Algorithmus löst das Problem des „freien Eintritts“,Es entsteht jedoch ein neues Problem: Wenn keiner der Prozesse den kritischen Abschnitt betritt, sind ihre jeweiligen Zugriffsflags falsch. Wenn zu diesem Zeitpunkt beide Prozesse gleichzeitig in den kritischen Abschnitt eintreten möchten und beide Prozesse den Flag-Wert der anderen Partei feststellen ist falsch (wenn die beiden Prozesse abwechselnd die Prüfanweisungen ausführen, erfüllen beide die Bedingung flag[]=false), sodass die beiden Prozesse gleichzeitig in ihre jeweiligen kritischen Abschnitte eintreten, was gegen die Zugriffsregel des kritischen Abschnitts „Warten wann“ verstößt beschäftigt"

Algorithmus 3: Dieser Algorithmus setzt immer noch das Flag-Array-Flag, aber das Flag wird verwendet, um anzuzeigen, ob der Prozess den kritischen Abschnitt betreten möchte. Bevor jeder Prozess auf die kritische Ressource zugreift, setzt er zunächst sein eigenes Flag auf true, um anzuzeigen, dass er hofft um in den kritischen Abschnitt zu gelangen, und überprüft dann den anderen Prozess. Ein Prozessflag. Wenn das Flag eines anderen Prozesses wahr ist, wartet der Prozess; andernfalls gelangt er in den kritischen Abschnitt. Die Programmstruktur der beiden Prozesse ist wie folgt:

Fügen Sie hier eine Bildbeschreibung ein

Dieser Algorithmus kann effektiv verhindern, dass zwei Prozesse gleichzeitig in den kritischen Abschnitt gelangen.Es besteht jedoch das Problem, dass keiner der Prozesse den kritischen Abschnitt betreten kann. Das heißt, wenn zwei Prozesse gleichzeitig in den kritischen Abschnitt gelangen möchten, setzen sie ihre eigenen Flags auf „true“ und prüfen den Status der anderen Partei Gleichzeitig wird festgestellt, dass die andere Partei ebenfalls den kritischen Bereich betreten möchte. Daher blockieren sich beide selbst, was dazu führt, dass beide den kritischen Bereich nicht betreten können, was zu einem „Dead Wait“-Phänomen führt, das gegen die „begrenzten“ Regeln verstößt „Warten“-Prinzip

Algorithmus 4: Die Idee dieses Algorithmus ist eine Kombination aus Algorithmus 3 und Algorithmus 1 . Das Flag-Array flag[] gibt an, ob der Prozess den kritischen Abschnitt betreten oder im kritischen Abschnitt ausführen möchte. Darüber hinaus wird eine Turn-Variable festgelegt, die die Prozess-ID darstellt, die den kritischen Abschnitt betreten darf. Die Programmstruktur der beiden Prozesse ist wie folgt:

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Zu diesem Zeitpunkt kann Algorithmus 4 völlig normal funktionieren,Verwenden Sie flag[], um den sich gegenseitig ausschließenden Zugriff auf kritische Ressourcen zu lösen, und verwenden Sie tumn, um das Phänomen „Hunger“ zu lösen

Hardware-Methode

Es gibt große Einschränkungen bei der vollständigen Verwendung von Softwaremethoden, um einen gegenseitigen Ausschluss von Prozessen zu erreichen, und Softwaremethoden allein werden heutzutage nur noch selten verwendet. Die Hauptidee der Hardware-Methode besteht darin, einen Befehl zu verwenden, um die beiden Vorgänge der Überprüfung und Änderung des Flags abzuschließen und so sicherzustellen, dass die Überprüfungs- und Änderungsvorgänge nicht unterbrochen werden; oder sicherzustellen, dass die Überprüfung und Änderung als ausgeführt wird Ganzes durch Interrupt-Maskierung .

Es gibt zwei Haupt-Hardware-Methoden: Eine ist die Interrupt-Maskierung, die andere sind Hardware-Anweisungen

Vorteile des Hardware-Ansatzes :

  • Breites Anwendungsspektrum. Der Hardware-Ansatz funktioniert mit einer beliebigen Anzahl von Prozessen und ist in Einprozessor- und Multiprozessorumgebungen identisch.
  • Einfach. Die Flags von Hardwaremethoden sind einfach zu setzen, haben klare Bedeutungen und lassen sich leicht auf ihre Richtigkeit überprüfen.
  • Unterstützt mehrere kritische Abschnitte. Wenn es in einem Prozess mehrere kritische Abschnitte gibt, müssen Sie nur für jeden kritischen Abschnitt eine boolesche Variable einrichten.

Der Hardware-Ansatz hat viele Vorteile, aber auch einige Nachteile, die nicht allein behoben werden können.Zu diesen Mängeln gehört hauptsächlich, dass der Prozess beim Warten auf den Eintritt in den kritischen Abschnitt Prozessorzeit verbraucht und kein „Warten auf Strom“ realisieren kann (wobei Software erforderlich ist, um mit der Beurteilung zusammenzuarbeiten). Der Auswahlalgorithmus des Prozesses, der in den kritischen Abschnitt eintritt, weist einige Mängel auf die Hardware-Implementierung, was dazu führen kann, dass einige Prozesse nie ausgewählt werden, was zu einem „Aushungern“ führt.

2.3.3 Signalmenge

Obwohl die zuvor erläuterten Software- und Hardwaremethoden das Problem des gegenseitigen Ausschlusses lösen können, weisen sie alle Mängel auf. Der Algorithmus der Softwaremethode ist zu komplex, ineffizient und nicht intuitiv, und es kommt zu einem „Busy Wait“-Phänomen (die Flag-Variable wird beim Betreten der Zone kontinuierlich erkannt). Was die Hardware-Methode betrifft, so ist die Interrupt-Maskierungsmethode für Benutzerprozesse kein geeigneter gegenseitiger Ausschlussmechanismus; die Hardware-Anweisungsmethode weist Mängel auf, wie z. B. die Unfähigkeit, „Rechtswarten“ zu implementieren.

Semaphore und Synchronisationsprimitive

Das Semaphor ist ein bestimmtes Tupel (s, q), wobei s eine ganzzahlige Variable mit einem nicht negativen Anfangswert und q eine Warteschlange ist, deren Anfangszustand leer ist.Die Ganzzahlvariable s stellt die Anzahl einer bestimmten Art von Ressource im System dar. Wenn ihr Wert größer als 0 ist, stellt sie die Anzahl der aktuell verfügbaren Ressourcen im System dar. Wenn ihr Wert kleiner als 0 ist, stellt ihr absoluter Wert dies dar Das System ist aufgrund von Anforderungen für diese Art von Ressource blockiert. Anzahl der Prozesse. Zusätzlich zum Anfangswert des SemaphorsDer Wert des Semaphors kann nur durch die P-Operation (auch Warteoperation genannt) und die V-Operation (auch Signaloperation genannt) geändert werden.. Das Betriebssystem nutzt seinen Zustand zur Verwaltung von Prozessen und Ressourcen.

Die Errichtung eines Semaphors muss erklärt werden,Das heißt, die Bedeutung und der Anfangswert von s sollten genau erklärt werden (Hinweis: Dieser Anfangswert ist kein negativer Wert). Für jedes Semaphor gibt es eine entsprechende Warteschlange. Wenn das Semaphor eingerichtet ist, ist die Warteschlange leer.

Lass uns ein Semaphor sein,

Wenn P(s) ausgeführt wird, werden hauptsächlich die folgenden Aktionen ausgeführt: Zuerst wird s=s-1 ausgeführt; wenn s>=0, wird der Prozess weiter ausgeführt; wenn s<0, wird der Prozess blockiert und in die Warteschleife von eingefügt das Semaphor. in der Warteschlange .

Wenn V(s) ausgeführt wird, führt es hauptsächlich die folgenden Aktionen aus: Führen Sie zuerst s-s+1 aus. Wenn s > 0, wird der Prozess weiter ausgeführt: Wenn s <= 0, entfernen Sie den ersten Prozess aus der Semaphor-Warteschlange. Dadurch wird es bereit und in die Bereitschaftswarteschlange eingefügt. Anschließend kehrt es zum ursprünglichen Prozess zurück, um die Ausführung fortzusetzen .

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Sowohl die P- als auch die V-Operation sind unteilbare atomare Operationen, wodurch sichergestellt wird, dass der Betrieb des Semaphors nicht unterbrochen oder blockiert wird.. Die P-Operation entspricht der Beantragung von Ressourcen, und die V-Operation entspricht der Freigabe von Ressourcen .P-Operationen und V-Operationen müssen paarweise im System auftreten, sie befinden sich jedoch nicht unbedingt in einem Prozess und können auf verschiedene Prozesse verteilt sein.

Klassifizierung von Semaphoren

  • Ganzzahliges Semaphor: Ganzzahliges Semaphor ist eine Ganzzahl s,Mit Ausnahme der Initialisierung kann darauf nur über die standardmäßigen atomaren Operationen P und V zugegriffen werden.. Ganzzahliges Semaphor führt P- und V-Operationen ein, aber wenn P-Operationen ausgeführt werden,Wenn keine Ressourcen verfügbar sind, testet der Prozess weiterhin das Semaphor, was zu einem „Busy Wait“-Phänomen führt und das Prinzip „Warten auf Recht“ nicht befolgt.

  • Datensatz-Semaphor (Ressourcen-Semaphor): Um das Problem des „beschäftigten Wartens“ des Ganzzahl-Semaphors zu lösen, wird eine verknüpfte Listenstruktur hinzugefügt, um alle Prozesse zu verknüpfen, die auf die Ressource warten. Der Datensatz-Semaphor ist genau wegen seiner Verwendung des Datensatztyps nach dem benannt Datenstruktur.

    Wenn der Prozess eine P-Operation für das Semaphor durchführt und zu diesem Zeitpunkt keine verbleibenden Ressourcen verfügbar sind, blockiert sich der Prozess selbst, gibt den Prozessor auf und fügt ihn in die Warteliste ein. Man erkennt, dass dieser Mechanismus dem Prinzip „Macht geben und abwarten“ folgt. Wenn der Prozess eine V-Operation für das Semaphor ausführt und in der verknüpften Liste noch Prozesse auf die Ressource warten, wird der erste wartende Prozess in der verknüpften Liste aktiviert.

    Wenn der Anfangswert des Semaphors 1 ist, bedeutet dies, dass es sich bei der Ressource um eine kritische Ressource handelt, auf die nur ein Prozess gleichzeitig zugreifen kann.

Anwendung von Semaphoren

  • Prozesssynchronisierung realisieren

    Angenommen, es gibt gleichzeitige Prozesse P 1 und P 2 . Es gibt eine Anweisung S 1 in P 1 und eine Anweisung S 2 in P 2. S 1 muss vor S 2 ausgeführt werden . Dieses Synchronisationsproblem lässt sich leicht mit Semaphoren lösen.

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

  • Implementieren Sie den Prozess des gegenseitigen Ausschlusses

    Nehmen Sie an, dass es Prozesse P 1 und P 2 gibt , die beide ihre eigenen kritischen Abschnitte haben, aber das System erfordert, dass nur ein Prozess gleichzeitig in seinen eigenen kritischen Abschnitt eintreten kann. Durch die Verwendung von Semaphoren kann hier der sich gegenseitig ausschließende Eintrag kritischer Abschnitte leicht gelöst werden. Stellen Sie das Semaphor N auf einen Anfangswert von 1 ein (dh die Anzahl der verfügbaren Ressourcen beträgt 1). Sie müssen nur den kritischen Abschnitt zwischen P (N) und V (N) platzieren, um den exklusiven Eintritt der beiden Prozesse zu realisieren .

Fügen Sie hier eine Bildbeschreibung ein

Wenn zwei oder mehr Prozesse einen sich gegenseitig ausschließenden Zugriff auf eine Ressource benötigen, können Sie ein Semaphor mit einem Anfangswert von 1 festlegen und P-Operationen und V-Operationen für das Semaphor ausführen, bevor und nachdem der Code dieser Prozesse auf die Ressource zugreift. um sicherzustellen, dass sich der Prozess gegenseitig ausschließt und auf die Ressource zugreifen kann

2.3.4 Klassisches Synchronisationsproblem

Produzenten-Konsumenten-Problem

Das Producer-Consumer-Problem ist ein bekanntes Problem der Prozesssynchronisation.Es beschreibt eine Gruppe von Herstellern, die Produkte an eine Gruppe von Verbrauchern liefern. Sie teilen sich eine abgegrenzte Pufferzone, in der Hersteller Produkte abgeben und Verbraucher Produkte mitnehmen.. Dieses Problem ist eine Abstraktion vieler wechselseitig kooperativer Prozesse. Beispielsweise ist bei der Eingabe der Eingabeprozess der Produzent und der Rechenprozess der Konsument; bei der Ausgabe ist der Rechenprozess der Produzent und der Druckprozess der Konsument.

Um dieses Problem zu lösen, sollten zwei Synchronisationssemaphoren eingerichtet werden: eines gibt die Anzahl der leeren Puffer an, ausgedrückt als leer, und der Anfangswert ist die begrenzte Puffergröße n; das andere gibt die Anzahl der vollen Puffer an (d. h. die Anzahl). Produkte), ausgedrückt als vollständig, bedeutet, dass der Anfangswert 0 ist . Darüber hinaus muss ein Mutex-Semaphor mit einem Anfangswert von 1 festgelegt werden, um sicherzustellen, dass mehrere Produzenten oder Verbraucher gegenseitig auf den Pufferpool zugreifen können .

Fügen Sie hier eine Bildbeschreibung ein

Die Reihenfolge von P(voll)/P(leer) und P(Mutex) kann nicht umgekehrt werden. Die P-Operation muss zuerst am Ressourcensemaphor und dann die P-Operation am Mutex-Semaphor ausgeführt werden, sonst kommt es zu einem Deadlock.

Für den Fall, dass mehrere Semaphore gleichzeitig vorhanden sind,Die P-Operation kann normalerweise nicht rückgängig gemacht werden. Die P-Operation muss zuerst für das Ressourcensemaphor und dann die P-Operation für das sich gegenseitig ausschließende Semaphor ausgeführt werden.Dies kann sicherstellen, dass Ressourcen verwendet werden können, wenn die Semaphor-Zugriffsrechte belegt sind. Andernfalls kommt es zu einem „Dead Wait“-Phänomen, bei dem die Nutzungsrechte belegt sind, aber keine Ressourcen verfügbar sind .

Immer wenn mehrere Prozesse desselben Typs vorhanden sind, ist ein sich gegenseitig ausschließendes Semaphor erforderlich.

Leser-Schreiber-Problem

Beim Leser-Schreiber-Problem gibt es einen Datenbereich, der von vielen Prozessen gemeinsam genutzt wird. Dieser Datenbereich kann eine Datei oder ein Speicherplatz im Hauptspeicher sein. Es gibt einige Prozesse (Leser), die diesen Datenbereich nur lesen, und einige Prozesse, die nur lesen Der Datenbereich. Der Prozess (Writer), der Daten schreibt. Darüber hinaus müssen folgende Bedingungen erfüllt sein:

  • Beliebig viele Leser können diese Datei gleichzeitig lesen.
  • Es kann immer nur ein Autor gleichzeitig in die Datei schreiben (die Autoren müssen sich gegenseitig ausschließen).
  • Wenn ein Schreiber aktiv ist, ist es jedem Leseprozess untersagt, die Datei zu lesen, und jedem anderen Schreibprozess ist es untersagt, die Datei zu schreiben.
  • Reader-First-Algorithmus

    Wenn ein Leser versucht, einen Lesevorgang auszuführen, kann er den Lesevorgang direkt starten, ohne zu warten, wenn zu diesem Zeitpunkt ein anderer Leser einen Lesevorgang ausführt. Solange es Leser gibt, die Lesevorgänge ausführen, können Schreiber nicht schreiben, aber nachfolgende Leser können Lesevorgänge direkt ausführen. Solange also Leser nacheinander ankommen, können Leser mit dem Lesevorgang beginnen, sobald sie ankommen, und den Schreibvorgang starten Es kann nur darauf gewartet werden, dass alle Leser mit dem Lesen fertig sind. Schreibvorgänge können erst nach dem Beenden ausgeführt werden. Dies ist die Priorität des Lesers.

    Um dieses Problem zu lösen, müssen Sie die folgenden Semaphoren einrichten:Legen Sie die ganzzahlige Variable readcount fest, die die Anzahl der Leser aufzeichnet. Der Anfangswert ist 0. Wenn der Wert größer als 0 ist, bedeutet dies, dass ein Leser vorhanden ist und der Schreiber keine Schreibvorgänge ausführen kann: Legen Sie den Anfangswert des Mutex-Semaphors rmutex fest auf 1, um mehrere sich gegenseitig ausschließende Zugriffe des Leseprozesses auf readcount sicherzustellen: Legen Sie den sich gegenseitig ausschließenden Semaphor-Mutex mit einem Anfangswert von 1 fest, um den sich gegenseitig ausschließenden Zugriff des Schreibprozesses auf den Datenbereich zu steuern.. Der Algorithmus ist wie folgt:

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

  • Fair-Case-Algorithmus

    Die Ausführungsreihenfolge der Prozesse entspricht genau der Reihenfolge ihres Eintreffens.Das heißt, wenn ein Leser versucht, einen Lesevorgang auszuführen, ein Schreiber auf einen Schreibvorgang wartet oder einen Schreibvorgang ausführt, müssen nachfolgende Leser warten, bis der erste ankommende Schreiber den Schreibvorgang abgeschlossen hat, bevor sie den Lesevorgang starten.

    Um dieses Problem zu beheben,Im Vergleich zum Reader-First-Algorithmus muss ein Semaphor-wmutex hinzugefügt werden. Sein Anfangswert ist 1 und wird verwendet, um anzuzeigen, ob ein Autor schreibt oder wartet. Wenn ein Autor vorhanden ist, ist die Eingabe neuer Leser verboten .. Der Algorithmus ist wie folgt:

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

  • Writer First-Algorithmus

    In einigen Büchern wird der Fair-Situation-Algorithmus auch als „Writer-First“ bezeichnet, aber er ist nicht „Writer-First“ im eigentlichen Sinne. Er führt lediglich Lese- und Schreibvorgänge in der Reihenfolge ihres Eintreffens aus. Zuerst den wahren Schriftsteller erreichen (d. h.Wenn Autoren und Leser gleichzeitig warten, können nachfolgende Autoren bei deren Ankunft vor den wartenden Lesern in die Warteschlange springen. Solange sich ein Autor in der Warteschlange befindet, werden sie, unabhängig davon, wann sie ankommen, vor dem geweckt Leser.), müssen Sie zur Steuerung zusätzliche Semaphore hinzufügen.

    Um diesen Zweck zu erreichen,Es muss ein zusätzlicher lesbarer Semaphor hinzugefügt werden, um zu steuern, dass Autoren, wenn sie eintreffen, den kritischen Abschnitt vor den Lesern betreten können. Wenn ein Autor eintrifft, müssen Sie nur warten, bis der vorherige Autor mit dem Schreiben fertig ist, bevor Sie direkt in den kritischen Abschnitt gelangen, unabhängig davon der Leser. Ob es vor oder nach dem Autor ankommt. Darüber hinaus muss ein ganzzahliger Writeount hinzugefügt werden, um die Anzahl der Autoren zu zählen. Im Vergleich zum vorherigen Algorithmus hat sich die Rolle von wmutex geändert: Es wird nun verwendet, um den sich gegenseitig ausschließenden Zugriff von Autoren auf writecount zu steuern.. Der Algorithmus ist wie folgt:

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

Diese Methode fügt ein lesbares Semaphor hinzu, damit Autoren in die Reihe springen können.Wenn der erste Autor eintrifft, beantragt er die Belegung des lesbaren Semaphors. Nach erfolgreicher Besetzung wird er weiterhin belegt. Nachfolgende Leserprozesse werden blockiert, da sie sich nicht um das lesbare Semaphor bewerben können. Wenn nachfolgende Autoren eintreffen, tun sie dies nicht Es muss ein lesbares Semaphor beantragt werden. Das Semaphor wird daher hinter dem Schreiber in die Warteschlange gestellt, wodurch der Zweck des Springens in die Warteschlange erreicht wird. Leser können nicht weiterlesen, bis alle Autoren mit dem Schreiben fertig sind und der letzte Autor das lesbare Semaphor freigibt. Wenn ein neuer Autor eintrifft, belegen Sie weiterhin das lesbare Semaphor, verhindern Sie, dass nachfolgende Leser Lesevorgänge ausführen, und wiederholen Sie diesen Vorgang.. Dieser Algorithmus implementiert tatsächlich die Schreibpriorität, und neue Schreiber können auch den Datenbereich belegen, bevor die ersten ankommenden Leser arbeiten .

Das Speiseproblem der Philosophen

5 Philosophen sitzen um einen runden Tisch. Auf dem Tisch befinden sich 5 Stifte, einer zwischen jeweils zwei Philosophen: Zu den Handlungen des Philosophen gehören Denken und Essen. Beim Essen muss er die beiden Stifte links und rechts gleichzeitig aufnehmen . zwei Stäbchen, und wenn Sie nachdenken, legen Sie die beiden Stäbchen gleichzeitig wieder an ihren ursprünglichen Platz zurück. Das Dining-Philosophen-Problem kann als typisches Problem des Umgangs mit kritischen Ressourcen bei gleichzeitiger Ausführung von Prozessen angesehen werden.

Essstäbchen sind wichtige Ressourcen und können nicht von zwei Philosophen gleichzeitig verwendet werden. Daher wird ein Semaphor-Array zur Darstellung von Essstäbchen verwendet.

Fügen Sie hier eine Bildbeschreibung ein

Diese Lösung ist problematisch und führt zu einem Stillstand (wenn 5 Philosophen gleichzeitig hungrig sind und jeder die Stäbchen auf der linken Seite nimmt, sind alle 5 Stäbchen besetzt. Wenn sie versuchen, die Stäbchen auf der rechten Seite zu nehmen, werden sie alle besetzt sein blockiert sein, weil sie keine Stäbchen haben. „warte unendlich“) .

Für dieses Deadlock-Problem können die folgenden Lösungen verwendet werden:

  • Es dürfen nur maximal 4 Philosophen gleichzeitig essen.
  • Ein Philosoph kann nur dann Stäbchen in die Hand nehmen, wenn die Stäbchen auf seiner linken und rechten Seite gleichzeitig verfügbar sind.
  • Zählen Sie die Philosophen und bitten Sie den Philosophen mit der ungeraden Zahl, zuerst das linke Stäbchen zu nehmen, und den Philosophen mit der geraden Zahl, zuerst das rechte Stäbchen zu nehmen.

Hier ist die Lösung für die letzte Methode: Es wird festgelegt, dass der Philosoph mit der ungeraden Zahl zuerst das linke Stäbchen und dann das rechte Stäbchen nimmt; der Philosoph mit der geraden Zahl macht das Gegenteil. Der Algorithmus ist wie folgt:

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Friseurproblem

Der Friseursalon verfügt über einen Friseur, einen Friseurstuhl und mehrere Hocker, auf denen die Kunden warten können (vorausgesetzt, es gibt hier n Hocker). Wenn keine Kunden da sind, schläft der Friseur im Friseurstuhl. Wenn ein Kunde kommt, muss er den Friseur zuerst wecken. Wenn der Friseur einem Kunden einen Haarschnitt gibt und es einen leeren Stuhl gibt, wartet der Kunde; wenn es keinen leeren Stuhl gibt, geht der Kunde. Entwerfen Sie für jeden Friseur und Kunden ein Programm, um seine Aktivitäten zu beschreiben.

Es gibt zwei Möglichkeiten, über diese Frage nachzudenken:Die eine besteht darin, den Friseurstuhl und den Wartehocker als zwei unterschiedliche Ressourcen zu betrachten; die andere besteht darin, den Friseurstuhl und den Hocker als eine einheitliche Stuhlressource zu betrachten.. Der in der ersten Idee verwendete Code ist etwas kompliziert zu schreiben, aber leicht vorstellbar; die zweite Methode hat weniger Code, ist aber nicht leicht zu verstehen.

Fügen Sie hier eine Bildbeschreibung ein

  • Fügen Sie hier eine Bildbeschreibung ein

    Fügen Sie hier eine Bildbeschreibung ein

  • Fügen Sie hier eine Bildbeschreibung ein

Analyse der Schritte zur Lösung des Problems des Semaphormechanismus

  • Beziehungsanalyse: Zunächst sollten Sie ermitteln, welche Synchronisationsbeziehungen im Problem vorliegen.Solange ein Paar von Synchronisationsbeziehungen besteht, ist häufig ein Ressourcensemaphor erforderlich. Der Anfangswert des Ressourcensemaphors sollte auf die entsprechende Anzahl von Ressourcen in der Frage festgelegt werden. Jeder Satz im Titel impliziert im Allgemeinen eine Synchronisationsbeziehung oder einen Ressourcentyp.Eine Synchronisationsbeziehung kann nicht nur zwischen zwei Rollen (wie Produzent und Konsument) bestehen, sondern auch zwischen derselben Rolle (wie Produzent und Produzent). Dies ist nur ein mögliches Beispiel. Tatsächlich gibt es zwischen Produzenten keine Synchronisationsbeziehung).

  • Bestimmen Sie kritische Ressourcen: Der Code, der auf kritische Ressourcen zugreift, wird als kritischer Abschnitt bezeichnet. Da jeweils nur ein Prozess auf kritische Ressourcen zugreifen darf, muss beim Zugriff auf kritische Ressourcen ein Mutex-Semaphor verwendet werden. Der Anfangswert des Mutex Semaphor ist 1 und wird im Allgemeinen verwendet. Mutex ist der Name des Mutex-Semaphors. Der allgemeine Weg, den kritischen Abschnitt zu schreiben, ist:

    Fügen Sie hier eine Bildbeschreibung ein

    Es ist zu beachten, dass die P- und V-Operationen des Ressourcensemaphors im Zusammenhang mit dieser Einschränkung im Allgemeinen außerhalb des oben genannten allgemeinen kritischen Abschnittscodes geschrieben werden, wenn beim Zugriff auf kritische Ressourcen andere Einschränkungen (Sperren) der Synchronisation oder gegenseitige Ausschlussbeziehungen vorliegen. . Unter der Annahme, dass sein Ressourcensemaphor N ist, lautet die modifizierte Schreibmethode des kritischen Abschnitts:

    Fügen Sie hier eine Bildbeschreibung ein

  • Ideen organisieren: Bestimmen Sie die spezifischen Codes verschiedener Rollenprozesse im Problem und die verwendeten Semaphoren und vervollständigen Sie die Antwort auf das Problem des Semaphormechanismus.Bei der Beantwortung kann die P-Operation (Warteoperation) als Subtraktion der Anzahl solcher Ressourcen um 1 und die V-Operation (Signaloperation) als Erhöhung der Anzahl solcher Ressourcen um 1 angesehen werden.

Sollten wir bei der Lösung von Synchronisationsproblemen mit gegenseitigem Ausschluss Schleifenanweisungen hinzufügen, um die Parallelität auszudrücken?

Ob eine Schleifenanweisung hinzugefügt werden soll, hängt vom tatsächlichen Prozesstyp ab.. Da beispielsweise beim Produzenten-Konsumenten-Problem Produzenten und Konsumenten ständig produzieren und konsumieren, muss der Produktions- und Konsumcode in einer Schleife ausgeführt werden. In diesem Fall werden Schleifenanweisungen (normalerweise die while-Anweisung) verwendet, um sicherzustellen, dass der Code funktioniert wird weiterhin ausgeführt. Wenn die Frage das Anhalten der Ausführung unter bestimmten Bedingungen erfordert, fügen Sie einfach eine break-Anweisung an der entsprechenden Position innerhalb der Schleife hinzu. Die Prozesse einiger Probleme müssen nicht in einer Schleife ausgeführt werden, wie zum Beispiel der Kundenprozess im Friseurproblem. Ein Kunde geht normalerweise, nachdem der Haarschnitt beendet ist. Das heißt, der Kundenprozess muss nur einmal ausgeführt werden und endet dann Der Code für einen ähnlichen Prozess muss nur einmal ausgeführt werden, sodass keine Schleifenanweisung hinzugefügt werden muss (der Kunde kann nicht immer einen Haarschnitt wünschen, was nicht dem gesunden Menschenverstand entspricht).

2.3.5 Pipeline

Der Semaphor-Mechanismus kann verwendet werden, um eine Synchronisierung und einen gegenseitigen Ausschluss zwischen Prozessen zu erreichen. Da die Steuerung des Semaphors jedoch über das gesamte Programm verteilt ist, ist seine Korrektheitsanalyse schwierig, und eine unsachgemäße Verwendung kann auch zu einem Prozess-Deadlock führen. Als Reaktion auf diese Probleme im Semaphormechanismus schlug Diikstra 1971 vor, für jede gemeinsam genutzte Ressource einen „Sekretär“ einzurichten, der den Zugriff darauf verwaltet .Alle Besucher müssen über den „Sekretär“ gehen, und der „Sekretär“ erlaubt jeweils nur einem Besucher (Prozess) den Zugriff auf gemeinsam genutzte Ressourcen. Dies erleichtert nicht nur die Systemverwaltung gemeinsam genutzter Ressourcen, sondern gewährleistet auch den sich gegenseitig ausschließenden Zugriff und die Synchronisierung zwischen Prozessen.. 1973 entwickelten Hanson und Hoare das „Sekretärinnenkonzept“ zum Managementkonzept weiter.

Ein Monitor definiert eine Datenstruktur und eine Reihe von Vorgängen, die von gleichzeitigen Prozessen ausgeführt werden können. Mit diesen Vorgängen können Prozesse synchronisiert und Daten im Monitor geändert werden . Aus der Definition eines Monitors geht hervor, dass ein Monitor aus Beschreibungen gemeinsamer Datenstrukturen, die lokal für den Monitor vorhanden sind, einer Reihe von Prozeduren zum Betreiben dieser Datenstrukturen und Anweisungen besteht, die Anfangswerte für die lokalen Datenstrukturen festlegen Monitor.Der Monitor sammelt kritische Abschnitte, die in verschiedenen Prozessen verstreut sind, und bietet gegenseitigen exklusiven Zugriff auf öffentliche Variablen, um diese zu schützen.

Grundlegende Merkmale von Rohrprozessen:

  • Auf lokale Daten des Monitors kann nur durch lokale Prozeduren des Monitors zugegriffen werden.
  • Ein Prozess kann den Monitor nur betreten, um auf gemeinsam genutzte Daten zuzugreifen, indem er eine Prozedur innerhalb des Monitors aufruft.
  • Es darf jeweils nur ein Prozess einen internen Prozess innerhalb des Monitors ausführen, d. h. Prozesse gelangen in den Monitor und schließen sich gegenseitig aus, indem sie interne Prozeduren aufrufen. Andere Prozesse, die den Monitor betreten möchten, müssen warten und in der Warteschlange blockiert werden.

Die folgenden Funktionen zur Unterstützung der Synchronisierung sind in der Prozessdefinition enthalten:

  • Eine Reihe von Bedingungsvariablen, die für den Monitor lokalisiert sind und nur innerhalb des Monitors aufgerufen werden können, werden zur Unterscheidung verschiedener Wartegründe verwendet.
  • Zwei Funktionsprozeduren warten und signalisieren, die mit Bedingungsvariablen arbeiten.Wait blockiert den Prozess, der diese Funktion in der Warteschlange aufruft, die der Bedingungsvariablen zugeordnet ist, und macht die Röhre verfügbar, d. h. anderen Prozessen wird der Zugang zur Röhre ermöglicht. Das Signal weckt den Prozess auf, der für die Bedingungsvariable blockiert ist. Wenn es mehrere solcher Prozesse gibt, wählen Sie einen von ihnen zum Aufwecken aus. Wenn es keinen blockierten Prozess für die Bedingungsvariable gibt, tun Sie nichts. Die Signalprozedur des Monitors muss nach dem Aufruf der Warteprozedur aufgerufen werden.

2.4 Deadlock

2.4.1 Das Konzept des Deadlocks

Obwohl in einem Multiprogrammierungssystem die gleichzeitige Ausführung mehrerer Prozesse die Nutzung von Systemressourcen verbessert und die Verarbeitungsfähigkeiten des Systems erhöht, bringt die gleichzeitige Ausführung mehrerer Prozesse auch neue Probleme mit sich – Deadlock.

Wenn mehrere Prozesse aufgrund des Wettbewerbs um Systemressourcen oder der Kommunikation untereinander dauerhaft blockiert sind, können diese Prozesse ohne äußere Gewalt nicht vorankommen. Jeder dieser Prozesse wartet unbegrenzt auf eine Ressource, die einem anderen Prozess in der Gruppe gehört und die er niemals erhalten kann. Dieses Phänomen wird als Deadlock bezeichnet.

  • An dem Deadlock sind mindestens zwei Prozesse beteiligt.
  • Jeder am Deadlock beteiligte Prozess wartet auf eine Ressource.
  • Mindestens zwei der am Deadlock beteiligten Prozesse belegen Ressourcen.
  • Deadlock-Prozesse sind eine Teilmenge der aktuellen Prozessgruppe im System.

2.4.2 Ursachen und notwendige Bedingungen für Deadlock

Ressourcenklassifizierung

Das Betriebssystem ist ein Ressourcenverwaltungsprogramm, das für die Zuweisung verschiedener Arten von Ressourcen zu Prozessen verantwortlich ist. Die Arten von Ressourcen, die von modernen Betriebssystemen verwaltet werden, sind sehr umfangreich und können aus verschiedenen Perspektiven klassifiziert werden. Beispielsweise können Ressourcen in entbehrliche Ressourcen und nicht entbehrliche Ressourcen unterteilt werden.

  • Entbehrliche Ressourcen sindObwohl der Ressourcenbesitzerprozess die Ressource nutzen muss, kann ein anderer Prozess die Ressource dem Besitzerprozess zwangsweise entziehen und sie für seinen eigenen Gebrauch verwenden.
  • Unveräußerliche Ressourcen sindMit Ausnahme des Besatzprozesses, der die Ressource nicht mehr nutzen muss und die Ressource aktiv freigibt, dürfen andere Prozesse dem Besatzprozess die Ressource nicht zwangsweise entziehen, während er sie verwendet.

Ob es sich bei einer Ressource um eine entbehrliche Ressource handelt, hängt vollständig von der Art der Ressource selbst ab .

Ursachen für Deadlocks

Aufgrund der Ressourcenkonkurrenz kommt es zu einem Deadlock. Wenn im System nur ein Prozess läuft und alle Ressourcen ausschließlich diesem Prozess vorbehalten sind, kommt es zu keinem Deadlock. Wenn mehrere Prozesse gleichzeitig im System ausgeführt werden und die Ressourcen im System nicht ausreichen, um die Anforderungen aller Prozesse gleichzeitig zu erfüllen, führt dies dazu, dass Prozesse um Ressourcen konkurrieren, was zu einem Deadlock führen kann.

Obwohl Ressourcenkonkurrenz zu einem Deadlock führen kann, bedeutet Ressourcenkonkurrenz nicht gleich einen Deadlock. Ein Deadlock tritt nur dann auf, wenn die Reihenfolge der Anforderung und Freigabe von Ressourcen während der Ausführung des Prozesses unangemessen ist (d. h. wenn der Prozess in einer unangemessenen Reihenfolge voranschreitet).

Ein Deadlock tritt aufgrund unzureichender Systemressourcen und einer falschen Reihenfolge des Prozessfortschritts auf .

Unzureichende Systemressourcen sind die Hauptursache für DeadlocksDer Zweck des Entwurfs eines Betriebssystems besteht darin, gleichzeitigen Prozessen die gemeinsame Nutzung von Systemressourcen zu ermöglichen. UndEine falsche Reihenfolge des Prozessablaufs ist ein wichtiger Grund für DeadlocksWenn die Systemressourcen gerade für den Prozess ausreichen, kann die falsche Fortschrittsreihenfolge der Prozesse leicht dazu führen, dass die Prozesse die voneinander benötigten Ressourcen belegen, was zu einem Deadlock führt.

Notwendige Bedingungen für das Auftreten eines Deadlocks

  • Gegenseitig ausschließende Bedingungen. Ein Prozess erfordert die ausschließliche Kontrolle über die zugewiesenen Ressourcen, dh eine bestimmte Ressource wird innerhalb eines bestimmten Zeitraums nur von einem Prozess belegt.
  • Kein Entzug von Bedingungen. Die von einem Prozess erhaltenen Ressourcen können nicht zwangsweise von anderen Prozessen weggenommen werden, bevor sie aufgebraucht sind, dh sie können nur von dem Prozess freigegeben werden, der die Ressourcen erhalten hat.
  • Bedingungen anfordern und zurückhalten. Ein Prozess beantragt jedes Mal einen Teil seiner Ressourcen, und während er auf die Zuweisung neuer Ressourcen wartet, belegt der Prozess weiterhin die zugewiesenen Ressourcen. Anforderungs- und Haltebedingungen werden auch als Teilzuteilungsbedingungen bezeichnet.
  • Schleifenwartebedingung. Es gibt eine zyklische Wartekette für Prozessressourcen, und die Ressourcen, die jeder Prozess in der Kette erhalten hat, werden gleichzeitig vom nächsten Prozess in der Kette angefordert.

Um einen Deadlock zu erzeugen, sind diese vier Bedingungen unabdingbar. Sie können einen Deadlock also vermeiden, indem Sie eine oder mehrere dieser Bedingungen zerstören.

2.4.3 Grundlegende Methoden zum Umgang mit Deadlocks

  • Strauß-Algorithmus: Verschließen Sie wie ein Strauß die Augen vor Deadlocks, dh ignorieren Sie Deadlocks.
  • Verhindern Sie Deadlocks. Verhindern Sie Deadlocks, indem Sie bestimmte Einschränkungen festlegen, um eine oder mehrere der vier notwendigen Bedingungen für Deadlocks zu zerstören.
  • Vermeiden Sie Deadlocks. Bei der dynamischen Zuweisung von Ressourcen wird eine Methode verwendet, um zu verhindern, dass das System in einen unsicheren Zustand übergeht, wodurch das Auftreten eines Deadlocks vermieden wird.
  • Erkennen und beseitigen Sie Deadlocks. Das Auftreten eines Deadlocks wird durch den Erkennungsmechanismus des Systems rechtzeitig erkannt und anschließend werden einige Maßnahmen ergriffen, um den Deadlock zu beheben.

Die Verhinderung von Deadlocks besteht darin, die notwendigen Bedingungen für Deadlocks in der Planungsmethode zu zerstören, sodass das System keinen Deadlock erzeugen kann.Wenn die Planungsmethode für benachteiligte Prozesse übernommen wird, kann der Prozess mit hoher Priorität immer Ressourcen erhalten und den Vorgang abschließen, sodass das System nicht blockiert.

Die Vermeidung von Deadlocks besteht darin, vorherzusagen, ob das System während des dynamischen Zuweisungsprozesses in einen unsicheren Zustand eintritt. Wenn die Ressourcenzuweisung wahrscheinlich einen Deadlock verursacht, wird diese Zuweisung nicht durchgeführt.Der später zu besprechende Bankalgorithmus ist eine Methode zur Vermeidung von Deadlocks.

Das Erkennen und Aufheben eines Deadlocks ist eine relativ passive Methode, die erst dann durchgeführt wird, wenn erkannt wird, dass ein Deadlock aufgetreten ist.B. das Entziehen von Ressourcen für den Deadlock-Prozess und andere Methoden, um den Prozess zur Freigabe von Ressourcen zu zwingen oder den Deadlock-Prozess zu beenden, um den Deadlock-Status zu lindern.

2.4.4 Vermeidung von Deadlocks

Um das Auftreten eines Deadlocks zu verhindern, müssen Sie nur eine der vier notwendigen Bedingungen für einen Deadlock zerstören.

Gegenseitig ausschließende Bedingungen

Um die Bedingung des gegenseitigen Ausschlusses zu durchbrechen, muss mehreren Prozessen gleichzeitig der Zugriff auf die Ressource gestattet werden. Dies wird jedoch durch die inhärenten Eigenschaften der Ressource selbst begrenzt.Auf einige Ressourcen kann nicht gleichzeitig zugegriffen werden, sondern nur gegenseitig. Beispielsweise lässt ein Drucker während seines Betriebs nicht zu, dass mehrere Prozesse abwechselnd Daten drucken, und kann nur gegenseitig verwendet werden. Unter diesem Gesichtspunkt ist es unmöglich, das Auftreten von Deadlocks durch die Zerstörung gegenseitiger Ausschlussbedingungen zu verhindern.

keine Entzugsbedingungen

Um die Nicht-Deprivationsbedingung zu zerstören, können Sie eine solche Strategie formulieren: Wenn für einen Prozess, der bestimmte Ressourcen erhalten hat, die neue Ressourcenanforderung nicht sofort erfüllt werden kann, muss er alle erhaltenen Ressourcen freigeben und erneut anwenden, wenn die Ressourcen benötigt werden in der Zukunft. . Dies bedeutet, dass Ressourcen, die von einem Prozess erhalten wurden, während des Betriebs entzogen werden können, wodurch der Zustand der Nichtbenachteiligung zerstört wird.Die Umsetzung dieser Strategie ist komplex. Die Freigabe erworbener Ressourcen kann dazu führen, dass die vorherige Arbeit ungültig wird. Wiederholte Anwendung und Freigabe von Ressourcen erhöhen den Systemaufwand und verringern den Systemdurchsatz. Diese Methode wird normalerweise nicht in Situationen verwendet, in denen Ressourcenmangel kostspielig ist. Beispielsweise wird sie nicht zum Zuweisen von Druckern verwendet. Wenn ein Prozess druckt, wird die Entzugsmethode nicht verwendet, um den Deadlock zu beseitigen.

Bedingungen anfordern und zurückhalten

Um die Anforderungs- und Haltebedingungen zu durchbrechen, kann eine vorstatische Zuweisungsmethode verwendet werden .Bei der vorstatischen Zuweisungsmethode muss der Prozess alle benötigten Ressourcen auf einmal beantragen, bevor er ausgeführt wird, und er wird erst dann in Betrieb genommen, wenn seine Ressourcen nicht erfüllt sind. Sobald es in Betrieb genommen wird, sind diese Ressourcen immer Eigentum des Unternehmens und es werden keine weiteren Ressourcenanforderungen gestellt, wodurch sichergestellt wird, dass das System nicht blockiert.. Diese Methode ist einfach und sicher, verringert jedoch die Ressourcennutzung, da bei der Verwendung dieser Methode alle für den Job (oder Prozess) erforderlichen Ressourcen im Voraus bekannt sein müssen, auch wenn einige Ressourcen erst später im Lauf verwendet werden können und einige Ressourcen sogar verwendet werden können wird im Normalbetrieb überhaupt nicht genutzt und muss vorab beantragt werden, wodurch die Systemressourcen nicht voll ausgenutzt werden können.

Nehmen wir als Beispiel einen Drucker: Ein Job muss möglicherweise erst dann Berechnungsergebnisse drucken, wenn er endgültig abgeschlossen ist, aber der Drucker muss ihm zugewiesen werden, bevor der Job ausgeführt wird. Dann ist der Drucker während der gesamten Ausführung des Jobs im Grunde genommen inaktiv im Leerlauf, während andere Der auf den Drucker wartende Prozess startet verzögert, was dazu führt, dass andere Prozesse „ausgehungert“ werden.

Schleifenwartebedingung

Um den Schleifenwartezustand zu durchbrechen, kann die Methode der geordneten Ressourcenzuweisung verwendet werden .Die geordnete Ressourcenzuweisungsmethode besteht darin, allen Ressourcen im System eine Nummer entsprechend ihrem Typ zuzuweisen (z. B. Drucker ist 1, Bandlaufwerk ist 2), und jeder Prozess muss Ressourcen strikt in der Reihenfolge steigender Nummern anfordern. Ähnliches Ressourcen können gleichzeitig beantragt werden.. Das heißt, solange der Prozess die Ressource R i anfordert , kann er in nachfolgenden Anforderungen nur Ressourcen anfordern, die nach R i eingestuft sind (i ist die Ressourcennummer), und kann keine Ressourcen mehr anfordern, die vor R i

Diese Methode eignet sich nicht für Änderungen nach der Nummerierung verschiedener Ressourcen, wodurch das Hinzufügen neuer Geräte eingeschränkt wird. Die Reihenfolge, in der Ressourcen von verschiedenen Jobs verwendet werden, ist nicht genau dieselbe. Auch wenn das System die meisten Situationen bei der Nummerierung von Ressourcen berücksichtigt, Es wird immer Unterschiede im System geben. Jobs mit inkonsistenten Zahlen alsoVerursacht eine Verschwendung von Ressourcen; die sequentielle Nutzung von Ressourcen erhöht auch die Komplexität der Programmierung.

2.4.5 Deadlock vermeiden

Mehrere Strategien zur Verhinderung von Deadlocks stellen im Allgemeinen starke Einschränkungen dar. Obwohl sie relativ einfach zu implementieren sind, beeinträchtigen sie die Systemleistung erheblich. Bei Methoden zur Vermeidung von Deadlocks sind die auferlegten Einschränkungen schwächer und es ist möglich, eine bessere Systemleistung zu erzielen.Bei dieser Methode wird der Zustand des Systems in einen sicheren Zustand und einen unsicheren Zustand unterteilt. Solange sich das System immer in einem sicheren Zustand befindet, kann ein Deadlock vermieden werden.

Sicherer Zustand und unsicherer Zustand

Bei der Methode zur Vermeidung von Deadlocks können Prozesse dynamisch Ressourcen beantragen, und das System berechnet zunächst die Sicherheit der Ressourcenzuweisung, bevor es Ressourcen zuweist. Wenn diese Zuweisung nicht dazu führt, dass das System in einen unsicheren Zustand übergeht, wird die Ressource dem Prozess zugewiesen, andernfalls muss der Prozess warten .

Wenn das System zu einem bestimmten Zeitpunkt die von jedem Prozess benötigten Ressourcen in einer bestimmten Reihenfolge zuweisen kann, bis der maximale Bedarf erreicht ist, sodass jeder Prozess erfolgreich abgeschlossen werden kann, wird der Systemstatus zu diesem Zeitpunkt als sicherer Zustand bezeichnet Die Sequenz wird als Sicherheitssequenz bezeichnet. Wenn eine solche sichere Sequenz zu einem bestimmten Zeitpunkt im System nicht existiert, wird der Systemzustand zu diesem Zeitpunkt als unsicherer Zustand bezeichnet. Es ist zu beachten, dass die Sicherheitssequenz zu einem bestimmten Zeitpunkt möglicherweise nicht eindeutig ist, d. h. es können mehrere Sicherheitssequenzen gleichzeitig vorhanden sein .

ObwohlNicht alle unsicheren Zustände sind Deadlock-Zustände, aber wenn das System in einen unsicheren Zustand eintritt, kann es in einen Deadlock-Zustand geraten. Umgekehrt kann es den Eintritt in einen Deadlock-Zustand vermeiden, solange sich das System in einem sicheren Zustand befindet.

Zwei Punkte sind zu beachten:

  • Ein unsicherer Zustand bedeutet nicht, dass im System ein Deadlock aufgetreten ist. Ein unsicherer Zustand bezieht sich auf einen Zustand, in dem im System ein Deadlock auftreten kann, und bedeutet nicht, dass im System ein Deadlock aufgetreten ist.
  • Ein System in einem unsicheren Zustand führt nicht unbedingt zu einem Deadlock. Deadlock ist eine echte Teilmenge unsicherer Bedingungen.

Banker-Algorithmus

Ein repräsentativer Algorithmus zur Vermeidung von Deadlocks ist der Banker-Algorithmus von Dijkstra. Um den Banker-Algorithmus zu implementieren, müssen mehrere Datenstrukturen im System eingerichtet werden.

Nehmen Sie an, dass es n Prozesse (P 1 , P 2 ,...P n ) und m Arten von Ressourcen (R 1 , R 2 ,...R m ) im System gibt. Die im Banker-Algorithmus verwendete Datenstruktur ist wie folgt:

  • Verfügbarer RessourcenvektorVerfügbar. Dies ist ein Array mit m Elementen, wobeiDer Wert von Available[i] stellt die vorhandene ungenutzte Anzahl von Ressourcen des Typs i dar. Sein Anfangswert ist die Anzahl der im System konfigurierten Ressourcen dieses Typs. Sein Wert ändert sich dynamisch mit der Zuweisung und Wiederverwendung von Ressourcen dieses Typs.
  • Maximalbedarfsmatrix Max. Dabei handelt es sich um eine n×m-Matrix, die die maximale Anzahl an m-Typ-Ressourcen definiert, die von jedem Prozess im System benötigt werden.Der Wert von Max[i][j] stellt den maximalen Bedarf des i-ten Prozesses für den j-ten Ressourcentyp dar.
  • Zuteilungsmatrix Zuteilung. Dies ist auch eine n×m-Matrix, die die Anzahl der Ressourcen definiert, die derzeit jedem Prozess für jeden Ressourcentyp im System zugewiesen sind.Der Wert von Allocation[i][j] stellt die Anzahl der Ressourcen vom Typ j dar, die derzeit dem i-ten Prozess gehören.
  • Brauchen MatrixNeed. Dies ist auch eine n×m-Matrix, die die Anzahl verschiedener Ressourcen definiert, die jeder Prozess im System noch benötigt (Hinweis: Es handelt sich um „noch benötigt“ und nicht um „Gesamtbedarf“, was bedeutet, dass sich auch diese Matrix ändert ).Der Wert von Need[i][j] gibt die Anzahl der Ressourcen des j-ten Typs an, die der i-te Prozess ebenfalls benötigt.. Der Vektor Need i ist die i-te Zeile der Matrix Need und der Nachfrageressourcenvektor des Prozesses i.

Need[i] [j]=Max[i] [j]-Allokation[i] [j]


Beschreibung des Banker-Algorithmus :

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Der Sicherheitsalgorithmus wird wie folgt beschrieben :

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

2.4.6 Deadlock-Erkennung und -Freigabe

Deadlock-Erkennung

  • Ressourcenzuteilungskarte

    Ein Systemressourcenzuordnungsdiagramm kann als Tupel definiert werden, nämlich SRAG=(V,E), wobei V eine Scheitelpunktmenge und E eine gerichtete Kantenmenge ist. Die Scheitelpunktmenge kann in zwei Teile unterteilt werden: P = (P 1 , P 2 ··, P n ) ist eine Menge, die aus allen Prozessen im System besteht, und jedes P repräsentiert einen Prozess. R=(r 1 , r 2 ,··,r m )
    ist eine Menge aller Ressourcen im System, und jedes r repräsentiert einen Ressourcentyp.

    Jede Kante im gerichteten Kantensatz E ist ein geordnetes Paar, das eine angeforderte Ressource oder eine zugewiesene Ressource darstellt, <P i , r i > ist eine angeforderte Ressource und <r i , Pi > ist eine zugewiesene Ressource.

    Im SRAG,Verwenden Sie Kreise zur Darstellung von Prozessen und Kästchen zur Darstellung der einzelnen Ressourcentypen.. Es können mehrere Ressourcen n jedes Typs vorhanden sein, und jede Ressource kann durch einen Kreis im Feld dargestellt werden. Der Anwendungsrand ist ein gerichteter Rand von einem Prozess zu einer Ressource, was bedeutet, dass der Prozess eine Ressource beantragt hat, der Prozess die Ressource jedoch noch nicht erhalten hat. Eine Zuordnungskante ist eine gerichtete Kante von einer Ressource zu einem Prozess, die angibt, dass eine Ressource einem Prozess zugewiesen ist. Eine Anwendungskante zeigt nur auf das Feld, das die Ressourcenklasse r darstellt, was darauf hinweist, dass bei der Anwendung keine bestimmte Ressource angegeben wird. Wenn der Prozess Pi eine Ressource der Ressourcenklasse r i beantragt , wird dem Ressourcenzuteilungsdiagramm eine Anforderungskante hinzugefügt. Wenn die Anforderung erfüllt werden kann, wird die Anforderungskante sofort in eine Zuordnungskante umgewandelt; wenn der Prozess anschließend eine Ressource freigibt, dann wird die Allokationskante gelöscht.

    Fügen Sie hier eine Bildbeschreibung ein

    Fügen Sie hier eine Bildbeschreibung ein

  • Deadlock-Theorie

    Die Methode zur Vereinfachung des Ressourcenzuteilungsdiagramms kann verwendet werden, um zu erkennen, ob der Systemzustand S ein Deadlock-Zustand ist.

    • Suchen Sie im Ressourcenzuteilungsdiagramm nach einem Prozessknoten Pi, der weder blockiert noch isoliert ist ( d. h., finden Sie eine verbundene Kante aus dem Prozesssatz, und die Anzahl der Ressourcenanforderungen ist geringer als die Anzahl der inaktiven Ressourcen im System). Da der Prozess Pi alle benötigten Ressourcen erhalten hat , kann er bis zum Abschluss weiterlaufen und dann alle von ihm belegten Ressourcen freigeben (dies entspricht der Eliminierung aller Anwendungskanten und Zuweisungskanten von Pi; es wird zu einem isolierten Knoten ) .
    • Nachdem der Prozess Pi Ressourcen freigegeben hat , kann er blockierte Prozesse aufwecken, während er auf diese Ressourcen wartet. Der ursprünglich blockierte Prozess kann zu einem nicht blockierenden Prozess werden, und der Zuordnungsrand und der Anwendungsrand werden im ersten Schritt gemäß der vereinfachten Methode eliminiert .
    • Wenn nach der Wiederholung des Vereinfachungsprozesses der ersten beiden Schritte alle Kanten im Diagramm eliminiert werden können und alle Prozesse zu isolierten Knoten werden, wird das Diagramm als vollständig vereinfachbar bezeichnet. Wenn das Diagramm durch keinen Prozess vollständig vereinfacht werden kann, wird das Diagramm als vollständig vereinfacht bezeichnet gilt als vollständig vereinfachbar. Graphen sind nicht vollständig reduzierbar.

    Es kann gezeigt werden, dass unterschiedliche Vereinfachungsreihenfolgen zum gleichen irreduziblen Graphen führen. Die Bedingung dafür, dass der Systemzustand S ein Deadlock-Zustand ist, lautet: Genau dann, wenn der Ressourcenzuteilungsgraph des Zustands S nicht vollständig vereinfacht werden kann, wird dieser Satz als Deadlock-Satz bezeichnet .

Deadlock- und Erkennungsalgorithmus

Die Grundidee des Deadlock-Erkennungsalgorithmus besteht darin, den verfügbaren Zahlenvektor (t) verschiedener Arten verfügbarer Ressourcen im System zu einem bestimmten Zeitpunkt t und für eine Gruppe von Prozessen {P 1 , P 2 ,·· zu erhalten P n } Finden Sie im System die Prozesse, deren Anzahl an Anforderungen für verschiedene Arten von Ressourcen geringer ist als die Anzahl der verfügbaren Ressourcen verschiedener Typen im System. Solche Prozesse können alle benötigten Ressourcen erhalten und ihre Ausführung beenden. Wenn die Ausführung beendet ist, geben sie alle von ihnen belegten Ressourcen frei, wodurch sich die Anzahl der verfügbaren Ressourcen erhöht. Fügen Sie solche Prozesse zur Reihenfolge der Prozesse hinzu, die ausgeführt und beendet werden können . Führen Sie dann die obige Untersuchung für die verbleibenden Prozesse durch. Wenn mehrere Prozesse einer Gruppe nicht zu dieser Reihenfolge gehören, kann es zu einem Deadlock kommen.

Fügen Sie hier eine Bildbeschreibung ein

Fügen Sie hier eine Bildbeschreibung ein

Deadlock-Freigabe

Sobald im System ein Deadlock erkannt wird, sollte der Deadlock-Prozess aus dem Deadlock-Zustand befreit werden, d. h. der Deadlock wird aufgehoben.

Es gibt drei häufig verwendete Methoden, um Deadlocks zu beseitigen:

  • Ressourcen entziehen. Beanspruchen Sie genügend Ressourcen von anderen Prozessen für den blockierten Prozess, um seinen Deadlock-Status zu beheben.
  • Machen Sie den Vorgang rückgängig. Machen Sie einige Prozesse rückgängig, bis anderen Prozessen genügend Ressourcen zugewiesen sind, um den Deadlock zu beheben.
  • Der Prozess wird zurückgesetzt. Lassen Sie einen oder mehrere Prozesse weit genug zurücksetzen, um einen Deadlock zu vermeiden. Wenn der Prozess zurückgesetzt wird, gibt er freiwillig Ressourcen frei, anstatt dass ihm diese entzogen werden. Das System muss die historischen Informationen des Prozesses aufbewahren und einen Wiederherstellungspunkt festlegen.

2.4.7 Deadlock und Hunger

Auch wenn das System nicht blockiert, können einige Prozesse lange warten.Wenn die Wartezeit einen erheblichen Einfluss auf den Fortschritt und die Reaktion des Prozesses hat, spricht man von Prozesshunger . Wenn der Hunger ein bestimmtes Niveau erreicht und die vom Prozess zugewiesenen Aufgaben keine praktische Bedeutung mehr haben, selbst wenn dies der Fall ist abgeschlossen sind, soll der Prozess verhungert sein.

Der Unterschied zwischen Deadlock und Hunger:

  • In Anbetracht des Prozessstatus befinden sich Deadlock-Prozesse alle im Wartezustand; Prozesse, die während der Hauptverkehrszeiten (im laufenden oder bereiten Zustand) warten, befinden sich nicht im Wartezustand, sondern können ausgehungert werden.
  • Der blockierte Prozess wartet auf Ressourcen, die niemals freigegeben werden: Während der ausgehungerte Prozess auf Ressourcen wartet, die freigegeben, aber nicht ihm selbst zugewiesen werden, zeigt sich dies darin, dass es keine Obergrenze für die Wartezeit gibt ( Warten in der Warteschlange oder Warten während der Stoßzeiten).
  • Aufgrund des zyklischen Wartens muss ein Deadlock auftreten, ein Hungerzustand jedoch nicht. Dies zeigt auch, dass das Ressourcenzuteilungsdiagramm zwar erkennen kann, ob ein Deadlock vorliegt, aber nicht erkennen kann, ob ein Prozess ausgehungert ist.
  • Ein Deadlock muss mehrere Prozesse umfassen, während es möglicherweise nur einen ausgehungerten oder ausgehungerten Prozess gibt.

Hunger und Hunger hängen mit Strategien zur Ressourcenzuteilung zusammen, sodass Hunger und Hunger aus fairer Sicht verhindert werden können, um sicherzustellen, dass nicht alle Prozesse ignoriert werden, z. B. mehrstufige Feedback-Warteschlangenplanungsalgorithmen.

Ich denke du magst

Origin blog.csdn.net/pipihan21/article/details/129808475
Empfohlen
Rangfolge