Gegenseitiger Ausschluss

Gegenseitiger Ausschluss, in der Informatik, bezieht sich auf das Problem des Sicherstellens, dass keine zwei Prozesse oder Fäden (künftig verwiesen auf nur als Prozesse) in ihrer kritischen Abteilung zur gleichen Zeit sein können. Hier bezieht sich eine kritische Abteilung auf eine Zeitspanne, wenn der Prozess auf eine geteilte Quelle wie geteiltes Gedächtnis zugreift. Das Problem des gegenseitigen Ausschlusses wurde zuerst identifiziert und von Edsger W. Dijkstra in seiner betitelten Samen-1965-Zeitung behoben: Lösung eines Problems in der gleichzeitigen Programmierkontrolle.

Ein einfaches Beispiel dessen, warum gegenseitiger Ausschluss in der Praxis wichtig ist, kann mit einer einzeln verbundenen Liste vergegenwärtigt werden. (Sieh Abbildung 1.) In solch einer verbundenen Liste wird die Eliminierung eines Knotens durch das Ändern des "folgenden" Zeigestocks des vorhergehenden Knotens getan, um zum nachfolgenden Knoten hinzuweisen (z.B, wenn Knoten ich werde dann der "folgende" Zeigestock des Knotens i-1 entfernt, geändert wird, um zum Knoten i+1 hinzuweisen). In einer Ausführung, wo solch eine verbundene Liste zwischen vielfachen Prozessen geteilt wird, können zwei Prozesse versuchen, zwei verschiedene Knoten zu entfernen, die gleichzeitig auf das folgende Problem hinauslaufen. Lassen Sie Knoten i und i+1 die zu entfernenden Knoten sein. Lassen Sie außerdem weder ihrer, der Kopf noch der Schwanz zu sein. Der folgende Zeigestock des Knotens i-1 wird geändert, um zum Knoten i+1 und der folgende Zeigestock des Knotens hinzuweisen, den ich geändert werde, um auf den Knoten i+2 anzuspitzen. Obwohl beide Eliminierungsoperationen erfolgreich vollenden, bleibt Knoten i+1 in der Liste, seitdem i-1 gemacht wurde, zum I+1-Hüpfen-Knoten i hinzuweisen (der gemacht wurde, zu i+2 hinzuweisen). Das kann in der Abbildung 1 gesehen werden. Dieses Problem kann mit dem gegenseitigen Ausschluss vermieden werden, um sicherzustellen, dass gleichzeitige Aktualisierungen zu demselben Teil der Liste nicht vorkommen können.

Das Erzwingen gegenseitigen Ausschlusses

Es gibt sowohl Software als auch Hardware-Lösungen, um gegenseitigen Ausschluss geltend zu machen. Einige verschiedene Lösungen werden unten besprochen.

Hardware-Lösungen

Auf uniprocessor Systemen soll die einfachste Lösung, gegenseitigen Ausschluss zu erreichen, Unterbrechungen während einer kritischen Abteilung eines Prozesses unbrauchbar machen. Das wird irgendwelche Unterbrechungsdienstroutinen davon abhalten (effektiv das Hindern einen Prozess zu laufen, durch Vorkaufsrecht erworben zu werden). Obwohl diese Lösung wirksam ist, führt sie zu vielen Problemen. Wenn eine kritische Abteilung lang ist, dann wird die Systemuhr jedes Mal treiben, wenn eine kritische Abteilung durchgeführt wird, da die Zeitmesser-Unterbrechung nicht mehr bedient wird, ist so das Verfolgen der Zeit während der kritischen Abteilung unmöglich. Außerdem, wenn ein Prozess während seiner kritischen Abteilung hinkt, wird Kontrolle in einen anderen Prozess nie zurückgegeben, effektiv das komplette System haltend. Eine elegantere Methode, um gegenseitigen Ausschluss zu erreichen, ist das beschäftigte - warten.

Beschäftigt - warten ist sowohl für uniprocessor als auch für Mehrverarbeiter-Systeme wirksam. Der Gebrauch des geteilten Gedächtnisses und einer Atominstruktion des Tests-Und-Satzes stellt den gegenseitigen Ausschluss zur Verfügung. Ein Prozess kann Test-Und-Satz auf einer Position im geteilten Gedächtnis, und da die Operation atomar ist, kann nur ein Prozess die Fahne auf einmal setzen. Jeder Prozess, der im Setzen der Fahne erfolglos ist, kann entweder fortsetzen, andere Aufgaben zu erledigen und später noch einmal zu versuchen, den Verarbeiter zu einem anderen Prozess zu veröffentlichen und später noch einmal zu versuchen oder fortzusetzen, sich zu schlingen, während er die Fahne überprüft, bis es im Erwerben davon erfolgreich ist. Diese Methode erlaubt dem System fortzusetzen zu fungieren, selbst wenn ein Prozess hinkt, während er das Schloss hält, da Vorkaufsrecht noch möglich ist.

