Provided by: manpages-es_1.55-10_all bug

NOMBRE

       futex - Bloqueos rapidos en espacio de usuario

SINOPSIS

       #include <linux/futex.h>

DESCRIPCI'ON

       El  nucleo de Linux proporciona futexes ('Fast Userspace muTexes') como
       un componente basico para  la  construccion  de  bloqueos  y  semaforos
       rapidos  en espacio de usuario. Los futexes son un mecanismo muy basico
       y se prestan bien para construir abstracciones de mas alto  nivel  como
       mutexes POSIX.

       Esta  pagina no pretende documentar todas las decisiones de diseno sino
       que  se  limita  a  cuestiones  relevantes  para   el   desarrollo   de
       aplicaciones  y  bibliotecas. De hecho, la mayoria de los programadores
       no usaran futexes directamente sino que en  su  lugar  se  apoyaran  en
       bibliotecas del sistema construidas sobre ellos, como la implementacion
       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 identicas. En su forma mas basica, un  futex
       tiene  la  semantica  de  un  semaforo;  es  un  contador  que se puede
       incrementar y reducir de forma atomica; los procesos pueden  esperar  a
       que el valor se vuelva positivo.

       En  el  caso  en el que no se produzca contienda, la operacion futex se
       realiza enteramente en espacio de usuario. Al nucleo solo se le implica
       para  arbitrar  el  caso  de  contienda.  Al igual que en otros disenos
       sensatos, los futexes se han optimizado para evitar la contencion en la
       medida de lo posible.

       En  su  forma  mas  basica,  un futex es un entero alineado que solo se
       modifica mediante instrucciones atomicas en ensamblador.  Los  procesos
       pueden  compartir  este  entero  a  traves  de mmap, mediante segmentos
       compartidos o usando el mismo espacio de memoria (en este  ultimo  caso
       se dice comunmente que la aplicacion es multihilo).

SEM'ANTICA

       Cualquier  operacion  futex  se  inicia  en el espacio de usuario, pero
       puede ser necesario comunicarse con el  nucleo  usando  la  llamada  al
       sistema futex(2).

       Para  'subir'  un  futex,  ejecute  las  instrucciones  en  ensamblador
       adecuadas que haran que la CPU incremente  atomicamente  el  entero.  A
       continuacion, compruebe si realmente ha cambiado de 0 a 1, en cuyo caso
       no habia procesos esperando y la operacion ha  terminado.  Este  es  el
       caso sin contienda, que es rapido y debe ser el mas comun.

       En el caso de contienda, el incremento atomico cambio el contador desde
       -1 (o algun otro  numero  negativo).  Si  se  detecta,  habia  procesos
       esperando.  Ahora, desde el espacio de usuario, se debe asignar un 1 al
       contador y ordenar al nucleo que despierte a cualquier proceso  que  se
       encuentre esperando, usando para ello la operacion FUTEX_WAKE.

       Esperar  en  un  futex,  para  'bajarlo',  es  la  operacion contraria.
       Reduzca atomicamente el contador y compruebe si ha  cambiado  a  0,  en
       cuyo  caso  no  hay contienda y la operacion ha terminado. En cualquier
       otra circunstancia, el  proceso  debe  asignar  un  -1  al  contador  y
       solicitar  que el nucleo espere a que otro proceso suba el futex.  Esto
       se hace usando la operacion FUTEX_WAIT.

       A la llamada al sistema futex(2) se le  puede  pasar  opcionalmente  un
       plazo  de tiempo que especifique cuanto tiempo debe esperar el nucleo a
       que el futex sea incrementado.  En  este  caso,  la  semantica  es  mas
       compleja  y  se  remite  al  programador  a  futex(2)  para obtener mas
       detalles. Lo mismo se aplica a las esperas asincronas en futex.

OBSERVACIONES

       Insistimos, los futexes, en su forma mas basica, no estan pensados como
       abstraccion  sencilla  para los usuarios finales. Es de esperar que los
       implementadores sean buenos conocedores  de  ensamblador  y  que  hayan
       leido  los  fuentes de la biblioteca de futex en espacio de usuario que
       se indica mas abajo.

       Esta pagina de manual ilustra  el  uso  mas  comun  de  las  primitivas
       futex(2), aunque no es el unico ni mucho menos.

AUTORES

       Los  futexes  fueron disenados 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 pagina fue
       escrita por Bert Hubert.

VERSIONES

       El soporte inicial para futex se anadio a la  version  2.5.7  de  Linux
       pero  con una semantica distinta a la descrita mas arriba. La semantica
       actual se encuentra disponible desde la version 2.5.40 de Linux.

V'EASE TAMBI'EN

       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)