FUTEX(7) Manual del Programador de Linux FUTEX(7)

futex - bloqueos rápidos en espacio de usuario

#include <linux/futex.h>

The Linux kernel provides futexes ("Fast user-space mutexes") as a building block for fast user-space locking and semaphores. Futexes are very basic and lend themselves well for building higher-level locking abstractions such as mutexes, condition variables, read-write locks, barriers, and semaphores.

Most programmers will in fact not be using futexes directly but will instead rely on system libraries built on them, such as the Native POSIX Thread Library (NPTL) (see pthreads(7)).

A futex is identified by a piece of memory which can be shared between processes or threads. In these different processes, the futex need not have identical addresses. In its bare form, a futex has semaphore semantics; it is a counter that can be incremented and decremented atomically; processes can wait for the value to become positive.

Futex operation occurs entirely in user space for the noncontended case. The kernel is involved only to arbitrate the contended case. As any sane design will strive for noncontention, futexes are also optimized for this situation.

In its bare form, a futex is an aligned integer which is touched only by atomic assembler instructions. This integer is four bytes long on all platforms. Processes can share this integer using mmap(2), via shared memory segments, or because they share memory space, in which case the application is commonly called multithreaded.

Cualquier operación futex se inicia en el espacio de usuario, pero puede ser necesario comunicarse con el núcleo usando la llamada al sistema futex(2).

Para "subir" un futex, ejecute las instrucciones en ensamblador adecuadas que harán que la CPU incremente atómicamente el entero. A continuación, compruebe si realmente ha cambiado de 0 a 1, en cuyo caso no había procesos esperando y la operación ha terminado. Este es el caso sin contienda, que es rápido y debe ser el más común.

En el caso de contienda, el incremento atómico cambió el contador desde -1 (o algún otro número negativo). Si se detecta, había procesos esperando. Ahora, desde el espacio de usuario, se debe asignar un 1 al contador y ordenar al núcleo que despierte a cualquier proceso que se encuentre esperando, usando para ello la operación FUTEX_WAKE.

Esperar en un futex, para "bajarlo", es la operación contraria. Reduzca atómicamente el contador y compruebe si ha cambiado a 0, en cuyo caso no hay contienda y la operación ha terminado. En cualquier otra circunstancia, el proceso debe asignar un -1 al contador y solicitar que el núcleo espere a que otro proceso suba el futex. Esto se hace usando la operación FUTEX_WAIT.

A la llamada al sistema futex(2) se le puede pasar opcionalmente un plazo de tiempo que especifique cuánto tiempo debe esperar el núcleo a que el futex sea incrementado. En este caso, la semántica es más compleja y se remite al programador a futex(2) para obtener más detalles. Lo mismo se aplica a las esperas asíncronas en futex.

El soporte inicial para futex se añadió a la versión 2.5.7 de Linux pero con una semántica distinta a la descrita más arriba. La semántica actual se encuentra disponible desde la versión 2.5.40 de Linux.

Insistimos, los futexes, en su forma más básica, no están pensados como abstracción sencilla para los usuarios finales. Es de esperar que los implementadores sean buenos conocedores de ensamblador y que hayan leído los fuentes de la biblioteca de futex en espacio de usuario que se indica más abajo.

Esta página de manual ilustra el uso más común de las primitivas futex(2), aunque no es el único ni mucho menos.

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 (actas del Ottawa Linux Symposium 2002), biblioteca de ejemplo de futex, futex-*.tar.bz2 ftp://ftp.kernel.org/pub/linux/kernel/people/rusty/.

Esta página es parte de la versión 5.10 del proyecto Linux man-pages. Puede encontrar una descripción del proyecto, información sobre cómo informar errores y la última versión de esta página en https://www.kernel.org/doc/man-pages/.

La traducción al español de esta página del manual fue creada por Juan Piernas <piernas@ditec.um.es>

Esta traducción es documentación libre; lea la GNU General Public License Version 3 o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD.

Si encuentra algún error en la traducción de esta página del manual, envíe un correo electrónico a debian-l10n-spanish@lists.debian.org>..

15 Septiembre 2017 Linux