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