# Futex

En informàtica, un futex (abreviatura de "fast userspace mutex") és una crida al sistema del nucli que els programadors poden utilitzar per implementar el bloqueig bàsic, o com a bloc de construcció per a abstraccions de bloqueig de nivell superior com ara semàfors i mutex POSIX o variables de condició.
Un futex consisteix en una cua d'espera a l'espai del nucli que s'adjunta a un nombre enter atòmic a l'espai d'usuari. Múltiples processos o fils operen sobre l'enter completament a l'espai d'usuari (utilitzant operacions atòmiques per evitar interferir els uns amb els altres) i només recorren a un ús relativament car. crides al sistema per sol·licitar operacions a la cua d'espera (per exemple, per activar processos en espera o per posar el procés actual a la cua d'espera). Un bloqueig basat en futex programat correctament no utilitzarà trucades del sistema excepte quan el bloqueig tingui contenció; com que la majoria de les operacions no requereixen arbitratge entre processos, això no passarà en la majoria dels casos.

## Història

Hubertus Franke (IBM Thomas J. Watson Research Center), Matthew Kirkwood, Ingo Molnár (Red Hat) i Rusty Russell (IBM Linux Technology Center) van originar el mecanisme futex a Linux l'any 2002. El mateix any, es van discutir sobre una proposta per fer accessibles futexes mitjançant el sistema de fitxers mitjançant la creació d'un node especial a /dev o /proc. Tanmateix, Linus Torvalds es va oposar fermament a aquesta idea i va rebutjar qualsevol pegat relacionat.
Futexes va aparèixer per primera vegada a la versió 2.5.7 de la sèrie de desenvolupament del nucli de Linux; la semàntica es va estabilitzar a partir de la versió 2.5.40, i els futexes han format part de la línia principal del nucli Linux des del llançament de desembre de 2003 de la sèrie de nuclis estables 2.6.x.
La funcionalitat Futex s'ha implementat a Microsoft Windows des de Windows 8 o Windows Server 2012 amb el nom WaitOnAddress.
El 2013, Microsoft va patentar WaitOnAddress relacionat amb futex i la patent es va concedir el 2014.
El maig de 2014, el sistema CVE va anunciar una vulnerabilitat descoberta al subsistema futex del nucli Linux que permetia atacs de denegació de servei o escalada de privilegis locals.
El maig de 2015, el nucli de Linux va introduir un error de bloqueig mitjançant Commit b0c29f79ecea que va provocar un bloqueig a les aplicacions dels usuaris. L'error va afectar moltes distribucions empresarials de Linux, inclosos els nuclis 3.x i 4.x, i Red Hat Enterprise Linux versió 5, 6 i 7, SUSE Linux 12 i Amazon Linux.
Futexes s'han implementat a OpenBSD des del 2016.
El mecanisme futex és un dels conceptes bàsics del nucli Zircon al sistema operatiu Fuchsia de Google des d'almenys l'abril de 2018.
Apple va implementar futex a iOS/iPadOS/tvOS 17.4, macOS 14.4, watchOS 10.4 i visionOS 1.1.

## Operacions

Futex tenen dues operacions bàsiques, WAIT i WAKE
WAIT(addr, val)
Si el valor emmagatzemat a l'adreça addr és val, posa el fil actual a dormir.
WAKE(addr, num)
WAKE num nombre de fils esperant a l'adreçaaddr.

## Referències

* ↑ «Landing a new syscall: What is futex?» (en anglès). [Consulta: 28 novembre 2024].
* ↑ Torvalds, Linus. «Futex Asynchronous Interface» (en anglès).
* ↑ «WaitOnAddress function» (en anglès). [Consulta: 1r novembre 2019].
* ↑ «Comparing WaitOnAddress with futexes» (en anglès). [Consulta: 9 maig 2024].
* ↑ «US8782674B2 Wait on address synchronization interface» (en anglès). [Consulta: 1r novembre 2019].
* ↑ «[SECURITY] [DSA 2949-1] linux security update» (en anglès). Lists.debian.org, 05-06-2014. [Consulta: 8 juny 2014].
* ↑ «Linux futex_wait bug...», 13-05-2015. [Consulta: 24 març 2018].
* ↑ Mazurek, Michal. «'Futexes for OpenBSD' - MARC» (en anglès). marc.info. [Consulta: 30 abril 2017].
* ↑ «Zircon Kernel Concepts» (en anglès). fuchsia.dev. [Consulta: 20 octubre 2019].
* ↑ «zx_futex_wait» (en anglès). fuchsia.dev. [Consulta: 20 octubre 2019].
* ↑ «os_sync_wait_on_address» (en anglès americà). Apple Developer Documentation. [Consulta: 14 març 2024].