FUTEX
Section: Manuel du programmeur Linux (2) Updated: 18 juillet 2003 Index
NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
NOTES
AUTEURS
VERSIONS
VOIR AUSSI
TRADUCTION
NOM
futex - Mécanisme de verrouillage rapide en mode utilisateur.
SYNOPSIS
#include <linux/futex.h>
#include <sys/time.h>
int sys_futex (void *futex, int op, int val, const struct timespec *timeout);
DESCRIPTION
L'appel-système
sys_futex
donne à un programme la possibilité d'attendre qu'une valeur à une adresse donnée
change, ou de réveiller tous ceux qui sont en attente sur cette adresse. Bien
que les adresses soient différentes dans des processus séparés, le noyau
fera la correspondant lors de l'appel-système.
Ceci est typiquement employé pour implémenter
les verrous en mémoire partagéé, tels qu'ils
sont décrits dans
futex(4).
Quant une opération
futex(4)
ne se termine pas de manière satisfaisante dans l'espace utilisateur, un appel
au noyau est nécessaire pour l'arbitrage. Ceci signifie soit endormir le
processus appelant, soit réveiller le processus en attente.
Les appelants de cette fonction doivent accepter les sémantiques décrites dans
futex(4).
Comme celles-ci impliquent l'écriture d'instructions non-portables en assembleur,
leurs utilisateurs sont des auteurs de bibliothèques plus que des développeurs applicatifs.
L'argument
futex
doit pointer sur un entier aligné qui stocke le compteur. L'opération à exécuter
est transmise dans le paramètre
op,
avec la valeur
val.
Trois opérations sont définies pour le moment :
- FUTEX_WAIT
-
Cette opération vérifie que l'adresse du futex contient toujours la valeur indiquée
et s'endort en attendant un
FUTEX_WAKE
à cette adresse. Les deux étapes sont liées atomiquement. Si l'argument
timeout
est non-NULL, il contient la durée maximale de sommeil. Sinon elle est infinie.
D'après
futex(4),
cet appel est exécuté si la décrémentation du compteur donne une valeur négative
(indiquant un conflit) et le sommeil durera jusqu'à ce qu'un autre processus
relâche le futex et exécute
FUTEX_WAKE.
- FUTEX_WAKE
-
Cette opération réveille au plus
val
processus en attente sur l'adresse du futex (endormis dans
FUTEX_WAIT).
D'après
futex(4),
ceci est exécuté si l'incrémentation du compteur montre qu'il y a des processus
en attente, une fois que la valeur du futex a été mise à 1 (indiquant qu'il
est disponible).
- FUTEX_FD
-
Pour permettre des réveils asynchrones, cette opération associe un descripteur de
fichier avec un futex. Si un autre processus exécute un
FUTEX_WAIT,
l'appelant recevra le signal dont le numéro a été indiqué dans
val.
L'appelant doit refermer le descripteur de fichier après utilisation.
Pour éviter les situations de concurrence, l'appelant doit tester si le futex a
été libéré après le retour de
FUTEX_FD.
VALEUR RENVOYÉE
Suivant l'opération exécutée, la valeur renvoyée peut avoir différentes significations.
- FUTEX_WAIT
-
Renvoie 0 si le processus a été réveillé par un
FUTEX_WAKE.
Renvoie ETIMEDOUT en cas de dépasse de délai. Renvoie EWOULDBLOCK si le futex
n'avait pas la valeur attendue. L'arrivée d'un signal peut faire renvoyer EINTR.
- FUTEX_WAKE
-
Renvoie le nombre de processus réveillés.
- FUTEX_FD
-
Renvoie le nouveau descripteur associé au futex.
NOTES
Répétons-le, les futex de base ne sont pas conçus comme une abstraction facile à
employer pour les utilisateurs. Les implémenteurs doivent maitriser l'assembleur
et avoir lu les sources de la bibliothèque en espace utilisateur décrite plus bas.
AUTEURS
Les futex ont été conçus et créés par Hubertus Franke (IBM Thomas J. Watson Research Center),
Matthew Kirkwood, Ingo Molnar (Red Hat) et Rusty Russell (IBM Linux Technology Center).
Cette page a été écrite par Bert Hubert.
VERSIONS
Le support initial des futex a été ajouté dans Linux 2.5.7 mais avec une sémantique
différent de celle décrite ci-dessus, qui est disponible depuis Linux 2.5.40.
VOIR AUSSI
TRADUCTION
Christophe Blaess, 1996-2003.
|