3.2.11.2.3 Aktives Warten mit TSL

[unmarkierte Version][gesichtete Version]
Keine Bearbeitungszusammenfassung
 
(13 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
=Aktives Warten mit TSL=


<p>
Der TSL-Befehl ist ein spezieller Maschinenbefehl, der von einigen CPUs zur Verfügung gestellt wird. Es handelt sich also um einen Assemblerbefehl, ähnlich denen aus [[Das Problem des ungünstigsten Moments#Listing_2|diesem vorangegangenen Listing]].
Der TSL-Befehl ist ein spezieller Maschinenbefehl, der von einigen CPUs zur Verfügung gestellt wird. Es handelt sich also um einen Assemblerbefehl, ähnlich denen aus [[Das Problem des ungünstigsten Moments#Listing_2|diesem vorangegangenen Listing]].
</p>
</p>
Zeile 9: Zeile 7:
== TSL, TAS oder XCHG ==
== TSL, TAS oder XCHG ==
<p>
<p>
'''TSL''' steht als Abkürzung für '''Test and Set Lock''', in einigen Quellen (oder auf einigen CPUs) heißt dieser Befehl alternativ '''TAS''', was für '''Test And Set''' steht. <cite>Mandl+2013</cite> weist in Kapitel 6.2.1 auch auf den '''XCHG'''-Befehl hin, der auf Intel-basierten Maschinen mit entsprechender Funktionalität zu finden ist (XCHG als Abkürzung für '''Exchange''', siehe [[Aktives_Warten_mit_TSL#Aufgabe_2|Aufgabe 2 unten]]).
'''TSL''' steht als Abkürzung für '''Test and Set Lock''', in einigen Quellen (oder auf einigen CPUs) heißt dieser Befehl alternativ '''TAS''', was für '''Test And Set''' steht. <cite id="5fa9783c2e231">Mandl+2013</cite> weist in Kapitel 6.2.1 auch auf den '''XCHG'''-Befehl hin, der auf Intel-basierten Maschinen mit entsprechender Funktionalität zu finden ist (XCHG als Abkürzung für '''Exchange''', siehe [[Aktives_Warten_mit_TSL#Aufgabe_2|Aufgabe 2 unten]]).
</p>
</p>


Zeile 15: Zeile 13:
[[Das Problem des ungünstigsten Moments#Listing_2|Dieses vorangegangene Listing]] kann nun durch Einbringung des TSL-Befehls umgestaltet werden. Zur Erinnerung: In Speicherzelle 25 ist der aktuelle Wert der Sperrvariablen <span style="font-family:Courier">lock</span> abgelegt.
[[Das Problem des ungünstigsten Moments#Listing_2|Dieses vorangegangene Listing]] kann nun durch Einbringung des TSL-Befehls umgestaltet werden. Zur Erinnerung: In Speicherzelle 25 ist der aktuelle Wert der Sperrvariablen <span style="font-family:Courier">lock</span> abgelegt.
</p>
</p>
<p>
<p id="Listing_1">
<loop_area type="sourcecode">
<loop_area type="sourcecode">
<p>
<p>
Zeile 21: Zeile 19:
10: TSL 25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; Hier passieren zwei Dinge als atomare Aktion:<br />
10: TSL 25&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; Hier passieren zwei Dinge als atomare Aktion:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; --> Wert aus Speicherzelle 25 in Akkumulator kopieren<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; --> Wert aus Speicherzelle 25 in Akkumulator kopieren<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; --> Zahl 1 in Speicherzelle 25 schreiben (setze lock=1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; --> Zahl 1 in Sp.zelle 25 schreiben (setze lock=1)<br />
11: EQUAL #0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; Prüfe: Ist ACC == 0?  (Eigentlich: ist lock == 0?)<br />
11: EQUAL #0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; Prüfe: Ist ACC == 0?  (Eigentlich: ist lock == 0?)<br />
12: JUMP 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; Prüfung ergab FALSE<br />
12: JUMP 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;; Prüfung ergab FALSE<br />
Zeile 35: Zeile 33:


<p>
<p>
Im Vergleich zum [[Das Problem des ungünstigsten Moments#Listing_2|vorangegangenen Listing]] ist Listing 1 hier deutlich kürzer. Für das Verständnis wichtig ist die Arbeitsweise des TSL-Befehls. Die CPU sorgt bei der Ausführung des TSL-Befehls dafür, dass zwei Dinge innerhalb einer Aktion ''(atomar!)'' passieren, weder ein Kontextwechsel, noch ein Interrupt können den TSL-Befehl unterbrechen:
Im Vergleich zum [[Das Problem des ungünstigsten Moments#Listing_2|vorangegangenen Listing]] ist Listing 1 hier deutlich kürzer. Für das Verständnis wichtig ist die Arbeitsweise des TSL-Befehls. Die CPU sorgt bei der Ausführung des TSL-Befehls dafür, dass zwei Dinge innerhalb einer Aktion ''([[Das_Problem_des_ungünstigsten_Moments#Definition:_Atomare_Aktion|atomar]]!)'' passieren, weder ein Kontextwechsel, noch ein Interrupt können den TSL-Befehl unterbrechen:
# Kopiere den aktuellen Wert der lock-Variablen aus Speicherzelle 25 in das Register R1, und
# Kopiere den aktuellen Wert der lock-Variablen aus Speicherzelle 25 in das Register R1, und
# Schreibe in Speicherzelle 25 den Wert 1, setze also <span style="font-family:Courier">lock = 1</span>.
# Schreibe in Speicherzelle 25 den Wert 1, setze also <span style="font-family:Courier">lock = 1</span>.
Zeile 49: Zeile 47:
<p>
<p>
<loop_area type="task">
<loop_area type="task">
<loop_task title="Speicherzelle 13">
<loop_task title="Speicherzelle 13" id="5fa9783c2e255">
<p>
<p>
In Listing 1 oben auf dieser Seite findet sich in Speicherzelle 13 kein Befehl, sondern nur ''"drei Punkte"''.
In [[Aktives_Warten_mit_TSL#Listing_1|Listing 1 oben auf dieser Seite]] findet sich in Speicherzelle 13 kein Befehl, sondern nur ''"drei Punkte"''.
</p>
</p>
<p>
<p>
Zeile 66: Zeile 64:
<p>
<p>
<loop_area type="task">
<loop_area type="task">
<loop_task title="XCHG bei Intel">
<loop_task title="XCHG bei Intel" id="5fa9783c2e264">
<p>
<p>
Intel zeigt im [http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf Intel® 64 and IA-32 Architectures Optimization Reference Manual] in Kapitel 8.4.2, Example 8-4, ein Beispiel für die Verwendung des XCHG-Befehls.  
Intel zeigt im [http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf Intel® 64 and IA-32 Architectures Optimization Reference Manual] in Kapitel 8.4.2, Example 8-4, ein Beispiel für die Verwendung des XCHG-Befehls.  
Zeile 85: Zeile 83:
<p>
<p>
<loop_area type="task">
<loop_area type="task">
<loop_task title="Gilt der Nachteil noch?">
<loop_task title="Gilt der Nachteil noch?" id="5fa9783c2e272">
<p>
<p>
Hattest du in [[Aktives_Warten#Aufgabe_4|dieser Aufgabe]] den großen Nachteil des [[aktives Warten|aktiven Wartens]] herausgefunden?
Hattest du in [[Aktives_Warten_mit_while#Aufgabe_4|dieser Aufgabe]] den großen Nachteil des [[aktives Warten|aktiven Wartens]] herausgefunden?
</p>
</p>
<p>
<p>
Zeile 93: Zeile 91:
</p>
</p>
</loop_task>
</loop_task>
</loop_area>
</p>
<br />
== An Ode to the Atomic TSL Instruction ==
<p>
Das folgende (englischsprachige) Video erläutert noch einmal den Zusammenhang von [[Race Conditions]], [[Kritischer Abschnitt|Kritischen Abschnitten]] und der [[TSL-Befehl#TSL.2C_TAS_oder_XCHG|TSL-Anweisung]]. Die [[TSL-Befehl#Hintergr.C3.BCnde|oben eingeführte <span style="font-family:Courier">lock</span>-Variable]] heißt hier zwar etwas anders und wird auch mit anderen Werten belegt, aber diese Transferleistung ist sicher nicht zu viel verlangt:
</p>
<p>
<loop_area icon="Video.png" icontext="Video">
<loop_media type="video" title="An Ode to the Atomic TSL Instruction (03:59)" description="http://youtu.be/3TJHdETtfhE (Autor: kjlg74)" copyright="CC-BY" index=true show_copyright=true>{{#ev:youtube|3TJHdETtfhE|700}}
</loop_media>
</loop_area>
</loop_area>
</p>
</p>

Aktuelle Version vom 24. Januar 2023, 16:36 Uhr

Der TSL-Befehl ist ein spezieller Maschinenbefehl, der von einigen CPUs zur Verfügung gestellt wird. Es handelt sich also um einen Assemblerbefehl, ähnlich denen aus diesem vorangegangenen Listing.


TSL, TAS oder XCHG

TSL steht als Abkürzung für Test and Set Lock, in einigen Quellen (oder auf einigen CPUs) heißt dieser Befehl alternativ TAS, was für Test And Set steht. Mandl 2013 weist in Kapitel 6.2.1 auch auf den XCHG-Befehl hin, der auf Intel-basierten Maschinen mit entsprechender Funktionalität zu finden ist (XCHG als Abkürzung für Exchange, siehe Aufgabe 2 unten).

Dieses vorangegangene Listing kann nun durch Einbringung des TSL-Befehls umgestaltet werden. Zur Erinnerung: In Speicherzelle 25 ist der aktuelle Wert der Sperrvariablen lock abgelegt.

Code

10: TSL 25          ; Hier passieren zwei Dinge als atomare Aktion:
                    ; --> Wert aus Speicherzelle 25 in Akkumulator kopieren
                    ; --> Zahl 1 in Sp.zelle 25 schreiben (setze lock=1)
11: EQUAL #0        ; Prüfe: Ist ACC == 0? (Eigentlich: ist lock == 0?)
12: JUMP 10         ; Prüfung ergab FALSE
13: ...             ; Prüfung ergab TRUE


Listing 1: Sperre in Assembler mit TSL-Befehl

Im Vergleich zum vorangegangenen Listing ist Listing 1 hier deutlich kürzer. Für das Verständnis wichtig ist die Arbeitsweise des TSL-Befehls. Die CPU sorgt bei der Ausführung des TSL-Befehls dafür, dass zwei Dinge innerhalb einer Aktion (atomar!) passieren, weder ein Kontextwechsel, noch ein Interrupt können den TSL-Befehl unterbrechen:

  1. Kopiere den aktuellen Wert der lock-Variablen aus Speicherzelle 25 in das Register R1, und
  2. Schreibe in Speicherzelle 25 den Wert 1, setze also lock = 1.

Der EQUAL-Befehl vergleicht anschließend den Wert aus Register 1 mit der Zahl 0. Abhängig vom Ergebnis dieses Vergleichs muss der durchführende Prozess entweder in der Schleife weiter warten, oder darf seinen kritischen Bereich ausführen.


Aufgabe 1

Aufgabe

In Listing 1 oben auf dieser Seite findet sich in Speicherzelle 13 kein Befehl, sondern nur "drei Punkte".

Welcher Befehl sollte in Speicherzelle 13 stehen?
Oder anders gefragt: Was sollen die "drei Punkte" andeuten?


Aufgabe 2

Aufgabe

Intel zeigt im Intel® 64 and IA-32 Architectures Optimization Reference Manual in Kapitel 8.4.2, Example 8-4, ein Beispiel für die Verwendung des XCHG-Befehls.

Wie unterscheiden sich die Funktionsweisen des gerade beschriebenen TSL-Befehls und des XCHG-Befehls?

Kann deiner Meinung nach mit beiden Varianten die gleiche Funktionalität erreicht werden? Diskutiere diese Frage in deiner Lerngruppe!


Aufgabe 3

Aufgabe

Hattest du in dieser Aufgabe den großen Nachteil des aktiven Wartens herausgefunden?

Gilt dieser Nachteil dann auch noch bei Einsatz des TSL-, TAS- oder XCHG-Befehls?