Futex ( engelska futex , förkortning för engelska fast userspace mutex ) är en lågnivålättviktssynkroniseringsprimitiv [1] , på basis av vilken andra primitiver och mekanismer implementeras, såsom mutexer , semaforer och tillståndsvariabler [2] . Futexes kan också delta i organiseringen av mer komplexa synkroniseringsmekanismer, såsom barriärer och läs- och skrivlås , så att du samtidigt kan väcka en grupp uppgifter. Den introducerades ursprungligen i tidiga versioner av Linux 2.5 -kärnan [1] . Senare implementerades en nästan identisk primitiv i Windows -kärnan [3] .
Dök upp först i Linux-kärnan version 2.5.7, semantisk stabilisering slutade i version 2.5.40 .
Utvecklad av Hubertus Franke (vid IBM :s Thomas Watson Research Center), Matthew Kirkwood och Rusty Russell vid IBM Linux Technology Center och Red Hat- utvecklaren Ingo Molnar.
En futex är ett justerat heltal i delat minne (för flera processorer) i användarutrymmet och en väntekö i kärnutrymmet [4] . För att organisera en futex krävs minst en sida minne , mappad till adressutrymmet för var och en av processerna som deltar i futexen. Systemanrop är endast avsedda för streamingbibliotek i användarutrymmet och endast i form av instruktioner för assemblerspråk [5] .
Ett delat heltal kan ökas eller minskas med en i en assemblerinstruktion . Processer kopplade till denna futex väntar på att detta värde blir positivt. Alla operationer med futexes utförs nästan helt i användarutrymmet (i avsaknad av konkurrens [6] ), motsvarande kärnfunktioner används endast i en begränsad uppsättning kontroversiella fall. Detta gör det möjligt att öka effektiviteten av att använda synkroniseringsprimitiver , eftersom de flesta operationer inte använder arbitration, och därför undviker användningen av relativt dyra systemanrop ( engelska system calls ).
CRITICAL_SECTION-objekt i Win32 API är på liknande sätt optimerade , liksom FAST_MUTEX i Windows -kärnan [7] .