Provided by: manpages-es_4.21.0-2_all bug

NOMBRE

       futex - bloqueos rápidos en espacio de usuario

SINOPSIS

       #include <linux/futex.h>

DESCRIPCIÓN

       El  núcleo  de  Linux  proporciona  futexes  ('Fast Userspace muTexes') como un componente básico para la
       construcción de bloqueos y semáforos rápidos en espacio de usuario. Los  futexes  son  un  mecanismo  muy
       básico  y  se  prestan  bien  para  construir  abstracciones  de  más  alto  nivel como mutexes, variable
       condicionales, bloqueos de lectura/escritura, barreras y semáforos.

       La mayoría de los programadores no  emplean  directamente  futexes  pero  sí  los  emplean  a  través  de
       bibliotecas  del  sistema  basadas  en  ellos  tales como la Native POSIX Thread Library (NPTL). Consulte
       pthreads(7).

       Un futex se identifica mediante un trozo de memoria que puede ser compartido entre procesos e  hilos.  En
       estos  procesos, el futex no necesita tener direcciones idénticas. En su forma más básica, un futex tiene
       la semántica de un semáforo; es un contador que se puede incrementar y  reducir  de  forma  atómica;  los
       procesos pueden esperar a que el valor se vuelva positivo.

       Si  no  se origina ninguna contienda, la operación futex se realiza enteramente en espacio de usuario. Al
       núcleo sólo se le implica para arbitrar en caso de contienda. Al igual que en otros diseños sensatos, los
       futexes se han optimizado para evitar dichas contiendas en la medida de lo posible.

       En su forma más básica, un futex es un entero  alineado  que  sólo  se  modifica  mediante  instrucciones
       atómicas  en  ensamblador.  Dicho entero tiene una longitud de cuatro bytes en todas las plataformas. Los
       procesos pueden compartir este entero a través de mmap(2), mediante segmentos  compartidos  o  usando  el
       mismo espacio de memoria (en este último caso se dice comúnmente que la aplicación es multihilo).

   Semantica
       Cualquier operación futex se inicia en el espacio de usuario, pero puede ser necesario comunicarse con el
       núcleo usando la llamada al sistema futex(2).

       Para "subir" un futex, ejecute las instrucciones en ensamblador adecuadas que harán que la CPU incremente
       atómicamente  el  entero.  A  continuación,  compruebe si realmente ha cambiado de 0 a 1, en cuyo caso no
       había procesos esperando y la operación ha terminado rápidamente y sin contienda.  Éste  debería  ser  el
       caso más común.

       En  caso  de contienda, el incremento atómico cambió el contador desde -1 (o algún otro número negativo).
       Si se detecta, había procesos esperando. Ahora, desde el espacio de usuario, se  debe  asignar  un  1  al
       contador  y  ordenar  al núcleo que despierte a cualquier proceso que se encuentre esperando, usando para
       ello la operación FUTEX_WAKE.

       Esperar en un futex, para "bajarlo", es la  operación  contraria.  Reduzca  atómicamente  el  contador  y
       compruebe  si  ha  cambiado  a 0, en cuyo caso no hay contienda y la operación ha terminado. En cualquier
       otra circunstancia, el proceso debe asignar un -1 al contador y solicitar que el núcleo espere a que otro
       proceso suba el futex. Esto se hace usando la operación FUTEX_WAIT.

       A la llamada al sistema futex(2) se le puede pasar opcionalmente  un  plazo  de  tiempo  que  especifique
       cuánto  tiempo  debe esperar el núcleo a que el futex sea incrementado. En este caso, la semántica es más
       compleja y se remite al programador a futex(2) para obtener más  detalles.  Lo  mismo  se  aplica  a  las
       esperas asíncronas en futex.

VERSIONES

       El  soporte inicial para futex se añadió a la versión 2.5.7 de Linux pero con una semántica distinta a la
       descrita más arriba. La semántica actual se encuentra disponible desde la versión 2.5.40 de Linux.

NOTAS

       Los futexes, en su forma más básica, no están pensados como abstracción simple para los usuarios finales.
       Es de esperar que los implementadores sean buenos conocedores de ensamblador y que hayan leído el  código
       fuente de la biblioteca de futex en espacio de usuario que se indica acontinuación.

       Esta página de manual ilustra el uso más común de las primitivas futex(2), aunque están disponible muchas
       más fuentes de información.

VÉASE TAMBIÉN

       clone(2), futex(2), get_robust_list(2), set_robust_list(2), set_tid_address(2), pthreads(7)

       Fuss,  Futexes  and  Furwocks:  Fast  Userlevel Locking in Linux (actas del Ottawa Linux Symposium 2002),
       biblioteca de ejemplo de futex, futex-*.tar.bz2 ftp://ftp.kernel.org/pub/linux/kernel/people/rusty/.

TRADUCCIÓN

       La traducción al español de esta página del manual fue creada por Juan  Piernas  <piernas@ditec.um.es>  y
       Marcos Fouces <marcos@debian.org>

       Esta  traducción  es  documentación  libre;  lea  la GNU General Public License Version 3 o posterior con
       respecto a las condiciones de copyright.  No existe NINGUNA RESPONSABILIDAD.

       Si encuentra algún error en la traducción de esta página  del  manual,  envíe  un  correo  electrónico  a
       debian-l10n-spanish@lists.debian.org.

Páginas de manual de Linux 6.03                  30 Octubre 2022                                        futex(7)