Futex: schnelle Sperren im Linux-Kernel
Kurz: Ein Futex („fast userspace mutex”) ist der Linux-Baustein, mit dem Sperren meist ganz ohne Kernelaufruf funktionieren und den Kernel nur bei Streit einschalten.
Genauer: Eine Sperre ist eine Zahl im Speicher. Ist sie frei, nimmt ein Thread sie per atomarer Operation, ohne den Kernel zu fragen. Nur wenn sie belegt ist, legt sich der Thread per Systemaufruf futex() schlafen.
Im Detail
- Schneller Pfad: Atomares Vergleichen und Tauschen im Userspace, wenige Nanosekunden.
- Langsamer Pfad:
FUTEX_WAITschläft, bis der Wert sich ändert,FUTEX_WAKEweckt Wartende. - Nutzer: pthread-Mutexe, Semaphoren und Bedingungsvariablen in glibc bauen darauf auf.
- Vorteil: Unbestrittene Sperren (der Normalfall) kosten fast nichts.
- Fallstricke: Falsches Aufwecken, Prioritätsinversion (dafür gibt es Prioritätsvererbung) und Fairness.
- Beobachten:
stracezeigt vielefutex-Aufrufe, wenn ein Programm unter Sperrenstreit leidet. Siehe strace.
Siehe auch: Semaphore