- Spinlock
-
Ein Spinlock (Spin-Lock) ist ein Mechanismus zur Prozesssynchronisation. Es ist eine Sperre (Lock) zum Schutz einer gemeinsam genutzten Ressource durch konkurrierende Prozesse bzw. Threads (siehe Kritischer Abschnitt). Die Sperre wird umgesetzt mittels aktivem Wartens:
//Eintrittsprotokoll solange (Sperrvariable besitzt Wert 'gesperrt') { // \ tue nichts; // | Achtung! Hier: } // | Atomares Vergleichen und Setzen setze Sperrvariable auf 'gesperrt' // / //kritischer Abschnitt modifiziere Ressource //Austrittsprotokoll setze Sperrvariable auf 'offen'
Zu Anfang besitzt die Sperrvariable den Wert 'frei'. Alle Prozesse durchlaufen für den Eintritt in einen kritischen Abschnitt das gleiche Protokoll: Wenn die Sperrvariable 'frei' ist, setze sie auf 'gesperrt', ansonsten prüfe dies erneut (aktives Warten). Das Prüfen und Setzen erfolgt atomar und wird je nach Prozessorarchitektur anders implementiert (siehe Fetch-and-add, Compare-and-swap oder Test-and-set).
Der Prozess, der die Sperrvariable auf 'gesperrt' setzt, wird als Besitzer der Sperrvariable bezeichnet.
Vorteile
Das Verfahren vermeidet Kontextwechsel, die sehr zeitaufwändig sind. Wenn das Warten auf die Freigabe der Sperre kürzer als ein Kontextwechsel ist, kann dieser Mechanismus trotz verschenkter Prozessorkapazitäten schneller ablaufen als alternative Sperrmöglichkeiten wie bspw. Mutex. Dies erhöht die effektive Parallelität gegenüber threadwechselnden Sperrmöglichkeiten teilweise erheblich und ist daher bei stark nebenläufigen Algorithmen oftmals die bevorzugte Vorgehensweise.
Nachteile
Das aktive Warten verschenkt Prozessorkapazitäten, welches ein wesentliches Merkmal der Spinlocks sind. Ein Spinlock kann die Programmausführung stark verlangsamen, wenn mehr Threads als Prozessorkerne vorhanden sind.
Kategorie:- Parallelverarbeitung
Wikimedia Foundation.