Ja schauen wir uns nun mal ein paar einfache Schloss Algorithmen an und greifen die
Implementierungsvariante auf die wir gerade zuvor noch gesehen haben als war dieses Test
ins Set diese diesen TAS Befehl eingeführt haben. Da ist das Eintrittsprotokoll in den
kritischen Abschnitt implementiert in dieser Equire Methode dann wie folgt wir haben eine
einfache Kopfschleife in der würde man die Test in Set Operation aufrufen und wenn Test in Set
true liefert dann heißt es dass man warten muss ja weil nämlich dann letztlich die Sperre immer
noch gesetzt ist wenn Test in Set false liefert dann wissen wir dass die Sperre in dem Moment wo
der Wert gelesen worden ist innerhalb der Test in Set Operation eben nicht erhoben war am Ende von
TAS aber erhoben wurde und wir können demzufolge aus der Equire Operation herausgehen und sind
denn der einzige Prozess der einzige gleichzeitig Prozess der in dem Moment sozusagen den kritischen
Abschnitt der genau durch dieselbe diese Lock variable geschützt ist denn eintreten würde nun
das ist eine naive Lösung mit einer schädlichen Wirkung für den Cache für den Pufferspeicher
denn wie wir ja gesehen haben schreibt diese Test in Set Implementierung grundsätzlich immer
ist ein unbedingtes schreiben und das bedeutet dann letztendlich wenn wir Cache basierte Systeme
haben was heute der Fall ist für gewöhnlich bei den aller allermeisten Prozessoren die man so
verwendet zumindest wenn man so die Standardprozessoren aus dem PC Bereich hat wie in
Intel etwa oder auch die ARM Prozessoren ja dann werden die alle mit Caches ausgestattet sein und
dann wird dann jedes Schreiben in den auf eine Variable dazu führen dass dann praktisch Cache
Zeilen invalidiert werden die müssen dann zurückgeschrieben werden in den Hauptspeicher
letztendlich und das heißt auf der anderen Seite der nächste Prozessor der praktisch auf diese
Variable zugreift wird denn diese Cache Zeile halt wieder erneut einlesen sind dann also mal
teure Lesevorgänge der Cache ist deshalb da damit man einfach mit der Taktgeschwindigkeit der CPU
voranschreiten kann aber nun wären denn praktisch alle diese Prozessoren die denn hier über diese
Equier-Operation mit diesen Schlossalgorithmen miteinander gekoppelt sind letztendlich von der
Speichergeschwindigkeit abhängig weil ja die Cache Zeilen halt immer rausgeschrieben worden
sind und der Cache invalidiert worden ist bezüglich dieser Cache Zeile bei den anderen Prozessoren
also nicht mehr im Cache enthalten ist wenn man sie dann neu eingelesen werden ja das ist das
Problem generiert also enormen Leistungsverlust das ist der eine Punkt der andere Punkt ist dass
eben auch diese Implementierung die wir hier sehen eine unangenehme Auswirkung halt hat auf
kausal unabhängige Prozesse die kausal abhängigen Prozesse wären denn die irgendwie die mit derselben
Lock Variable praktisch an demselben kritischen Abschnitt denn miteinander gekoppelt sind aber
was ist mit den Prozessen die sozusagen überhaupt gar keine Lock-Operationen jetzt zurzeit ausführen
die einfach nur an den Speicher ran wollen auch die werden hier gestört das ist Interferenz was
durch diesen Algorithmus massiv generiert wird denn diese atomare Operation Test and Set ist
deshalb atomar weil der Bus für die Ausführungszeit von Test and Set gesperrt ist. Es ist ein Bus-Lock den
man dort durchführt und damit kommen eben andere Prozessoren nicht über diesen Bus an den Hauptspeicher
ran während einer atomaren Operation im Gange ist und wenn man das jetzt hier einfach in so einer
Schleife haben dann werden also bei einer großen Anzahl von gleichzeitig Prozessen die jetzt hier
alle in dieser Schleife warten natürlich alle diese Test and Set, alle diese Bus-atomaren Operationen
als Sequenz hintereinander aufgeführt ja das heißt also eigentlich die Sperrzeit des Buses
für Prozessoren die nicht über dieses Aquire mit diesem Lock laufen kann sehr groß werden ja und
wenn diese Prozessoren nicht mehr aus ihrem Cash-Einhalten profitieren können dann werden
sie halt sehr sehr lange darauf warten müssen um an den Hauptspeicher ranzukommen obwohl sie mit
diesem kritischen Abschnitt und mit diesem Protokoll überhaupt nichts zu tun haben das ist dann
Enteferenz was für diese Prozessoren denn gilt und sollte man unbedingt vermeiden also in
nicht-funktionaler hinsicht skaliert diese Lösung eigentlich ziemlich schlecht ja und man muss ja
diesen Schlossalgorithmus ein bisschen umschreiben man kann jetzt Lösungen anbieten das schauen wir
uns gleich an in die man den bedingt schreibt oder ein weiterer Schritt ist dann halt in dem man
den kreiselt durch Ablesen einer Schlossvariablen oder man hält sich so ja in gewissen Konflikten
fällen für anläuter Bus atomare operationen entsprechend zurück das sind die wichtigen
Presenters
Zugänglich über
Offener Zugang
Dauer
00:30:58 Min
Aufnahmedatum
2020-12-04
Hochgeladen am
2020-12-05 03:49:30
Sprache
de-DE