Semaphor (Programmierung)
Im Informatik, a Semaphor ist ein Variable oder Zusammenfassung Datentyp Wird verwendet, um den Zugriff auf eine gemeinsame Ressource nach mehreren zu steuern Themen und vermeiden Kritischer Abschnitt Probleme in a gleichzeitig System wie a Multitasking Betriebssystem. Semaphoren sind eine Art von Art von Synchronisation Primitive. Ein triviales Semaphor ist eine einfache Variable, die je nach Programmierer-definierter Bedingungen geändert wird (z. B. inkrementiert oder dekrementiert oder umgeschaltet).
Eine nützliche Möglichkeit, sich ein Semaphor als in einem realen System verwendeten zu sehen, ist eine Aufzeichnung darüber sicher (d.h., um zu vermeiden Rennbedingungen) Wenn Einheiten erworben oder frei werden und gegebenenfalls warten, bis eine Einheit der Ressource verfügbar ist.
Semaphoren sind ein nützliches Instrument zur Vorbeugung von Rassenbedingungen. Ihre Verwendung ist jedoch keineswegs eine Garantie dafür, dass ein Programm frei von diesen Problemen ist. Semaphoren, die eine willkürliche Ressourcenzahl ermöglichen, werden aufgerufen Semaphoren zählen, während Semaphoren, die auf die Werte 0 und 1 beschränkt sind (oder gesperrt/entsperrt, nicht verfügbar/verfügbar) genannt werden Binäre Semaphoren und werden zur Implementierung gewohnt Schlösser.
Das Semaphor -Konzept wurde von erfunden von Niederländisch Informatiker Edsger Dijkstra in 1962 oder 1963,,[2] Als Dijkstra und sein Team eine entwickelten Betriebssystem für die Electrologica x8. Dieses System wurde schließlich als bekannt als Das Multiprogrammierungssystem.
Bibliothek Analogie
Angenommen, eine Bibliothek verfügt über 10 identische Studienräume, die von einem Schüler gleichzeitig verwendet werden können. Die Schüler müssen einen Raum von der Rezeption anfordern, wenn sie einen Studienraum benutzen möchten. Wenn keine Zimmer kostenlos sind, warten die Schüler am Schreibtisch, bis jemand ein Zimmer aufgibt. Wenn ein Schüler einen Raum benutzt hat, muss der Schüler zum Schreibtisch zurückkehren und angeben, dass ein Raum frei geworden ist.
In der einfachsten Implementierung die Sachbearbeiter Bei der Rezeption Kennt nur die Anzahl der verfügbaren freien Zimmer, die sie nur richtig kennen, wenn alle Schüler ihr Zimmer tatsächlich benutzen, während sie sich für sie angemeldet haben und sie zurückgeben, wenn sie fertig sind. Wenn ein Schüler einen Raum fordert, verringert der Angestellte diese Zahl. Wenn ein Schüler einen Raum veröffentlicht, erhöht der Angestellte diese Zahl. Der Raum kann so lange wie gewünscht genutzt werden und ist daher nicht möglich, Zimmer im Voraus zu buchen.
In diesem Szenario repräsentiert der Zähler an der Rezeption ein Zählsemaphor, die Räume sind die Ressource und die Schüler repräsentieren Prozesse/Threads. Der Wert des Semaphors in diesem Szenario beträgt zunächst 10, wobei alle Zimmer leer sind. Wenn ein Student einen Raum fordert, wird ihm Zugang erteilt und der Wert des Semaphors wird auf 9 geändert. Nachdem der nächste Schüler gekommen ist, fällt er auf 8, dann 7 und so weiter. Wenn jemand einen Raum anfordert und der aktuelle Wert des Semaphors 0 beträgt, ist 0[3] Sie sind gezwungen zu warten, bis ein Raum befreit ist (wenn die Anzahl von 0 erhöht wird). Wenn einer der Zimmer veröffentlicht wurde, aber mehrere Schüler warten, kann jede Methode verwendet werden, um denjenigen auszuwählen, der den Raum besetzt (wie FIFO oder zufällig eine aussuchen). Und natürlich muss ein Student den Angestellten darüber informieren, dass er sein Zimmer erst nach dem Verlassen des Raums veröffentlichen kann. Andernfalls kann es eine unangenehme Situation geben, wenn ein solcher Schüler dabei ist, den Raum zu verlassen (er packt seine Lehrbücher usw.) Und ein anderer Schüler betritt den Raum, bevor sie es verlassen.
Wichtige Beobachtungen
Bei Verwendung zur Kontrolle des Zugriffs auf a Schwimmbad von Ressourcen verfolgt nur ein Semaphor wie viele Ressourcen sind kostenlos; es verfolgt nicht die der Ressourcen sind kostenlos. Ein anderer Mechanismus (möglicherweise mit mehr Semaphoren) können eine bestimmte freie Ressource auswählen.
Das Paradigma ist besonders leistungsstark, da die Semaphor -Anzahl als nützlicher Auslöser für eine Reihe verschiedener Aktionen dienen kann. Der oben genannte Bibliothekar kann das Licht in der Studienhalle ausschalten, wenn keine Schüler übrig sind, oder ein Schild platzieren, das besagt, dass die Räume sehr beschäftigt sind, wenn die meisten Räume besetzt sind.
Der Erfolg des Protokolls erfordert, dass Anwendungen es richtig befolgen. Fairness und Sicherheit werden wahrscheinlich beeinträchtigt (was praktisch bedeutet, dass ein Programm sich langsam verhalten kann, unregelmäßig handeln, aufhängen oder Absturz) Wenn sogar ein einzelner Prozess falsch wirkt. Das beinhaltet:
- eine Ressource anfordern und vergessen, sie zu veröffentlichen;
- Veröffentlichung einer Ressource, die nie angefordert wurde;
- eine lange Zeit eine Ressource halten, ohne sie zu benötigen;
- Verwenden einer Ressource ohne sie zuerst (oder nach der Veröffentlichung).
Auch wenn alle Prozesse diese Regeln befolgen, Multi-Ressource Sackgasse kann weiterhin auftreten, wenn verschiedene Ressourcen von verschiedenen Semaphoren verwaltet werden und wenn Prozesse mehr als eine Ressource gleichzeitig verwenden müssen, wie von der dargestellt Dachphilosophenproblem.
Semantik und Implementierung
Die Zählsemaphoren sind mit zwei Operationen ausgestattet, die historisch als P und V bezeichnet werden (siehe § Betriebsnamen für alternative Namen). Operation V erhöht das Semaphor Sund Operation p senken es.
Der Wert des Semaphors S ist die Anzahl der Einheiten der derzeit verfügbaren Ressource. Die P -Operation verschwendete Zeit oder schläft Bis eine vom Semaphor geschützte Ressource verfügbar ist, wird zu welcher Zeit die Ressource sofort beansprucht. Die V -Operation ist die Inverse: Sie stellt eine Ressource erneut zur Verfügung, nachdem der Vorgang mit der Verwendung beendet ist. Eine wichtige Eigenschaft des Semaphors S ist, dass sein Wert nur durch Verwendung der V- und P -Operationen geändert werden kann.
Eine einfache Art zu verstehen Warten (P) und Signal (V) Operationen ist:
- Warten: Verringung den Wert der Semaphor -Variablen durch 1. Wenn der neue Wert der Semaphor -Variablen negativ ist, wird der Prozess ausgeführt Warten wird blockiert (d. H. In die Warteschlange des Semaphors hinzugefügt). Andernfalls setzt der Prozess die Ausführung fort und verwendet eine Einheit der Ressource.
- Signal: Inkrementiert den Wert der Semaphor-Variablen durch 1. Nach dem Inkrement, wenn der Vorinkrementwert negativ war (dh, es gibt Prozesse, die auf eine Ressource warten), überträgt er einen blockierten Prozess von der wartenden Warteschlange des Semaphors in die Bereitschaftswarteschlange.
Viele Betriebssysteme bieten effiziente semaphorische Primitive, die einen Wartevorgang entsperren, wenn das Semaphor inkrementiert wird. Dies bedeutet, dass Prozesse keine Zeit damit verschwenden, den Semaphorwert unnötig zu überprüfen.
Das Zählsemaphor -Konzept kann mit der Fähigkeit erweitert werden, mehr als eine "Einheit" aus dem Semaphor zu beanspruchen oder zurückzugeben, eine Technik, die in implementiert ist Unix. Die modifizierten V- und P -Operationen sind wie folgt und verwenden quadratische Klammern, um anzuzeigen atomare Operationen, d.h. Operationen, die aus der Perspektive anderer Prozesse unteilbar erscheinen:
Funktion V (Semaphor S, Ganzzahl I): [S ← S + I]Funktion P (Semaphor S, Ganzzahl I): wiederholen: [wenn S ≥ i: s ← s - i Unterbrechung]
Der Rest dieses Abschnitts bezieht sich jedoch auf Semaphoren mit Unarm V- und P -Operationen, sofern nicht anders angegeben.
Vermeiden Hunger, ein Semaphor hat eine zugeordnete Warteschlange von Prozessen (normalerweise mit FIFO Semantik). Wenn ein Prozess einen P -Betrieb auf einem Semaphor mit dem Wert Null ausführt, wird der Prozess zur Warteschlange des Semaphors hinzugefügt und seine Ausführung wird ausgesetzt. Wenn ein anderer Prozess das Semaphor durch Durchführung einer V -Operation erhöht und in der Warteschlange Prozesse vorliegt, wird eine davon aus der Warteschlange entfernt und die Ausführung wieder aufnimmt. Wenn Prozesse unterschiedliche Prioritäten haben, kann die Warteschlange nach Priorität bestellt werden, so dass der höchste Prioritätsprozess zuerst aus der Warteschlange übernommen wird.
Wenn die Implementierung nicht die Atomizität des Inkrements, des Verringerung und des Vergleichsvorgänge sicherstellt, besteht das Risiko, dass Inkremente oder Verringerung vergessen werden oder der Semaphorwert negativ wird. Atomizität kann durch die Verwendung einer Maschinenanweisung erreicht werden, die dazu in der Lage ist Lesen, ändern und schreiben das Semaphor in einer einzigen Operation. In Ermangelung eines solchen Hardwareunterrichts kann ein Atombetrieb durch die Verwendung von a synthetisiert werden Software gegenseitiger Ausschlussalgorithmus. An Uniprozessor Systeme, atomare Operationen können durch vorübergehend suspendiertes Aussetzen sichergestellt werden Präsentation oder Hardware deaktivieren Interrupts. Dieser Ansatz funktioniert nicht auf Multiprozessorsystemen, bei denen zwei Programme, die ein Semaphor teilen, gleichzeitig auf verschiedenen Prozessoren ausgetauscht werden können. Um dieses Problem in einem Multiprozessor -System zu lösen, kann eine Sperrvariable verwendet werden, um den Zugriff auf das Semaphor zu steuern. Die Sperrvariable wird mit a manipuliert Test- und Set-Lock Befehl.
Beispiele
Triviales Beispiel
Betrachten Sie eine Variable A und eine boolesche Variable S. A ist nur zugegriffen, wenn S ist wahr. Daher, S ist ein Semaphor für A.
Man kann sich ein Stopplighungsignal vorstellen (S) kurz vor einem Bahnhof (A). Wenn das Signal grün ist, kann man in diesem Fall den Bahnhof betreten. Wenn es gelb oder rot (oder eine andere Farbe) ist, kann der Bahnhof nicht zugegriffen werden.
Login -Warteschlange
Betrachten Sie ein System, das nur zehn Benutzer unterstützen kann (s = 10). Wenn sich ein Benutzer anmeldet, wird P aufgerufen und das Semaphor verringert S bis 1. Wenn sich ein Benutzer anmeldet, wird V aufgerufen, inkrementiert S durch 1, der einen Login -Slot darstellt, der verfügbar geworden ist. Wann S ist 0, alle Benutzer, die sich anmelden möchten S steigt; Die Anmeldeanforderung ist auf eine FIFO -Warteschlange gestellt, bis ein Steckplatz befreit ist. Gegenseitiger Ausschluss wird verwendet, um sicherzustellen, dass Anfragen in Ordnung sind. Wann immer S Erhöht (Anmeldeschlitze verfügbar), eine Anmeldeanforderung ist dequed und der Benutzer, der die Anforderung besitzt, darf sich anmelden. Wenn S ist bereits größer als oder gleich 0, dann werden Anmeldemittel sofort dequed.
Produzent -Konsumentenproblem
In dem Produzent -Konsumentenproblem, ein Prozess (der Produzent) generiert Datenelemente und ein anderer Prozess (der Verbraucher) empfängt und verwendet sie. Sie kommunizieren mit einer Warteschlange mit maximaler Größe N und unterliegen den folgenden Bedingungen:
- Der Verbraucher muss warten, bis der Produzent etwas produziert, wenn die Warteschlange leer ist.
- Der Produzent muss warten, bis der Verbraucher etwas verbraucht, wenn die Warteschlange voll ist.
Die Semaphor -Lösung für das Problem des Produzenten -Konsumenten -Problems verfolgt den Zustand der Warteschlange mit zwei Semaphoren: leere Beschichtung
, die Anzahl der leeren Orte in der Warteschlange, und fullcount
, die Anzahl der Elemente in der Warteschlange. Integrität aufrechterhalten, leere Beschichtung
kann niedriger sein (aber nie höher) als die tatsächliche Anzahl leerer Orte in der Warteschlange, und fullcount
kann niedriger sein (aber nie höher) als die tatsächliche Anzahl der Elemente in der Warteschlange. Leere Orte und Elemente repräsentieren zwei Arten von Ressourcen, leeren Kisten und Vollkisten sowie die Semaphoren leere Beschichtung
und fullcount
Behalten Sie die Kontrolle über diese Ressourcen.
Das binäre Semaphor Anwendung
stellt sicher, dass die Integrität des Zustands der Warteschlange selbst nicht beeinträchtigt wird, beispielsweise von zwei Produzenten, die versuchen, gleichzeitig Gegenstände zu einer leeren Warteschlange hinzuzufügen, wodurch der interne Zustand verfälscht wird. Alternativ a Mutex könnte anstelle des binären Semaphors verwendet werden.
Das leere Beschichtung
ist anfangs N, fullcount
ist anfangs 0 und Anwendung
ist anfangs 1.
Der Produzent macht wiederholt Folg:
produzieren: P (leereCount) p (useQueue) putItemintoqueue (Element) V (UseQueue) V (FullCount)
Der Verbraucher macht wiederholt folgende
verbrauchen: P (fullCount) p (usequeue) item ← getItemfromqueue () v (usequeue) v (leereCount)
Unten finden Sie ein inhaltliches Beispiel:
- Ein einzelner Verbraucher betritt seinen kritischen Abschnitt. Seit
fullcount
ist 0, die Verbraucherblöcke. - Mehrere Hersteller betreten den kritischen Abschnitt "Produzent". Nicht mehr als N Die Hersteller können ihren kritischen Abschnitt eingeben, weil
leere Beschichtung
ihren Eintrag einschränken. - Die Produzenten erhalten nacheinander Zugang zur Warteschlange durch
Anwendung
und Einzahlung von Gegenständen in der Warteschlange. - Sobald der erste Produzent seinen kritischen Abschnitt verlässt,
fullcount
wird inkrementiert, sodass ein Verbraucher seinen kritischen Abschnitt eingeben kann.
Beachten Sie, dass leere Beschichtung
kann viel niedriger sein als die tatsächliche Anzahl leerer Orte in der Warteschlange, zum Beispiel für den Fall, in dem viele Produzenten es abgeschlossen haben, aber darauf warten, dass sie eingeschaltet werden Anwendung
Vor dem Füllen leerer Stellen. Beachten Sie, dass leereCount + fullcount ≤ n
Immer gilt, mit Gleichheit, wenn und nur wenn keine Hersteller oder Verbraucher ihre kritischen Abschnitte ausführen.
Betriebsnamen
Die kanonischen Namen V und P stammen aus den Initialen von Niederländisch Wörter. V wird allgemein als erklärt als Verhogen ("Zunahme"). Für P wurden mehrere Erklärungen angeboten, einschließlich Proberen ("testen" oder "versuchen"),[4] Passieren ("Pass") und Pakken ("greifen"). Dijkstra's frühestes Papier zu diesem Thema[2] gibt Passaging ("Pass") als Bedeutung für P, und vrijgave . Dijkstra schrieb darauf, dass er beabsichtigt habe P Für etwas stehen Prolaag,[5] kurz für Probier te Verlagen, buchstäblich "versuchen, die im anderen Fall verwendeten Begriffe zu reduzieren oder zu parallel.[6][7][8]
Im Algol 68, das Linux Kernel,[9] und in einigen englischen Lehrbüchern die V und P Operationen werden jeweils bezeichnet, hoch und Nieder. In der Software -Ingenieurpraxis werden sie oft genannt Signal und Warten,[10] Veröffentlichung und erwerben[10] (was der Standard Java Bibliothek[11] Verwendungen) oder Post und Pend. Einige Texte[12][13] Ruf Sie an räumen und besorgen zu den ursprünglichen niederländischen Initialen entsprechen.
Semaphoren gegen Mutexes
A Mutex ist ein Verschlussmechanismus Das verwendet manchmal die gleiche grundlegende Implementierung wie das binäre Semaphor. Die Unterschiede zwischen ihnen liegen in der Art und Weise, wie sie verwendet werden. Während ein binäres Semaphor umgangssprachlich als Mutex bezeichnet werden kann, hat ein echter Mutex einen spezifischeren Anwendungsfall und eine Definition, in denen nur die Aufgabe Das soll das Mutex entsperren. Diese Einschränkung zielt darauf ab, einige potenzielle Probleme bei der Verwendung von Semaphoren zu bewältigen:
- Prioritätsinversion: Wenn der Mutex weiß, wer es gesperrt hat und es freischalten soll, ist es möglich, die Priorität dieser Aufgabe zu fördern, wenn eine Aufgabe mit höherer Priorität auf den Mutex wartet.
- Frühgeborene Aufgabenabschluss: Mutexes können auch Löschsicherheit liefern, wobei die Aufgabe, die den Mutex hält, nicht versehentlich gelöscht werden kann.
- Beendigung Deadlock: Wenn eine mustex-hörende Aufgabe aus irgendeinem Grund endet, die OS Kann die MUTEX- und Signalwartungsaufgaben dieser Erkrankung loslassen.
- Rekursion Deadlock: Eine Aufgabe darf a sperren a Wiedereintritt mutex Mehrmals, wenn es eine gleiche Anzahl von Male freigeschaltet wird.
- Zufällige Freigabe: Bei der Veröffentlichung des Mutex wird ein Fehler aufgeworfen, wenn die Freigabe nicht der Besitzer ist.
Siehe auch
- Synchronisation (Informatik)
- Zigarettenraucherproblem
- Dachphilosophenproblem
- Leser-Schriftsteller Problem
- Schlafen Friseurproblem
- Monitor
- Falsches Aufwachen
Verweise
- ^ Dijkstra, Edsger W. Über Seinpalen (EWD-74) (PDF). E. W. Dijkstra Archiv. Zentrum für amerikanische Geschichte, Universität von Texas in Austin. (Transkription)
- ^ a b Dijkstra, Edsger W. Over de Sequentialiteit van Procesbeschrijvenen (EWD-35) (PDF). E. W. Dijkstra Archiv. Zentrum für amerikanische Geschichte, Universität von Texas in Austin. (Transkription) (undatiert, 1962 oder 1963)
- ^ Das kleine Buch der Semaphoren Allen B. Downey
- ^ Silberschatz, Galvin & Gagne 2008, p. 234
- ^ Dijkstra, Edsger W. EWD-74 (PDF). E. W. Dijkstra Archiv. Zentrum für amerikanische Geschichte, Universität von Texas in Austin. (Transkription)
- ^ Dijkstra, Edsger W. Multiprogacking en de x8 (EWD-51) (PDF). E. W. Dijkstra Archiv. Zentrum für amerikanische Geschichte, Universität von Texas in Austin. (Transkription) (in Niederländisch)
- ^ Dijkstra's eigene Übersetzung lautet "Versuchund-Decrease ", obwohl dieser Satz für diejenigen, die sich der nicht bewusst sind, verwirrend sein könnte Umgangssprachliche "Try-and ..."
- ^ (Patch 1/19) Mutex: Einführung einer einfachen Mutex -Implementierung Linux Kernel Mailingliste, 19. Dezember 2005
- ^ Linux -Kernel -Hacking Howto Linuxgrill.com
- ^ a b Mullender, Sape; Cox, Russ (2008). Semaphoren in Plan 9 (PDF). 3. International Workshop auf Plan 9.
- ^
java.util.concurrent.semaphor
- ^ "Exec.Library/Procure". amigadev.elowar.com. Abgerufen 2016-09-19.
- ^ "Exec.Library/Leerlauf". amigadev.elowar.com. Abgerufen 2016-09-19.
Externe Links
Einführungen
- Hilsheimer, Volker (2004). "Implementierung eines Lese-/Schreibens -Mutex" (Website). Qt vierteljährlich, Ausgabe 11 - Q3 2004
- Zelenski, Julie; Parlante, Nick. "Thread- und Semaphor -Beispiele" (PDF). Handzettel. CS107 -Programmierparadigmen. Stanford Engineering Everwhere (siehe). Frühjahr 2008 (23).
Verweise
- Dijkstra, Edsger W. Kooperierende sequentielle Prozesse (EWD-123) (PDF). E. W. Dijkstra Archiv. Zentrum für amerikanische Geschichte, Universität von Texas in Austin. (Transkription) (September 1965)
- "semaphore.h - semaphores (realtime)". Die offenen Gruppenbasisspezifikationen Ausgabe 6 IEEE STD 1003.1, 2004 Ausgabe. Offene Gruppe. 2004.
- Downey, Allen B. (2016) [2005]. "Das kleine Buch der Semaphoren" (2. Aufl.). Grüne Teepresse.
- Leppäjärvi, Jouni (11. Mai 2008). "Eine pragmatische, historisch orientierte Umfrage zur Universalität der Synchronisationsprimitive" (PDF). Universität von Oulu, Finnland.