.\" This manpage has been automatically generated by docbook2man
.\" from a DocBook document. This tool can be found at:
.\"
.\" Please send any bug reports, improvements, comments, patches,
.\" etc. to Steve Cheng .
.\"
.\" Traducido por Juan Piernas el 5-febrero-2005
.\"
.TH "FUTEX" "4" "31 diciembre 2002" "" ""
.SH NOMBRE
futex \- Bloqueos rápidos en espacio de usuario
.SH SINOPSIS
.nf
#include
.fi
.SH "DESCRIPCIÓN"
.PP
El núcleo de Linux proporciona \fIfutexes\fR ('Fast Userspace
muTexes') como un componente básico para la construcción de bloqueos y
semáforos rápidos en espacio de usuario. Los \fIfutexes\fR son un
mecanismo muy básico y se prestan bien para construir abstracciones de
más alto nivel como mutexes POSIX.
.PP
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 \fIfutexes\fR directamente sino que en su lugar se apoyarán
en bibliotecas del sistema construídas sobre ellos, como la
implementación NPTL de pthreads.
.PP
Un \fIfutex\fR se identifica mediante un trozo de memoria que puede
ser compartido entre diferentes procesos. En estos procesos, el
\fIfutex\fR no necesita tener direcciones idénticas. En su forma más
básica, un \fIfutex\fR 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.
.PP
En el caso en el que no se produzca contienda, la operación
\fIfutex\fR 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 \fIfutexes\fR se han optimizado para
evitar la contención en la medida de lo posible.
.PP
En su forma más básica, un \fIfutex\fR 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).
.SH "SEMÁNTICA"
.PP
Cualquier operación \fIfutex\fR se inicia en el espacio de usuario,
pero puede ser necesario comunicarse con el núcleo usando la llamada
al sistema \fBfutex\fR(2).
.PP
Para 'subir' un \fIfutex\fR, 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.
.PP
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.
.PP
Esperar en un \fIfutex\fR, 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 \fIfutex\fR.
Esto se hace usando la operación FUTEX_WAIT.
.PP
A la llamada al sistema \fBfutex\fR(2) se le puede pasar opcionalmente un
plazo de tiempo que especifique cuánto tiempo debe esperar el núcleo a
que el \fIfutex\fR sea incrementado. En este caso, la semántica es más
compleja y se remite al programador a \fBfutex\fR(2) para obtener más
detalles. Lo mismo se aplica a las esperas asíncronas en \fIfutex\fR.
.SH "OBSERVACIONES"
.PP
Insistimos, los \fIfutexes\fR, 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 \fIfutex\fR en
espacio de usuario que se indica más abajo.
.PP
Esta página de manual ilustra el uso más común de las primitivas
\fBfutex\fR(2), aunque no es el único ni mucho menos.
.SH "AUTORES"
.PP
Los \fIfutexes\fR 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.
.SH "VERSIONES"
.PP
El soporte inicial para \fIfutex\fR 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.
.SH "VÉASE TAMBIÉN"
.PP
\fBfutex\fR(2),
`Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux' (actas
del Ottawa Linux Symposium 2002),
biblioteca de ejemplo de \fIfutex\fR, futex-*.tar.bz2
.