Provided by: manpages-es_1.55-10_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 POSIX.

       Esta página no pretende documentar todas las decisiones de diseño sino  que  se  limita  a
       cuestiones  relevantes  para  el  desarrollo  de  aplicaciones y bibliotecas. De hecho, la
       mayoría de los programadores no usarán futexes  directamente  sino  que  en  su  lugar  se
       apoyarán  en  bibliotecas del sistema construídas sobre ellos, como la implementación NPTL
       de pthreads.

       Un futex se identifica mediante un  trozo  de  memoria  que  puede  ser  compartido  entre
       diferentes  procesos. 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.

       En el caso en el que no se produzca contienda, la operación futex se  realiza  enteramente
       en espacio de usuario. Al núcleo sólo se le implica para arbitrar el caso de contienda. Al
       igual que en otros diseños  sensatos,  los  futexes  se  han  optimizado  para  evitar  la
       contención 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. Los procesos pueden compartir este entero a  través
       de  mmap,  mediante  segmentos  compartidos  o usando el mismo espacio de memoria (en este
       último caso se dice comúnmente que la aplicación es multihilo).

SEMÁNTICA

       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. Este es el
       caso sin contienda, que es rápido y debe ser el más común.

       En el 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.

OBSERVACIONES

       Insistimos, los futexes, en su forma  más  básica,  no  están  pensados  como  abstracción
       sencilla  para  los  usuarios  finales.  Es de esperar que los implementadores sean buenos
       conocedores de ensamblador y que hayan leído los fuentes de  la  biblioteca  de  futex  en
       espacio de usuario que se indica más abajo.

       Esta página de manual ilustra el uso más común de las primitivas futex(2), aunque no es el
       único ni mucho menos.

AUTORES

       Los futexes fueron diseñados e implementados por Hubertus Franke  (IBM  Thomas  J.  Watson
       Research  Center),  Matthew  Kirkwood,  Ingo  Molnar  (Red Hat) y Rusty Russell (IBM Linux
       Technology Center). Esta página fue escrita por Bert Hubert.

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.

VÉASE TAMBIÉN

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

                                        31 diciembre 2002                                FUTEX(4)