Mehrere andere Atomoperationen können verwendet werden, um gegenseitigen Ausschluss von Datenstrukturen zur Verfügung zu stellen; am bemerkenswertesten von diesen ist Compare-And-Swap (CAS). CAS kann verwendet werden, um zu erreichen, warten auf freien gegenseitigen Ausschluss für jede geteilte Datenstruktur. Das kann durch das Schaffen einer verbundenen Liste erreicht werden, wo jeder Knoten die gewünschte durchzuführende Operation vertritt. CAS wird dann verwendet, um die Zeigestöcke in der verbundenen Liste während der Einfügung eines neuen Knotens zu ändern. Nur ein Prozess kann in seinem CAS, alle anderen Prozesse erfolgreich sein, die versuchen hinzuzufügen, dass ein Knoten zur gleichen Zeit wird noch einmal versuchen müssen. Jeder Prozess kann dann eine lokale Kopie der Datenstruktur, und nach dem Überqueren der verbundenen Liste behalten, kann jede Operation von der Liste auf seiner lokalen Kopie durchführen.

Softwarelösungen

Neben der unterstützten Lösung der Hardware bestehen einige Softwarelösungen, die "beschäftigt verwenden - warten", um das Ziel zu erreichen.

Beispiele von diesen schließen den folgenden ein:

Der Algorithmus von Peterson Der Backalgorithmus von Lamport
  • Der Algorithmus von Szymanski
  • Der schwarz-weiße Backalgorithmus von Taubenfeld

Drehungsschlösser und das beschäftigte Warten nehmen übermäßige Verarbeiter-Zeit und Macht auf und werden als Antimuster in fast jedem Fall betrachtet. Außerdem arbeiten diese Algorithmen nicht, wenn in Unordnung Ausführung auf der Plattform verwertet wird, die sie durchführt. Programmierer müssen strenge Einrichtung auf den Speicheroperationen innerhalb eines Fadens angeben.

Die Lösung dieser Probleme ist, Synchronisationsmöglichkeiten zu verwenden, die von einer Nebenläufigkeitsbibliothek eines Betriebssystems zur Verfügung gestellt sind, die Hardware-Lösungen ausnutzen wird, wenn möglich, aber Softwarelösungen verwenden wird, wenn keine Hardware-Lösungen bestehen. Zum Beispiel, wenn die Schloss-Bibliothek des Betriebssystems verwendet wird und ein Faden versucht, ein bereits erworbenes Schloss zu erwerben, wird das Betriebssystem den Faden mit einem Zusammenhang-Schalter aufheben und tauscht ihn mit einem anderen Faden, der bereit ist, geführt zu werden, oder diesen Verarbeiter in einen niedrigen Macht-Staat stellen konnte, wenn es keinen anderen Faden gibt, der geführt werden kann. Deshalb versuchen modernste gegenseitige Ausschluss-Methoden, Latenz zu reduzieren, und beschäftigt - wartet durch das Verwenden des Schlangestehens und der Zusammenhang-Schalter. Jedoch, wenn die Zeit, die ausgegeben wird, einen Faden aufhebend und dann wieder herstellend, wie man beweisen kann, es immer mehr ist als die Zeit, auf die für einen Faden gewartet werden muss, um bereit zu werden, herzulaufen in einer besonderen Situation blockiert zu werden, dann sind spinlocks eine feine Lösung für diese Situation nur.

Fortgeschrittener gegenseitiger Ausschluss

Synchronisationsprimitive können wie die Beispiele unten durch das Verwenden der Lösungen gebaut werden, die oben erklärt sind:

  • Schlösser
  • Einspringender mutexes
Semaphore
  • Monitore
  • Nachricht, die geht
  • Tupel-Raum

Viele Formen des gegenseitigen Ausschlusses haben Nebenwirkungen. Zum Beispiel erlauben klassische Semaphore tote Punkte, in denen-Prozess ein Semaphor bekommt, bekommt ein anderer Prozess ein zweites Semaphor, und dann warten beide für immer auf das andere zu veröffentlichende Semaphor. Andere allgemeine Nebenwirkungen schließen Verhungern ein, in dem ein Prozess nie genügend Mittel bekommt, zur Vollziehung, Vorzugsinversion zu laufen, in der ein höherer Vorzugsfaden auf einen Faden des niedrigeren Vorrangs, und "hohe Latenz" wartet, in der die Antwort auf Unterbrechungen nicht schnell ist.

Viel Forschung wird das Beseitigen der obengenannten Effekten, solcher als durch das Garantieren blockierungsfreien Fortschritts gezielt. Kein vollkommenes Schema ist bekannt.

Weiterführende Literatur

  • Michel Raynal: Algorithmen für den Gegenseitigen Ausschluss, die MIT Presse, die internationale Standardbuchnummer 0-262-18119-3
  • Sunil R. Das, Pradip K. Srimani: Verteilte Gegenseitige Ausschluss-Algorithmen, IEEE Computergesellschaft, internationale Standardbuchnummer 0-8186-3380-8
  • Thomas W. Christopher, George K. Thiruvathukal: Javanische Hochleistungsplattform-Computerwissenschaft, Prentice Hall, internationale Standardbuchnummer 0-13-016164-0
  • Gadi Taubenfeld, Synchronisationsalgorithmen und Gleichzeitige Programmierung, Pearson/Prentice Saal, internationale Standardbuchnummer 0-13-197259-6

Siehe auch

  • Atomicity, (programmierend)
  • Parallelitätskontrolle
  • Gegenseitig exklusive Ereignisse
  • Semaphor
  • Speisenphilosoph-Problem
  • Einspringender mutex

Links


Der Algorithmus von Dekker / Organisation für das Verbot von chemischen Waffen
Impressum & Datenschutz