Futex ( en inglés futex , abreviatura de English fast userspace mutex ) es una primitiva de sincronización ligera de bajo nivel [1] , sobre la base de la cual se implementan otras primitivas y mecanismos, como mutexes , semáforos y variables de condición [2] . Además, los futexes pueden participar en la organización de mecanismos de sincronización más complejos, como barreras y bloqueos de lectura y escritura , lo que le permite activar simultáneamente un grupo de tareas. Se introdujo originalmente en las primeras versiones del kernel de Linux 2.5 [1] . Más tarde, se implementó una primitiva casi idéntica en el núcleo.Ventanas [3] .
Apareció por primera vez en la versión 2.5.7 del kernel de Linux, la estabilización semántica terminó en la versión 2.5.40 .
Desarrollado por Hubertus Franke (en el Centro de Investigación Thomas Watson de IBM ), Matthew Kirkwood y Rusty Russell en el Centro de Tecnología Linux de IBM, y el desarrollador de Red Hat , Ingo Molnar.
Un futex es un entero alineado en la memoria compartida (para múltiples procesadores) en el espacio del usuario y una cola de espera en el espacio del núcleo [4] . Para organizar un futex, se requiere al menos una página de memoria , mapeada al espacio de direcciones de cada uno de los procesos que participan en el futex. Las llamadas al sistema están destinadas solo a bibliotecas de transmisión de espacio de usuario y solo en forma de instrucciones en lenguaje ensamblador [5] .
Un entero compartido puede incrementarse o decrementarse mediante una instrucción del ensamblador . Los procesos vinculados a este futex esperan a que este valor se vuelva positivo. Todas las operaciones con futexes se llevan a cabo casi por completo en el espacio del usuario (en ausencia de competencia [6] ), las funciones del kernel correspondientes se usan solo en un conjunto limitado de casos controvertidos. Esto permite aumentar la eficiencia del uso de primitivas de sincronización , ya que la mayoría de las operaciones no usan arbitraje y, por lo tanto, evitan el uso de llamadas al sistema relativamente costosas ( llamadas al sistema en inglés ).
Los objetos CRITICAL_SECTION en la API de Win32 están optimizados de manera similar , al igual que FAST_MUTEX en el kernel de Windows [7] .