Du hast eine bestimmte Speicherzelle, die anfangs auf eins gesetzt ist. Hier ist es die Speicherzelle 12345. Die eins bedeutet, daß eine bestimmte Ressource (z. B. Diskettenlaufwerk) gerade freigegeben ist. Jeder Prozeß, der an das Diskettenlaufwerk will, führt nun die Befehlssequenz von oben aus:
1. setze eine (prozeßinterne) Variable, kann auch ein Register sein, auf Null.
2. Vertausche nun solange diese Variable mit der Schutzzelle 12345, bis die Variable nicht mehr Null ist. Da in den Vertauschungen immer eine Null beteiligt war (die, die am Anfang in der prozeßinteren Variable war), ist die jetzt in der Schutzzelle. (ohne Beweis)
3. Im gesamten Ablauf um diese Schutzzelle (also der Menge aller Prozesse, die darauf zugreifen), gibt es zu jedem Zeitpunkt nur eine Eins. Wer die hat, darf das Diskettenlaufwerk benutzen. Da dieser Prozeß gerade die Eins hat, sind alle anderen Prozesse vom diskettenlaufwerk abgeschnitten.
4. Wenn dieser Prozeß fertig ist, schreibt er die Eins wieder in die Schutzzelle zurück. Der nächste Prozeß, der diese Vertauschungen vornimmt, bekommt sie und ist glücklich.
Nunja…ich hab keine Ahnung was das da oben bedeutet ,
ist das assembler? *schäm*
Ich bräuchte eigentlich mal eine Umgangssprachliche Beschreibung der Vorgänge.
Copy-And-Set:
Es gibt eine Speicherzelle w, die am Anfang 0 ist. Die 0 bedeutet: Ressource frei.
Wenn ein Prozeß nun die Ressource haben will, führt er folgendes Programm aus:
repeat
atomar begin
status := w;
w := 1;
end;
until status = 0;
[i]{ Ressource bearbeiten }[/i]
w := status;
Der xchg-Befehl ist sehr ähnlich zu Copy-And-Set. Er vertauscht zwei Variablen (beim i386 muß mindestens eine davon ein Register sein). Den Copy-And-Set-Befehl kann man so nachbauen:
a := 1;
Copy-And-Set(a, b);
Da der Nachbau so einfach ist, hat der Intel-Prozessor wohl den Copy-And-Set-Befehl weggelassen.
Auf den SPARC-Prozessoren ist die Sache noch ein wenig anders geregelt …
Roland