Man page - futex(7)

Packages contains this manual

Available languages:

en fr es ja ru ro

Manual

futex

NOM
SYNOPSIS
DESCRIPTION
Sémantique
VERSIONS
NOTES
VOIR AUSSI
TRADUCTION

NOM

futex – Verrouillage rapide en mode utilisateur

SYNOPSIS

#include <linux/futex.h>

DESCRIPTION

Le noyau Linux fournit des futex (« Fast user-space mutexes ») en tant que brique permettant un verrouillage rapide et des sĂ©maphores en espace utilisateur. Les futex sont trĂšs basiques et se prĂȘtent facilement Ă  la construction d’abstractions de verrouillage de plus haut niveau telles que les mutex, les conditions variables, les blocages en Ă©criture/lecture, les barriĂšres et les sĂ©maphores.

En fait, la plupart des programmeurs n’ont pas à utiliser les futex directement ; ils s’appuient plutît sur les bibliothùques construites à partir d’eux, telle que NPTL (Native POSIX Thread Library) (consultez pthreads (7)).

Un futex est identifiĂ© par une zone mĂ©moire qui peut ĂȘtre partagĂ©e entre plusieurs processus ou plusieurs fils d’exĂ©cution. Dans ces diffĂ©rents processus, il n’a pas forcĂ©ment la mĂȘme adresse. Dans sa forme la plus simple, un futex a la sĂ©mantique d’un sĂ©maphore ; il s’agit d’un compteur qui peut ĂȘtre incrĂ©mentĂ© et dĂ©crĂ©mentĂ© de façon atomique. Les processus peuvent attendre que cette valeur devienne positive.

Une opĂ©ration sur un futex est faite entiĂšrement en espace utilisateur dans le cas oĂč il n’y a pas de sous-capacitĂ©. Le noyau n’est impliquĂ© que pour arbitrer en cas de sous-capacitĂ©. Comme toute conception saine Ă©vite cela, les futex sont aussi optimaux pour cette situation.

Dans sa forme basique, un futex est un entier alignĂ© qui n’est modifiĂ© que par des instructions atomiques d’assembleur. Cet entier se compose de quatre octets sur toutes les plateformes. Des processus peuvent partager cet entier en utilisant mmap (2), Ă  l’aide de segments de mĂ©moire partagĂ©s, ou parce qu’ils partagent leur espace mĂ©moire, auquel cas l’application est dite multithreadĂ©e.

Sémantique

Toute opĂ©ration futex dĂ©marre en espace utilisateur, mais il peut ĂȘtre nĂ©cessaire de communiquer avec le noyau en utilisant l’appel systĂšme futex (2).

Pour incrĂ©menter un futex, exĂ©cuter les instructions assembleur qui causent l’incrĂ©mentation de maniĂšre atomique de l’entier par le processeur hĂŽte. Ensuite, vĂ©rifier si sa valeur a changĂ© de 0 à 1, auquel cas il n’y avait pas de processus en attente et l’opĂ©ration est rĂ©alisĂ©e. Il s’agit du cas sans sous-capacitĂ©, qui est rapide et devrait ĂȘtre frĂ©quent.

En cas de sous-capacitĂ©, l’incrĂ©mentation atomique a modifiĂ© la valeur -1 (ou une autre valeur nĂ©gative) du compteur. Si cette situation est dĂ©tectĂ©e, il y a des processus en attente. L’espace utilisateur doit alors dĂ©finir le compteur à 1 et demander au noyau de rĂ©veiller les processus en attente avec l’opĂ©ration FUTEX_WAKE .

Attendre sur un futex, pour dĂ©crĂ©menter le compteur, est l’opĂ©ration inverse. DĂ©crĂ©menter le compteur de façon atomique et vĂ©rifier si sa nouvelle valeur est 0, auquel cas l’opĂ©ration est rĂ©alisĂ©e et le futex n’était pas dans un cas de sous-capacitĂ©. Dans tous les autres cas, le processus doit rĂ©gler le compteur à -1 et demander Ă  ce que le noyau attende qu’un autre processus incrĂ©mente le futex. Pour cela, utiliser l’opĂ©ration FUTEX_WAIT .

Un dĂ©lai peut Ă©ventuellement ĂȘtre passĂ© en argument Ă  l’appel systĂšme futex (2), qui indique combien de temps le noyau doit attendre que le futex soit incrĂ©mentĂ©. Dans ce cas, la sĂ©mantique est plus complexe et le programmeur devrait lire futex (2) pour plus de dĂ©tails. La mĂȘme remarque est valable pour l’attente asynchrone sur un futex.

VERSIONS

La gestion des futex a été intégrée à Linux 2.5.7, mais avec une sémantique différente de celle décrite ci-dessus. La sémantique actuelle est disponible depuis Linux 2.5.40.

NOTES

Pour rappel, les futex de base ne sont pas conçus comme une abstraction facile Ă  employer pour les utilisateurs finaux. Les personnes les mettant en pratique doivent maĂźtriser l’assembleur et avoir lu les sources de la bibliothĂšque futex en espace utilisateur dĂ©crite ci-dessous.

Cette page de manuel illustre l’utilisation la plus courante des primitives futex (2). Il ne s’agit absolument pas de la seule.

VOIR AUSSI

clone (2), futex (2), get_robust_list (2), set_robust_list (2), set_tid_address (2), pthreads (7)

« Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux » (proceedings of the Ottawa Linux Symposium 2002), bibliothĂšque d’exemple de futex, futex-*.tar.bz2 https://mirrors.kernel.org/pub/linux/kernel/people/rusty/ .

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .