EMZETT.
Login

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_WAIT schläft, bis der Wert sich ändert, FUTEX_WAKE weckt 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: strace zeigt viele futex-Aufrufe, wenn ein Programm unter Sperrenstreit leidet. Siehe strace.

Siehe auch: Semaphore