Loading

NOM

       futex - Verrouillage rapide en espace utilisateur

SYNOPSIS

       #include <linux/futex.h>

       Le  noyau  Linux fournit des futex (« Fast Userspace muTexes ») en tant
       que brique permettant un verrouillage  et  des  sémaphores  rapides  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 POSIX.

       Cette   page   ne  prétend  pas  documenter  toutes  les  décisions  de
       conception, mais se  restreint  aux  problèmes  liés  au  développement
       d’applications   et  de  bibliothèques.  La  plupart  des  programmeurs
       n’utiliseront en fait pas les futex directement, mais  utiliseront  des
       bibliothèques  système  construites  par-dessus, comme l’implémentation
       NPTL des pthreads.

       Un futex est identifié par une zone  mémoire  qui  peut  être  partagée
       entre  plusieurs  processus.  Dans ces différents processus, il n’a pas
       forcément la même adresse. Dans  sa  forme  de  base,  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 contention. Le noyau n’est impliqué  que
       pour arbitrer en cas de contention. Comme toute application raisonnable
       est conçue pour éviter les contentions, les futex sont  optimisés  pour
       cette situation.

       Dans  sa  forme basique, un futex est un entier aligné qui n’est accédé
       que par des instructions assembleur atomiques.  Des  processus  peuvent
       partager  cet  entier  avec  mmap(2),  avec  des  segments  de  mémoire
       partagés, ou parce qu’ils  partagent  leur  espace  mémoire ;  dans  le
       dernier 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 avec l’appel système  futex(2).

       Pour  incrémenter  un  futex,  exécuter les instructions assembleur qui
       causent l’incrémentation 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  terminée.  Il
       s’agit  du cas sans contention, qui est rapide et devrait être commune.

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

       Attendre un futex, le décrémenter, 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 terminée, et il n’y avait pas de contention.
       Dans  tous  les  autres  cas,  le  processus  doit attendre qu’un autre
       processus  implémente  le  futex.  Pour  cela,   utiliser   l’opération
       FUTEX_WAIT.

       On  peut  éventuellement  passer un délai 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, avec une sémantique
       différente de celle  décrite  ci-dessus.  La  sémantique  actuelle  est
       disponible depuis Linux 2.5.40.

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
       maîtriser  l’assembleur  et  avoir lu les sources de la bibliothèque en
       espace utilisateur décrite ci-dessous.

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

VOIR AUSSI

       futex(2)

       « 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
       <URL:ftp://ftp.kernel.org/pub/linux/kernel/people/rusty/>.

COLOPHON

       Cette page fait partie de  la  publication  3.23  du  projet  man-pages
       Linux.  Une description du projet et des instructions pour signaler des
       anomalies      peuvent      être       trouvées       à       l’adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Cette page de manuel a été traduite et est maintenue par Julien Cristau
       <julien.cristau@ens-lyon.org> et l’équipe francophone de traduction  de
       Debian.

       Veuillez   signaler   toute   erreur   de   traduction  en  écrivant  à
       <debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
       paquet manpages-fr.

       Vous  pouvez  toujours avoir accès à la version anglaise de ce document
       en utilisant la commande « man -L C <section> <page_de_man> ».