Hardware Reference
In-Depth Information
Nicht-unterbrechbare Befehle
Multitasking-Betriebssysteme mussen die Moglichkeit bieten, einzelne Pro-
zesse zu synchronisieren, wenn diese auf gemeinsame Ressourcen zugreifen.
Im einfachsten Fall kommunizieren zwei Prozesse uber eine Variable im Spei-
cher, zu der beide Prozesse Zugriff haben. Wir betrachten als Beispiel den
Kontostand eines Kunden, der von der Software einer Bank verwaltet wird [1].
Er kann einerseits durch Auszahlungen am Bankautomaten und andererseits
durch automatische Zinsgutschriften verandert werden. Bei einer Zinsgut-
schrift wird der Kontostand aus dem Speicher in ein Register geladen und
die Zinsen werden berechnet und hinzuaddiert. Anschließend wird das Er-
gebnis zuruck in den Speicher geschrieben. Findet dieser Vorgang parallel
mit dem Abheben am Bankautomaten statt, so kann Folgendes geschehen:
Der Prozess zur Zinsgutschrift wird vom Betriebssystem nach dem Holen des
Kontostandes unterbrochen; der Bankautomat liest den Kontostand ebenfalls
in ein Register, subtrahiert den abgehobenen Betrag und schreibt das Ergeb-
nis zuruck in der Speicher, noch bevor der andere Prozess weiter lauft und
die Zinsberechnung fertig stellt. Als Nachstes lauft der erste Prozess weiter,
schreibt den alten Kontostand plus Zinsen zuruck in den Speicher und ersetzt
dort das Ergebnis der Subtraktion.
Der erste Losungsansatz besteht darin, eine weitere Variable zu benutzen,
um den Zugriff auf den Kontostand abzusichern. Ein Prozess kann diese Va-
riable lesen. Ist sie 0, so hat bereits ein anderer Prozess Zugriff auf den
Kontostand, und der Prozess muss warten. Ist sie hingegen 1, so ist der Kon-
tostand verfugbar. Man setzt sofort die Kontrollvariable auf 0, arbeitet mit
dem Kontostand und setzt dann die Kontrollvariable wieder auf 1.
Aber diese Vorgehensweise lost das Problem nicht! Es wurde lediglich das
Problem des unsynchronisierten Zugriffs auf den Konstostand verlagert: Nun
muss der Zugriff auf die Kontrollvariable synchronisiert werden. Dazu konnte
man eine weitere Kontrollvariable verwenden usw.
Der Kern des Problems besteht in der Moglichkeit einer Unterbrechung (Kon-
textwechsel) eines Prozesses durch das Betriebssystem nach dem Lesen der
Kontrollvariablen und vor dem Zuruckschreiben des aktualisierten Wertes.
Um das Problem zu losen, haben alle modernen Prozessoren mindestens einen
Befehl, der das Lesen, Andern und Schreiben erlaubt und nicht unterbrochen
werden kann. Man spricht oft auch von atomaren Befehlen oder von Test-
And-Set-Befehlen auch von Read-Modify-Write-Befehlen .
Beim MMIX ist ein solcher atomarer Befehl der CSWAP -Befehl (Compare and
Swap), der in einer einzigen, unteilbaren und ununterbrechbaren Instrukti-
on einen Test, einen Lesezugriff und einen Schreibzugriff implementiert. Mit
dieser Instruktion kann in obigem Beispiel die Kontrollvariable fur den Kon-
Search WWH ::




Custom Search