futex(7)

NOMBRE
futex - bloqueos rápidos en espacio de usuario

SINOPSIS
#include <linux/futex.h>

DESCRIPCIÓN
El núcleo de Linux proporciona futexes ('Fast Userspace muTexes') como un componente básico para la construcción de bloqueos y semáforos rápidos en espacio de usuario. Los futexes son un mecanismo muy básico y se prestan bien para construir abstracciones de más alto nivel como mutexes, variable condicionales, bloqueos de lectura/escritura, barreras y semáforos.

La mayoría de los programadores no emplean directamente futexes pero sí los emplean a través de bibliotecas del sistema basadas en ellos tales como la Native POSIX Thread Library (NPTL). Consulte pthreads(7).

Un futex se identifica mediante un trozo de memoria que puede ser compartido entre procesos e hilos. En estos procesos, el futex no necesita tener direcciones idénticas. En su forma más básica, un futex tiene la semántica de un semáforo; es un contador que se puede incrementar y reducir de forma atómica; los procesos pueden esperar a que el valor se vuelva positivo.

Si no se origina ninguna contienda, la operación futex se realiza enteramente en espacio de usuario. Al núcleo sólo se le implica para arbitrar en caso de contienda. Al igual que en otros diseños sensatos, los futexes se han optimizado para evitar dichas contiendas en la medida de lo posible.

En su forma más básica, un futex es un entero alineado que sólo se modifica mediante instrucciones atómicas en ensamblador. Dicho entero tiene una longitud de cuatro bytes en todas las plataformas. Los procesos pueden compartir este entero a través de mmap(2), mediante segmentos compartidos o usando el mismo espacio de memoria (en este último caso se dice comúnmente que la aplicación es multihilo).

  Semantica
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 rápidamente y sin contienda. Éste debería ser el caso más común.

En 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.

VERSIONES
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.

NOTAS
Los futexes, en su forma más básica, no están pensados como abstracción simple para los usuarios finales. Es de esperar que los implementadores sean buenos conocedores de ensamblador y que hayan leído el código fuente de la biblioteca de futex en espacio de usuario que se indica acontinuación.

Esta página de manual ilustra el uso más común de las primitivas futex(2), aunque están disponible muchas más fuentes de información.

VÉASE TAMBIÉN
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), futex example library, futex-*.tar.bz2 https://mirrors.kernel.org/pub/linux/kernel/people/rusty/.

TRADUCCIÓN
La traducción al español de esta página del manual fue creada por Juan Piernas <piernas@ditec.um.es> y Marcos Fouces <marcos@debian.org>

Esta traducción es documentación libre; lea la GNU General Public License Version 3 (https://www.gnu.org/licenses/gpl-3.0.html) 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.