Wikipedia · einfach zusammengefasst · Stand
Spinlock
Es ist eine Sperre (Lock) zum Schutz einer gemeinsam genutzten Ressource durch konkurrierende Prozesse bzw. Threads (siehe Kritischer Abschnitt) nach dem …
Inhalt4 Abschnitte
Grundprinzip
Ein Spinlock (Spin-Lock) ist ein Mechanismus zur Prozesssynchronisation. Er schützt eine gemeinsam genutzte Ressource vor gleichzeitigem Zugriff durch konkurrierende Prozesse oder Threads. Dazu verwendet er eine Sperre nach dem Prinzip des wechselseitigen Ausschlusses (Mutex): Zu einem bestimmten Zeitpunkt darf nur der Besitzer der Sperre den kritischen Abschnitt ausführen, also den Programmteil, in dem die gemeinsame Ressource verändert wird.
Die Sperrvariable kann die Zustände „frei“ oder „gesperrt“ besitzen. Der Prozess, der sie erfolgreich auf „gesperrt“ setzt, wird als Besitzer der Sperrvariablen bezeichnet.
Implementierung und Ablauf
Zu Beginn ist die Sperrvariable frei. Jeder Prozess beziehungsweise Thread durchläuft beim Eintritt in den kritischen Abschnitt dasselbe Protokoll:
- Solange die Sperrvariable den Wert „gesperrt“ besitzt, prüft der Prozess sie erneut und tut ansonsten nichts. Dieses Verfahren heißt aktives Warten.
- Sobald die Sperrvariable frei ist, wird sie auf „gesperrt“ gesetzt.
- Danach darf der Besitzer die gemeinsam genutzte Ressource im kritischen Abschnitt modifizieren.
- Beim Austritt setzt er die Sperrvariable wieder auf „frei“.
Das Prüfen, ob die Sperrvariable frei ist, und das anschließende Setzen auf „gesperrt“ müssen atomar erfolgen. Atomar bedeutet hier, dass beide Schritte als unteilbare Operation ausgeführt werden, sodass nicht zwei Prozesse gleichzeitig dieselbe freie Sperre übernehmen. Je nach Prozessorarchitektur wird dies beispielsweise mit Fetch-and-add, Compare-and-swap oder Test-and-set umgesetzt.
Vorteile
Spinlocks vermeiden Kontextwechsel. Ein Kontextwechsel bezeichnet den Wechsel des Prozessors von einem Thread zu einem anderen und kann sehr zeitaufwändig sein. Ist die durchschnittliche Wartezeit auf die Freigabe einer Sperre kürzer als die Zeit für einen Kontextwechsel, kann ein Spinlock trotz der zusätzlichen Laufzeit des aktiven Wartens schneller sein als alternative Mutexe.
Dadurch kann die effektive Parallelität gegenüber Synchronisationsmechanismen, die auf Threadwechseln beruhen, teilweise erheblich steigen. Deshalb werden Spinlocks bei stark nebenläufigen Algorithmen häufig eingesetzt, beispielsweise im Linux-Kernel.
Nachteile und Deadlock-Beispiel
Aktives Warten benötigt Prozessorzeit, obwohl der wartende Thread keine nützliche Arbeit ausführt. Sind mehr Threads als Prozessorkerne vorhanden, kann ein Spinlock die Programmausführung daher stark verlangsamen.
Abhängig vom Schedulingverfahren kann außerdem ein Deadlock entstehen. Ein Deadlock ist ein Zustand, in dem die benötigte Freigabe nicht mehr erfolgt. Beispiel: In einem Einprozessorsystem sperrt ein Thread L mit geringer Priorität erfolgreich einen Spinlock. Bevor L ihn freigibt, wird ein Thread H mit hoher Priorität lauffähig und vom Scheduler aktiviert. H versucht ebenfalls, den Spinlock zu sperren, und wartet aktiv. Bei einem Schedulingverfahren ohne Time Slicing bleibt H aktiv, während L nicht wieder lauffähig wird. L kann den Spinlock deshalb nicht freigeben; beide Threads kommen nicht weiter. Ein Synchronisationsmechanismus mit Threadwechsel hätte diesen Deadlock in dem Beispiel verhindert.