Futex
En informática, un futex (abreviatura de "fast userspace mutex") es una llamada al sistema del núcleo que los programadores pueden utilizar para implementar un bloqueo básico o como bloque de construcción para sistemas superiores. abstracciones de bloqueo de nivel como semáforos y mutex POSIX o variables de condición.
Un futex consta de una cola de espera en el espacio del kernel que está adjunta a un entero atómico en el espacio de usuario. Múltiples procesos o subprocesos operan en números enteros completamente en el espacio de usuario (usando operaciones atómicas para evitar interferir entre sí) y solo recurren a llamadas al sistema relativamente costosas para solicitar operaciones en la cola de espera (por ejemplo, para despertar procesos en espera o para poner el proceso actual en la cola de espera). Un bloqueo basado en futex correctamente programado no utilizará llamadas al sistema excepto cuando el bloqueo tenga contención; Dado que la mayoría de las operaciones no requieren arbitraje entre procesos, esto no sucederá en la mayoría de los casos.
Historia
Hubertus Franke (Centro de Investigación IBM Thomas J. Watson), Matthew Kirkwood, Ingo Molnár (Red Hat) y Rusty Russell (Centro de Tecnología IBM Linux) originaron el mecanismo futex en Linux en 2002.
Ese mismo año, se debatió una propuesta para hacer accesibles los futexes a través del sistema de archivos mediante la creación de un nodo especial en /dev
o /proc
. Sin embargo, Linus Torvalds se opuso firmemente a esta idea y rechazó cualquier parche relacionado.
Futexes apareció por primera vez en la versión 2.5.7 de la serie de desarrollo del kernel de Linux; la semántica se estabilizó a partir de la versión 2.5.40, y los futexes han sido parte de la línea principal del kernel de Linux desde el lanzamiento en diciembre de 2003 de la serie de kernel estable 2.6.x.
La funcionalidad Futex se ha implementado en Microsoft Windows desde Windows 8 o Windows Server 2012 con el nombre WaitOnAddress.
En 2013, Microsoft patentó WaitOnAddress relacionado con futex y la patente se concedió en 2014.
En mayo de 2014, el sistema CVE anunció una vulnerabilidad descubierta en el subsistema futex del kernel de Linux que permitía ataques de denegación de servicio o escalada de privilegios locales.
En mayo de 2015, el kernel de Linux introdujo un error de interbloqueo a través del Commit b0c29f79ecea que provocó un bloqueo en las aplicaciones de los usuarios. El error afectó a muchas distribuciones empresariales de Linux, incluidos los kernels 3.x y 4.x, y Red Hat Enterprise Linux versión 5, 6 y 7, SUSE Linux 12 y Amazon Linux.
Futexes se ha implementado en OpenBSD desde 2016.
El mecanismo futex es uno de los conceptos centrales del kernel Zircon en el sistema operativo Fuchsia de Google desde al menos abril de 2018.
Apple implementó futex en iOS/iPadOS/tvOS 17.4, macOS 14.4, watchOS 10.4 y visionOS 1.1.
Operaciones
Los Futex tienen dos operaciones básicas, WAIT
y WAKE
.
WAIT(addr, val)
- Si el valor almacenado en la dirección
addr
esval
, pone el hilo actual a dormir.
WAKE(addr, num)
- Despierta.
num
número de hilos esperando en la direcciónaddr
.
Para usos más avanzados, existen otras operaciones, siendo las más utilizadas CMP_REQUEUE
y WAKE_OP
, que funcionan como un WAKE operaciones.
CMP_REQUEUE(old_addr, new_addr, num_wake, num_move, val)
- Si el valor almacenado en la dirección
old_addr
esval
, velasnum_wake
hilos esperando en la direcciónold_addr
, y encuuesnum_move
hilos esperando en la direcciónold_addr
para ahora esperar en la direcciónnew_addr
. Esto se puede utilizar para evitar el problema de rebaño al despertar.
WAKE_OP(addr1, addr2, num1, num2, op, op_arg, cmp, cmp_arg)
- Will read
addr2
, actuarop
conop_arg
y guardar el resultado de nuevoaddr2
. Entonces se despertaránum1
hilos esperandoaddr1
, y, si el valor de lectura anterioraddr2
coincidenciascmp_arg
usando comparacióncmp
, se despertaránum2
hilos esperandoaddr2
. Este mecanismo de vela muy flexible y genérico es útil para implementar muchos primitivos de sincronización.
Contenido relacionado
Spl (Unix)
Encuadernación tardía
Tabla de métodos virtuales
ALGOL Y
Alma-0