Futex
# Futex

Ein Futex (englisch fast userspace mutual exclusion etwa „schneller gegenseitiger Ausschluss im Userspace“) ist ein Mutex-Lockingmechanismus, der vom Betriebssystem Linux unterstützt wird. Die Besonderheit der Futex-Implementierung liegt darin, dass ein Großteil der Operationen im Userspace ausgeführt wird, und dadurch teure Aufrufe des Kernels vermieden werden. Im Gegensatz zum Mutex dient ein Futex deshalb zur Synchronisation von zu einem Prozess gehörenden Threads.
Die Implementierung stammt von Hubertus Franke (IBM Thomas J. Watson Research Center), Matthew Kirkwood, Ingo Molnár (Red Hat) und Rusty Russell (IBM Linux Technology Center), und wurde ab Version 2.5.7 Teil des Linux-Kernels.
Wie ein Mutex ist ein Futex eine Speicherstelle, die von verschiedenen Prozessen durch Sperr- und Entsperroperationen (lock/unlock) atomar verändert wird. Die Sperroperation stellt dabei sicher, dass alle Prozesse blockiert werden, die einen schon gesperrten Futex selbst sperren möchten (gegenseitiger Ausschluss). Im Gegensatz zu Mutexen werden die Futex-Operationen aber in den statistisch relevanten Fällen im User Space (d. h. direkt vom laufenden Programm) ausgeführt und der Kernel nur dann aufgerufen, wenn ein Prozess blockiert oder aktiviert werden muss.
Linux unterstützt Futexe für die meisten, aber nicht für alle Prozessor-Architekturen.
Im Allgemeinen implementiert ein User-Programm die Futex-Operationen nicht direkt, sondern es verwendet die "pthread_mutex..." Funktionen in libc, die automatisch je nach Prozessor-Architektur Futexe oder eine interprozess-Mutex-Implementierung verwenden.
Dadurch, dass nicht bei jedem Aufruf das Betriebssystem involviert ist, sind Futexe im Allgemeinen effizienter. Da das Betriebssystem aber nicht mehr die Kontrolle über alle Locks hat, kam es in der Anfangsphase teilweise zu Problemen, wenn Prozesse mit gesperrtem Futex abgestürzt sind. Diese Probleme wurden durch robuste Futexe behoben, die Verwendung von Futexen verlangt aber trotzdem erhöhte Aufmerksamkeit.