futex(7) Miscellaneous Information Manual futex(7) NOM futex - Verrouillage rapide en mode utilisateur SYNOPSIS #include DESCRIPTION Le noyau Linux fournit des futex (<< Fast user-space mutexes >>) en tant que brique permettant un verrouillage rapide et des semaphores en espace utilisateur. Les futex sont tres basiques et se pretent facilement a la construction d'abstractions de verrouillage de plus haut niveau telles que les mutex, les conditions variables, les blocages en ecriture/lecture, les barrieres et les semaphores. En fait, la plupart des programmeurs n'ont pas a utiliser les futex directement ; ils s'appuient plutot sur les bibliotheques construites a partir d'eux, telle que NPTL (Native POSIX Thread Library) (consultez pthreads(7)). Un futex est identifie par une zone memoire qui peut etre partagee entre plusieurs processus ou plusieurs fils d'execution. Dans ces differents processus, il n'a pas forcement la meme adresse. Dans sa forme la plus simple, un futex a la semantique d'un semaphore ; il s'agit d'un compteur qui peut etre incremente et decremente de facon atomique. Les processus peuvent attendre que cette valeur devienne positive. Une operation sur un futex est faite entierement en espace utilisateur dans le cas ou il n'y a pas de sous-capacite. Le noyau n'est implique que pour arbitrer en cas de sous-capacite. Comme toute conception saine evite cela, les futex sont aussi optimaux pour cette situation. Dans sa forme basique, un futex est un entier aligne qui n'est modifie 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), a l'aide de segments de memoire partages, ou parce qu'ils partagent leur espace memoire, auquel cas l'application est dite multithreadee. Semantique Toute operation futex demarre en espace utilisateur, mais il peut etre necessaire de communiquer avec le noyau en utilisant l'appel systeme futex(2). Pour incrementer un futex, executer les instructions assembleur qui causent l'incrementation de maniere atomique de l'entier par le processeur hote. Ensuite, verifier si sa valeur a change de 0 a 1, auquel cas il n'y avait pas de processus en attente et l'operation est realisee. Il s'agit du cas sans sous-capacite, qui est rapide et devrait etre frequent. En cas de sous-capacite, l'incrementation atomique a modifie la valeur -1 (ou une autre valeur negative) du compteur. Si cette situation est detectee, il y a des processus en attente. L'espace utilisateur doit alors definir le compteur a 1 et demander au noyau de reveiller les processus en attente avec l'operation FUTEX_WAKE. Attendre sur un futex, pour decrementer le compteur, est l'operation inverse. Decrementer le compteur de facon atomique et verifier si sa nouvelle valeur est 0, auquel cas l'operation est realisee et le futex n'etait pas dans un cas de sous-capacite. Dans tous les autres cas, le processus doit regler le compteur a -1 et demander a ce que le noyau attende qu'un autre processus incremente le futex. Pour cela, utiliser l'operation FUTEX_WAIT. Un delai peut eventuellement etre passe en argument a l'appel systeme futex(2), qui indique combien de temps le noyau doit attendre que le futex soit incremente. Dans ce cas, la semantique est plus complexe et le programmeur devrait lire futex(2) pour plus de details. La meme remarque est valable pour l'attente asynchrone sur un futex. VERSIONS La gestion des futex a ete integree a Linux 2.5.7, mais avec une semantique differente de celle decrite ci-dessus. La semantique actuelle est disponible depuis Linux 2.5.40. NOTES Pour rappel, les futex de base ne sont pas concus comme une abstraction facile a employer pour les utilisateurs finaux. Les personnes les mettant en pratique doivent maitriser l'assembleur et avoir lu les sources de la bibliotheque futex en espace utilisateur decrite 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), bibliotheque d'exemple de futex, futex-*.tar.bz2 . TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Paul Guillonneau Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 futex(7)