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 /devo /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 WAITy WAKE.

  • WAIT(addr, val)
Si el valor almacenado en la dirección addres val, pone el hilo actual en suspensión.
  • WAKE(addr, num)
Despierta el numnúmero de subprocesos que esperan la dirección addr.

Para usos más avanzados, hay una serie de otras operaciones, siendo las más utilizadas REQUEUEy WAKE_OP, que funcionan como WAKEoperaciones más genéricas .

  • CMP_REQUEUE(old_addr, new_addr, num_wake, num_move, val)
Si el valor almacenado en la dirección old_addres val, despierta los num_wakesubprocesos que esperan en la dirección old_addry pone en cola los num_movesubprocesos que esperan en la dirección old_addrpara ahora esperar en la dirección new_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á opcon op_argél y guardará el resultado en addr2. Luego, activará los num1subprocesos en espera addr1, y si el valor leído anteriormente de las addr2coincidencias cmp_argmediante la comparación, cmpactivará los num2subprocesos en espera addr2. 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