Spinlocks
"Die spin-locken doch, die Römer" - OSbelix
Spinlocks
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
Bewertung
| Vorteil | Nachteil |
|---|---|
| sehr schnell, kein OS nötig | verschwendet CPU-Zeit beim Warten |
| ideal auf Mehrkern-Systemen für kurze Sperren | sinnlos bei langen Wartezeiten → dann Semaphoren |
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