stringtranslate.com

Futex

En informática , un futex (abreviatura de " mutex rápido de espacio de usuario ") es una llamada al sistema del núcleo que los programadores pueden usar para implementar un bloqueo básico o como un bloque de construcción para abstracciones de bloqueo de nivel superior, como semáforos y mutexes POSIX o variables de condición .

Un futex consiste en una cola de espera en el espacio del núcleo que está adjunta a un 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 [ cita requerida ] 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 programado correctamente no usará 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 ( IBM Thomas J. Watson Research Center ), Matthew Kirkwood, Ingo Molnár ( Red Hat ) y Rusty Russell ( IBM Linux Technology Center ) crearon el mecanismo futex en Linux en 2002. [1] Ese mismo año, se debatió una propuesta para hacer que los futexes fueran accesibles 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. [2]

Los futexes aparecieron 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 bajo el nombre WaitOnAddress . [3]

En 2013, Microsoft patentó WaitOnAddress relacionado con futex [4] y la patente se concedió en 2014. [5]

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. [6] [7]

En mayo de 2015, el núcleo de Linux introdujo un error de bloqueo a través de la confirmación b0c29f79ecea que provocó un bloqueo en las aplicaciones de los usuarios. El error afectó a muchas distribuciones empresariales de Linux, incluidos los núcleos 3.x y 4.x, y las versiones 5, 6 y 7 de Red Hat Enterprise Linux, SUSE Linux 12 y Amazon Linux. [8]

Los futexes se han implementado en OpenBSD desde 2016. [9]

El mecanismo futex es uno de los conceptos centrales del núcleo Zircon [10] en el sistema operativo Fuchsia de Google desde al menos abril de 2018. [11]

Apple implementó futex en iOS/iPadOS/tvOS 17.4, macOS 14.4, watchOS 10.4 y visionOS 1.1. [12]

Operaciones

Los futexes tienen dos operaciones básicas WAITy WAKE.

Si el valor almacenado en la dirección addres val, pone el hilo actual a dormir.
Despierta numel número de subprocesos que esperan en la dirección addr.

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

Si el valor almacenado en la dirección old_addres val, se activan num_wakelos subprocesos que esperan en la dirección old_addry se ponen en cola num_movelos subprocesos que esperan en la dirección old_addrpara que ahora esperen en la dirección new_addr. Esto se puede utilizar para evitar el problema de la manada atronadora al activarse. [14] [15]
Leerá addr2, ejecutará opcon op_argen él y almacenará el resultado nuevamente en addr2. Luego, reactivará num1los subprocesos que esperan en addr1, y, si el valor leído previamente de addr2coincide cmp_argcon el de comparación cmp, reactivará num2los subprocesos que esperan en addr2. Este mecanismo de reactivación muy flexible y genérico es útil para implementar muchas primitivas de sincronización.

Véase también

Referencias

  1. ^ "Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux" (Fuss, Futexes y Furwocks: bloqueo rápido a nivel de usuario en Linux) de Franke, Russell y Kirkwood. Publicado en 2002 para el Simposio sobre Linux de Ottawa.
  2. ^ Torvalds, Linus. "Interfaz asincrónica Futex".
  3. ^ "Función WaitOnAddress" . Consultado el 1 de noviembre de 2019 .
  4. ^ "Comparación de WaitOnAddress con futexes" . Consultado el 9 de mayo de 2024 .
  5. ^ "US8782674B2 Esperar en la interfaz de sincronización de direcciones" . Consultado el 1 de noviembre de 2019 .
  6. ^ CVE-2014-3153
  7. ^ "[SEGURIDAD] [DSA 2949-1] actualización de seguridad de Linux". Lists.debian.org. 2014-06-05 . Consultado el 2014-06-08 .
  8. ^ "Error de futex_wait() en Linux..." 2015-05-13 . Consultado el 2018-03-24 .
  9. ^ Mazurek, Michal. «'Futexes para OpenBSD' - MARC». marc.info . Consultado el 30 de abril de 2017 .
  10. ^ "Conceptos del núcleo Zircon". fuchsia.dev . Consultado el 20 de octubre de 2019 .
  11. ^ "zx_futex_wait". fuchsia.dev . Consultado el 20 de octubre de 2019 .
  12. ^ "os_sync_wait_on_address". Documentación para desarrolladores de Apple . Consultado el 14 de marzo de 2024 .
  13. ^ Los Futex son complicados Ulrich Drepper (Red Hat, v1.6, 2011)
  14. ^ Página del manual futex(2) de Linux, sección FUTEX_CMP_REQUEUE
  15. ^ Documentación de Zircon zx_futex_requeue

Enlaces externos