Futex
Ein Futex ({{#invoke:Vorlage:lang|full|CODE=en|SCRIPTING=Latn|SERVICE=englisch}} 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.<ref>Hubertus Franke, Rusty Russell, Matthew Kirkwood, <templatestyles src="Webarchiv/styles.css" />{{#if:20060922034808
| {{#ifeq: 20060922034808 | *
| {{#if: Fuss, futexes and furwocks: Fast Userlevel Locking in Linux | {{#invoke:WLink|getEscapedTitle|Fuss, futexes and furwocks: Fast Userlevel Locking in Linux}} | {{#invoke:Webarchiv|getdomain|http://www.linux.org.uk/~ajh/ols2002_proceedings.pdf.gz}} }} (Archivversionen)
| {{#iferror: {{#time: j. F Y|20060922034808}}
| {{#if: || }}Der Wert des Parameters {{#if: wayback | wayback | Datum }} muss ein gültiger Zeitstempel der Form YYYYMMDDHHMMSS sein!
| {{#if: Fuss, futexes and furwocks: Fast Userlevel Locking in Linux | {{#invoke:WLink|getEscapedTitle|Fuss, futexes and furwocks: Fast Userlevel Locking in Linux}} | {{#invoke:Webarchiv|getdomain|http://www.linux.org.uk/~ajh/ols2002_proceedings.pdf.gz}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer }} vom {{#time: j. F Y|20060922034808}} im Internet Archive{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
}}
}}
| {{#if:
| {{#iferror: {{#time: j. F Y|{{{webciteID}}}}}
| {{#switch: {{#invoke:Str|len|{{{webciteID}}}}}
| 16= {{#if: Fuss, futexes and furwocks: Fast Userlevel Locking in Linux | {{#invoke:WLink|getEscapedTitle|Fuss, futexes and furwocks: Fast Userlevel Locking in Linux}} | {{#invoke:Webarchiv|getdomain|http://www.linux.org.uk/~ajh/ols2002_proceedings.pdf.gz}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer }} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{{webciteID}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
| 9 = {{#if: Fuss, futexes and furwocks: Fast Userlevel Locking in Linux | {{#invoke:WLink|getEscapedTitle|Fuss, futexes and furwocks: Fast Userlevel Locking in Linux}} | {{#invoke:Webarchiv|getdomain|http://www.linux.org.uk/~ajh/ols2002_proceedings.pdf.gz}} }} {{#ifeq: | [] | [ | ( }}{{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer}} vom {{#time: j. F Y| 19700101000000 + {{#expr: floor {{#expr: {{#invoke:Str|sub|{{#invoke:Expr|base62|{{{webciteID}}}}}|1|10}}/86400}} }} days}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
| #default= Der Wert des Parameters {{#if: webciteID | webciteID | ID }} muss entweder ein Zeitstempel der Form YYYYMMDDHHMMSS oder ein Schüsselwert mit 9 Zeichen oder eine 16-stellige Zahl sein!{{#if: || }}
}}
| c|{{{webciteID}}}}} {{#if: Fuss, futexes and furwocks: Fast Userlevel Locking in Linux | {{#invoke:WLink|getEscapedTitle|Fuss, futexes and furwocks: Fast Userlevel Locking in Linux}} | {{#invoke:Webarchiv|getdomain|http://www.linux.org.uk/~ajh/ols2002_proceedings.pdf.gz}} }} ({{#if: {{#if: | {{{archiv-bot}}} | }} | des Vorlage:Referrer}} vom {{#time: j. F Y|{{{webciteID}}}}} auf WebCite{{#if: | ; }}{{#ifeq: | [] | ] | ) }}
}}
| {{#if:
| Vorlage:Webarchiv/Today
| {{#if:
| Vorlage:Webarchiv/Generisch
| {{#if: Fuss, futexes and furwocks: Fast Userlevel Locking in Linux | {{#invoke:WLink|getEscapedTitle|Fuss, futexes and furwocks: Fast Userlevel Locking in Linux}} | {{#invoke:Webarchiv|getdomain|http://www.linux.org.uk/~ajh/ols2002_proceedings.pdf.gz}} }}
}}}}}}}}{{#if:
| Vorlage:Webarchiv/archiv-bot
}}{{#invoke:TemplatePar|check
|all = url=
|opt = text= wayback= webciteID= archive-is= archive-today= archiv-url= archiv-datum= ()= archiv-bot= format= original=
|cat = Wikipedia:Vorlagenfehler/Vorlage:Webarchiv
|errNS = 0
|template = Vorlage:Webarchiv
|format = *
|preview = 1
}}{{#ifexpr: {{#if:20060922034808|1|0}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}}{{#if:|+1}} <> 1
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Genau einer der Parameter 'wayback', 'webciteID', 'archive-today', 'archive-is' oder 'archiv-url' muss angegeben werden.|1}}
}}{{#if:
| {{#switch: {{#invoke:Webarchiv|getdomain|{{{archiv-url}}}}}
| web.archive.org =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von Internet Archive erkannt, bitte Parameter 'wayback' benutzen.|1}}
| webcitation.org =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von WebCite erkannt, bitte Parameter 'webciteID' benutzen.|1}}
| archive.today |archive.is |archive.ph |archive.fo |archive.li |archive.md |archive.vn =
{{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Im Parameter 'archiv-url' wurde URL von archive.today erkannt, bitte Parameter 'archive-today' benutzen.|1}}
}}{{#if:
| {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Wert des Parameter 'archiv-datum' ist ungültig oder hat ein ungültiges Format.|1}}
| }}
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Pflichtparameter 'archiv-datum' wurde nicht angegeben.|1}}
}}
| {{#if:
| {{#if: || }}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Der Parameter 'archiv-datum' ist nur in Verbindung mit 'archiv-url' angebbar.|1}}
}}
}}{{#if:{{#invoke:URLutil|isHostPathResource|http://www.linux.org.uk/~ajh/ols2002_proceedings.pdf.gz}}
|| {{#if: || }}
}}{{#if: Fuss, futexes and furwocks: Fast Userlevel Locking in Linux
| {{#if: {{#invoke:WLink|isBracketedLink|Fuss, futexes and furwocks: Fast Userlevel Locking in Linux}}
| {{#if: || }}
}}
| {{#if: || }}
}}{{#switch:
|addlarchives|addlpages= {{#if: || }}{{#if: 1 |}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: enWP-Wert im Parameter 'format'.|1}}
}}{{#ifeq: {{#invoke:Str|find|http://www.linux.org.uk/~ajh/ols2002_proceedings.pdf.gz%7Carchiv}} |-1
|| {{#ifeq: {{#invoke:Str|find|{{#invoke:Str|cropleft|http://www.linux.org.uk/~ajh/ols2002_proceedings.pdf.gz%7C4}}%7Chttp}} |-1
|| {{#switch: {{#invoke:Webarchiv|getdomain|http://www.linux.org.uk/~ajh/ols2002_proceedings.pdf.gz }}
| abendblatt.de | daserste.ndr.de | inarchive.com | webcitation.org =
| #default = {{#if: || }}{{#if: 1 |}}{{#invoke:TemplUtl|failure| Fehler bei Vorlage:Webarchiv: Archiv-URL im Parameter 'url' anstatt URL der Originalquelle. Entferne den vor der Original-URL stehenden Mementobestandteil und setze den Archivierungszeitstempel in den Parameter 'wayback', 'webciteID', 'archive.today' oder 'archive-is' ein, sofern nicht bereits befüllt.|1}}
}}
}}
}}, Ottawa Linux Symposium, 2002.</ref>
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.<ref>Ingo Molnár, Robust futexes, Linux Kernel Documentation.</ref> Diese Probleme wurden durch robuste Futexe behoben, die Verwendung von Futexen verlangt aber trotzdem erhöhte Aufmerksamkeit.<ref>Ulrich Drepper, Futexes Are Tricky, Red Hat, 2008 (PDF, 190 kB).</ref>
Einzelnachweise
<references />