bionic (2) futex.2.gz

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

NOMBRE

       futex - llamada al sistema para bloqueos rápidos en espacio de usuario

SINOPSIS

       #include <linux/futex.h>

       #include <sys/time.h>

       int sys_futex (void *futex, int op, int val, const struct timespec *timeout);

DESCRIPCIÓN

       La  llamada al sistema sys_futex proporciona un método que permite a un programa esperar hasta que cambie
       el valor de una dirección dada y un método para despertar a cualquier proceso que esté esperando  en  una
       dirección  particular (aunque las direcciones para una misma zona de memoria en procesos separados pueden
       no ser iguales, el núcleo las proyecta internamente para que la misma memoria proyectada  en  direcciones
       distintas  concuerde  para diferentes llamadas sys_futex). Típicamente se usa para implementar el caso de
       contienda de un bloqueo en memoria compartida, como se describe en futex(4).

       Cuando una operación futex(4) termina con contienda en espacio de usuario, es necesario hacer una llamada
       al  núcleo  para  que  arbitre.  El  arbitraje  puede  significar  o  bloquear  al  proceso  invocador o,
       contrariamente, despertar a un proceso bloqueado.

       Se espera que los procesos que llamen a esta función  se  adhieran  a  la  semántica  que  se  expone  en
       futex(4).  Ya que esta semántica supone escribir instrucciones en ensamblador no (trans)portables, esto a
       su vez probablemente significa que la mayoría de los usuarios serán de hecho autores de bibliotecas y  no
       desarrolladores genéricos de aplicaciones.

       Es  necesario que el argumento futex apunte a un entero alineado que almacene el contador. La operación a
       ejecutar se pasa a través del parámetro op junto con un valor val.

       Actualmente se definen tres operaciones:

       FUTEX_WAIT
              Esta operación verifica atómicamente si la dirección  futex  contiene  todavía  el  valor  dado  y
              bloquea  al  proceso a la espera de FUTEX_WAKE en esta dirección futex. Si el argumento timeout no
              es NULL, su contenido describe la duración máxima de la espera, que es infinita en otro caso. Para
              futex(4),  esta  llamada  se  ejecuta  si  al  decrementar el contador se obtuvo un valor negativo
              (indicando contención) y se bloqueará hasta  que  otro  proceso  libere  el  futex  y  ejecute  la
              operación FUTEX_WAKE.

       FUTEX_WAKE
              Esta  operación despierta, como mucho, val procesos que esperan en esta dirección futex (es decir,
              dentro de FUTEX_WAIT).  Para futex(4), esta llamada se ejecuta si al incrementar  el  contador  se
              vio  que había procesos esperando una vez que al futex se le ha asignado el valor 1 (indicando que
              está disponible).

       FUTEX_FD
              Para soportar despertares asíncronos, esta operación asocia un descriptor de fichero con un futex.
              Si  otro proceso ejecuta un FUTEX_WAKE, el proceso recibirá el número de señal que se pasó en val.
              El proceso invocador debe cerrar el descriptor de fichero devuelto después de su uso.

              Para evitar condiciones de carrera, el invocador debe comprobar si se  ha  incrementado  el  futex
              después de que FUTEX_FD regrese.

VALOR DEVUELTO

       Dependiendo de la operación que se haya ejecutado, el valor devuelto puede tener significados diferentes.

       FUTEX_WAIT
              Devuelve  0  si  el  proceso  fue  despertado  por  una llamada FUTEX_WAKE. En el caso de que haya
              expirado el plazo, se devuelve ETIMEDOUT. Si el futex no era igual al valor esperado, la operación
              devuelve  EWOULDBLOCK.  Las  señales  (u  otros  falsos despertares) hacen que FUTEX_WAIT devuelva
              EINTR.

       FUTEX_WAKE
              Devuelve el número de procesos despertados.

       FUTEX_FD
              Devuelve el nuevo descriptor de fichero asociado al 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.

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(4), `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.nl.kernel.org:/pub/linux/kernel/people/rusty/>.

                                                31 diciembre 2002                                       FUTEX(2)