3 SynchronisationSpinlocks

"Die spin-locken doch, die Römer" - OSbelix

Spinlocks

Auf einen Blick

Ein Spinlock realisiert aktives Warten: Ein Prozess dreht in einer Schleife („spin-t"), bis die Sperre frei ist. Funktioniert dank atomarer Hardware-Befehle wie TestAndSet. Gut nur bei sehr kurzen kritischen Abschnitten.

Warum nicht einfach so?

Ein naiver Versuch ist fehlerhaft:

while (sperre == LOCKED);   // warte
sperre = LOCKED;            // (1) ← hier kann unterbrochen werden!
/* kritischer Bereich */
sperre = UNLOCKED;

Zwischen dem Verlassen der Schleife und dem Setzen von LOCKED ist eine Unterbrechung möglich → zwei Prozesse kämen rein. Das Lesen und Setzen muss atomar geschehen.

TestAndSet

Moderne Hardware bietet atomare Befehle. Beispiel TestAndSet:

bool TestAndSet(bool *lock){ bool ret = *lock; *lock = TRUE; return ret; }

enter_critical(bool *lock){ while (TestAndSet(lock)) ; }  // spin
leave_critical(bool *lock){ *lock = FALSE; }

Liest und setzt in einem untrennbaren Schritt. Oft gekapselt im Datentyp Spinlock mit spinlock.lock() / spinlock.unlock().

Interaktiv

spinlock.html

Bewertung

VorteilNachteil
sehr schnell, kein OS nötigverschwendet CPU-Zeit beim Warten
ideal auf Mehrkern-Systemen für kurze Sperrensinnlos bei langen Wartezeiten → dann Semaphoren
Abgrenzung

Beim aktiven Warten (Spinlock) verbraucht der Wartende CPU. Beim passiven Warten (Semaphoren) legt das OS ihn schlafen — kein CPU-Verbrauch, aber mit OS-Overhead.

Verwandte Notes

Kritischer Abschnitt & Mutual Exclusion · Semaphoren · Race Conditions · Interrupts & Exceptions


⬅️ Kritischer Abschnitt & Mutual Exclusion · Semaphoren ➡️

Built with LogoFlowershow