Futex - Futex
En informática , un futex (abreviatura de " mutex de espacio de usuario rápido ") es una llamada al sistema del núcleo que los programadores pueden utilizar para implementar el bloqueo básico , o como un bloque de construcción para abstracciones de bloqueo de nivel superior como semáforos y mutex de POSIX o variables de condición .
Un futex consiste en una cola de espera del espacio del núcleo que se adjunta a un número entero atómico en el espacio de usuario . Múltiples procesos o subprocesos operan en el entero 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 poner el proceso actual en la cola de espera). Un candado basado en futex programado correctamente no utilizará llamadas al sistema excepto cuando el candado esté controlado; dado que la mayoría de las operaciones no requieren arbitraje entre procesos, esto no sucederá en la mayoría de los casos.
Historia
En Linux , Hubertus Franke ( IBM Thomas J. Watson Research Center ), Matthew Kirkwood, Ingo Molnár ( Red Hat ) y Rusty Russell ( IBM Linux Technology Center ) originaron el mecanismo futex. 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 de diciembre de 2003 de la serie de kernel estable 2.6.x.
En 2002 se discutió una propuesta para hacer accesibles los futex 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.
Los futexes se han implementado en Microsoft Windows desde Windows 8 o Windows Server 2012 con el nombre WaitOnAddress.
En 2013, Microsoft patentó futexes y la patente se otorgó 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 de Commit b0c29f79ecea que provocó un bloqueo en las aplicaciones de usuario. El error afectó a muchas distribuciones empresariales de Linux, incluidos los kernels 3.xy 4.x, y las versiones 5, 6 y 7 de Red Hat Enterprise Linux, SUSE Linux 12 y Amazon Linux.
Los Futexes se han implementado en OpenBSD desde 2016.
El mecanismo futex es uno de los conceptos centrales del núcleo circón en Google 's sistema operativo fucsia desde por lo menos, abril de 2018.
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 en suspensión.
WAKE(addr, num)
- Despierta el
num
número de subprocesos que esperan la direcciónaddr
.
Para usos más avanzados, hay una serie de otras operaciones, siendo las más utilizadas REQUEUE
y WAKE_OP
, que funcionan como WAKE
operaciones más genéricas .
CMP_REQUEUE(old_addr, new_addr, num_wake, num_move, val)
- Si el valor almacenado en la dirección
old_addr
esval
, despierta losnum_wake
subprocesos que esperan en la direcciónold_addr
y pone en cola losnum_move
subprocesos que esperan en la direcciónold_addr
para ahora esperar en la direcciónnew_addr
. Esto se puede utilizar para evitar el estruendoso problema de la manada al despertar.
WAKE_OP(addr1, addr2, num1, num2, op, op_arg, cmp, cmp_arg)
- Leerá
addr2
, actuaráop
conop_arg
él y guardará el resultado enaddr2
. Luego, activará losnum1
subprocesos en esperaaddr1
, y si el valor leído anteriormente de lasaddr2
coincidenciascmp_arg
mediante la comparación,cmp
activará losnum2
subprocesos en esperaaddr2
. Este mecanismo de activación muy flexible y genérico es útil para implementar muchas primitivas de sincronización.
Ver también
Referencias
enlaces externos
- - llamada al sistema futex ()
- - semántica y uso de futex
- Hubertus Franke, Rusty Russell, Matthew Kirkwood. Fuss, futexes and furwocks: Fast Userlevel Locking in Linux , Ottawa Linux Symposium 2002.
- Drepper, Ulrich (2011). "Los futex son complicados" (PDF) . 1.6. Sombrero rojo.
- Bert Hubert (2004). Páginas de manual no oficiales de Futex
- Ingo Molnar. " Robust Futexes ", documentación del kernel de Linux
- " Priority Inheritance Futexes ", documentación del kernel de Linux