futex(7) Miscellaneous Information Manual futex(7) NOMBRE futex - bloqueos rapidos en espacio de usuario SINOPSIS #include DESCRIPCION El nucleo de Linux proporciona futexes ('Fast Userspace muTexes') como un componente basico para la construccion de bloqueos y semaforos rapidos en espacio de usuario. Los futexes son un mecanismo muy basico y se prestan bien para construir abstracciones de mas alto nivel como mutexes, variable condicionales, bloqueos de lectura/escritura, barreras y semaforos. La mayoria de los programadores no emplean directamente futexes pero si los emplean a traves 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 identicas. En su forma mas basica, un futex tiene la semantica de un semaforo; es un contador que se puede incrementar y reducir de forma atomica; los procesos pueden esperar a que el valor se vuelva positivo. Si no se origina ninguna contienda, la operacion futex se realiza enteramente en espacio de usuario. Al nucleo solo se le implica para arbitrar en caso de contienda. Al igual que en otros disenos sensatos, los futexes se han optimizado para evitar dichas contiendas en la medida de lo posible. En su forma mas basica, un futex es un entero alineado que solo se modifica mediante instrucciones atomicas en ensamblador. Dicho entero tiene una longitud de cuatro bytes en todas las plataformas. Los procesos pueden compartir este entero a traves de mmap(2), mediante segmentos compartidos o usando el mismo espacio de memoria (en este ultimo caso se dice comunmente que la aplicacion es multihilo). Semantica Cualquier operacion futex se inicia en el espacio de usuario, pero puede ser necesario comunicarse con el nucleo usando la llamada al sistema futex(2). Para "subir" un futex, ejecute las instrucciones en ensamblador adecuadas que haran que la CPU incremente atomicamente el entero. A continuacion, compruebe si realmente ha cambiado de 0 a 1, en cuyo caso no habia procesos esperando y la operacion ha terminado rapidamente y sin contienda. Este deberia ser el caso mas comun. En caso de contienda, el incremento atomico cambio el contador desde -1 (o algun otro numero negativo). Si se detecta, habia procesos esperando. Ahora, desde el espacio de usuario, se debe asignar un 1 al contador y ordenar al nucleo que despierte a cualquier proceso que se encuentre esperando, usando para ello la operacion FUTEX_WAKE. Esperar en un futex, para "bajarlo", es la operacion contraria. Reduzca atomicamente el contador y compruebe si ha cambiado a 0, en cuyo caso no hay contienda y la operacion ha terminado. En cualquier otra circunstancia, el proceso debe asignar un -1 al contador y solicitar que el nucleo espere a que otro proceso suba el futex. Esto se hace usando la operacion FUTEX_WAIT. A la llamada al sistema futex(2) se le puede pasar opcionalmente un plazo de tiempo que especifique cuanto tiempo debe esperar el nucleo a que el futex sea incrementado. En este caso, la semantica es mas compleja y se remite al programador a futex(2) para obtener mas detalles. Lo mismo se aplica a las esperas asincronas en futex. VERSIONES El soporte inicial para futex se anadio a la version 2.5.7 de Linux pero con una semantica distinta a la descrita mas arriba. La semantica actual se encuentra disponible desde la version 2.5.40 de Linux. NOTAS Los futexes, en su forma mas basica, no estan pensados como abstraccion simple para los usuarios finales. Es de esperar que los implementadores sean buenos conocedores de ensamblador y que hayan leido el codigo fuente de la biblioteca de futex en espacio de usuario que se indica acontinuacion. Esta pagina de manual ilustra el uso mas comun de las primitivas futex(2), aunque estan disponible muchas mas fuentes de informacion. VEASE TAMBIEN 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 . TRADUCCION La traduccion al espanol de esta pagina del manual fue creada por Juan Piernas y Marcos Fouces Esta traduccion es documentacion libre; lea la GNU General Public License Version 3 o posterior con respecto a las condiciones de copyright. No existe NINGUNA RESPONSABILIDAD. Si encuentra algun error en la traduccion de esta pagina del manual, envie un correo electronico a . Paginas de manual de Linux 6.06 31 Octubre 2023 futex(7)