Provided by: manpages-es_4.18.1-1_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
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  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⟩.