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/>.