FUTEX(4) Manuel du programmeur Linux FUTEX(4) NOM futex(2,4) - Verrous rapide dans l'espace utilisateur. SYNOPSIS #include <linux/futex.h> DESCRIPTION Le noyau Linux propose des Futex (Fast Userpace muTex) en guise de blocs de base pour des verrous et smaphores dans l'espace utilisa- teur. Ils sont trs simples et servent implmenter des abstration de plus haut niveau comme les mutex Posix. Cette page ne documente pas toutes les dcisions de conception mais se contente des informations ncessaires pour le dveloppeur d'applica- tion ou de bibliothque. La plupart des programmeurs n'utiliseront jamais les futex(2,4) directement mais s'appuieront sur des bibliothques les utilisant, comme l'implmentation NPTL des threads. Un futex(2,4) est identifi par une portion de mmoire qui peut tre partage entre processus. Dans chacun d'eux, il peut avoir une adresse diffrente. Dans sa forme brute, un futex(2,4) se comporte comme un smaphore ; il a un compteur que l'on incrmente et dcrmente atomiquement, et les processus peuvent attendre que sa valeur soit pos- itive. Les oprations sur les Futex se font entirement dans l'espace util- isateur lorsqu'il n'y a pas de conflits. Le noyau n'est impliqu que pour arbitrer les conflits. Comme toute conception sense essayera d'viter les conflits, les futex(2,4) sont optimiss pour cette situation. Dans sa forme la plus simple, un futex(2,4) est un entier align, manipul uniquement par des oprations assembleur atomiques. Les processus peu- vent les partager par des projection mmap ou des segments de mmoire partage, ce qui correspond au cas des applications multi-threads. SMANTIQUE Toute opration sur les futex(2,4) dbute dans l'espace utilisateur, mais il peut tre ncessaire d'invoquer le noyau avec l'appel-systme futex(2,4)(2). Pour augmenter un futex(2,4), excutez l'opration assembleur qui permet au CPU hte d'incrmenter atomiquement un entier. Aprs, vrifiez s'il est pass de zro un, auquel cas il n'y avait pas d'attente et l'opration est termine. C'est le cas sans conflit, rapide et courant. S'il y avait un blocage, l'incrmentation atomique part d'un compteur -1 (ou une autre valeur ngative). Si c'est le cas, il y a des pro- cessus en attente. Il faut prsent mettre le compteur 1 et demander au noyau de rveiller tous les processus en attente, l'aide(1,5) de l'opration FUTEX_WAKE. Attendre sur un futex(2,4) pour le dcrmenter est l'opration inverse. Dcrmentez le compteur et vrifiez s'il est descendu zro, auquel cas l'opration est termine car le futex(2,4) tait libre. Dans tous les autres cas, le processus doit mettre le compteur -1 et demander au noyau d'attendre qu'un autre processus libre le futex. Ceci est ralis avec l'opration FUTEX_WAIT. L'appel-systme futex(2,4) peut aussi recevoir un dlai maximal d'attente pour que le futex(2,4) soit incrment. Dans ce cas la smantique est plus complexe et le programmeur doit se reporter futex(2,4)(2) pour plus de dtail. Idem pour les attentes asynchrones. NOTES Rpetons-le, les futex(2,4) bruts ne sont pas conus pour tre utiliss facilement. Les implmenteurs sont supposs connatre l'assembleur et avoir lu les sources de la bibliothque futex(2,4) en espace utilisateur dcrite plus bas. Cette page illustre l'utilisation la plus courante des primitives futex(2,4)(2) : ce n'est pas la seule. AUTEURS Les futex(2,4) ont t conus et crits 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(2,4) a t introduit dans Linux 2.5.7 avec une smantique diffrente de celle dcrite ci-dessus. La sman- tique actuelle est disponible depuis Linux 2.5.40. VOIR AUSSI futex(2,4)(2), `Fuss, Futexes and Furwocks: Fast Userlevel Locking in(1,8) Linux' (proceedings of the Ottawa Linux Symposium 2002), futex(2,4) example library, futex-*.tar.bz2 <URL:ftp://ftp.kernel.org:/pub/linux/ker- nel/people/rusty/>. TRADUCTION Christophe Blaess, 2003. LDP 25 juillet 2003 FUTEX(4)