Prozesssynchronisationsprobleme treten auf, wenn zwei gleichzeitig laufende Prozesse dieselben Daten oder dieselbe Variable gemeinsam nutzen. Der Wert dieser Variablen wird möglicherweise nicht korrekt aktualisiert, bevor er von einem zweiten Prozess verwendet wird. Ein solcher Zustand ist als Race Around Condition bekannt. Es gibt sowohl Software- als auch Hardware-Lösungen für dieses Problem. In diesem Artikel werden wir über die effizienteste Hardwarelösung für Prozesssynchronisierungsprobleme und ihre Implementierung sprechen.
Es gibt drei Algorithmen im Hardware-Ansatz zur Lösung des Prozess-Synchronisationsproblems:
- Testen und Setzen
- Austauschen
- Entsperren und Sperren
Hardware-Anweisungen in vielen Betriebssystemen helfen bei der effektiven Lösung von Problemen in kritischen Abschnitten.
1. Testen und Setzen:
Hier ist die gemeinsam genutzte Variable lock, die auf false initialisiert wird. Der TestAndSet(lock)-Algorithmus funktioniert so, dass er immer den Wert zurückgibt, der an ihn gesendet wird, und die Sperre auf true setzt. Der erste Prozess wird sofort in den kritischen Abschnitt eintreten, da TestAndSet(lock) false zurückgibt und er die while-Schleife verlässt. Die anderen Prozesse können nun nicht mehr eintreten, da die Sperre auf true gesetzt ist und die while-Schleife somit weiterhin true ist. Der gegenseitige Ausschluss ist gewährleistet. Sobald der erste Prozess den kritischen Abschnitt verlässt, wird die Sperre auf false gesetzt. Nun können die anderen Prozesse einen nach dem anderen eintreten. Der Fortschritt ist ebenfalls gewährleistet. Nach dem ersten Prozess kann jedoch jeder beliebige Prozess eintreten. Es wird keine Warteschlange geführt, so dass jeder neue Prozess, der die Sperre wieder als falsch erkennt, eintreten kann. Eine begrenzte Wartezeit ist also nicht gewährleistet.
2. Swap:
Der Swap-Algorithmus ist dem TestAndSet-Algorithmus sehr ähnlich. Anstatt die Sperre in der Swap-Funktion direkt auf true zu setzen, wird der Schlüssel auf true gesetzt und dann mit der Sperre getauscht. Wenn sich also ein Prozess im kritischen Bereich befindet, kann kein anderer Prozess diesen Bereich betreten, da der Wert von lock true ist. Der gegenseitige Ausschluss ist gewährleistet. Außerhalb des kritischen Abschnitts wird die Sperre wieder auf false gesetzt, so dass kein Prozess, der sie findet, den kritischen Abschnitt betreten kann. Der Fortschritt ist gewährleistet. Aus demselben Grund ist jedoch auch hier eine begrenzte Wartezeit nicht gewährleistet.
3. Entsperren und Sperren:
Der Unlock and Lock Algorithmus verwendet TestAndSet, um den Wert der Sperre zu regulieren, fügt aber für jeden Prozess einen weiteren Wert, waiting[i], hinzu, der überprüft, ob ein Prozess gewartet hat oder nicht. In Bezug auf den Prozess im kritischen Abschnitt wird eine Warteschlange geführt. Alle Prozesse, die als nächstes an der Reihe sind, werden entsprechend ihrer Prozessnummer in die Warteschlange aufgenommen, nicht unbedingt in der Reihenfolge. Sobald der i-te Prozess den kritischen Abschnitt verlässt, wird die Sperre nicht auf false gesetzt, so dass jeder Prozess den kritischen Abschnitt nutzen kann, was bei den vorherigen Algorithmen das Problem war. Stattdessen wird geprüft, ob ein Prozess in der Warteschlange wartet. Die Warteschlange wird als zirkuläre Warteschlange betrachtet. j wird als der nächste Prozess in der Reihe betrachtet, und die while-Schleife prüft vom j-ten Prozess bis zum letzten Prozess und erneut von 0 bis zum (i-1)-ten Prozess, ob ein Prozess auf den Zugriff auf den kritischen Abschnitt wartet. Wenn kein Prozess wartet, wird der Sperrwert auf false gesetzt, und jeder nachfolgende Prozess kann den kritischen Abschnitt betreten. Ist dies der Fall, wird der Wert des wartenden Prozesses auf false gesetzt, so dass die erste while-Schleife false wird und der kritische Abschnitt betreten werden kann. Dies gewährleistet eine begrenzte Wartezeit. Das Problem der Prozesssynchronisierung kann also durch diesen Algorithmus gelöst werden.