futex(7) Miscellaneous Information Manual futex(7) NUME futex - futex - blocare rapida in spaiul utilizatorului REZUMAT #include DESCRIERE Nucleul Linux ofera futexes (,,Fast user-space mutexes", mutex-uri rapide in spaiul utilizatorului) ca element de baza pentru blocarea rapida in spaiul utilizatorului i pentru semafoare. Futex-urile sunt foarte simple i se preteaza foarte bine la construirea unor abstraciuni de blocare de nivel superior, cum ar fi mutex-urile, variabilele de condiie, blocarile de citire-scriere, barierele i semafoarele. De fapt, majoritatea programatorilor nu vor utiliza direct futexurile, ci se vor baza pe bibliotecile de sistem construite pe acestea, cum ar fi biblioteca nativa POSIX pentru fire de execuie (,,Native POSIX Thread Library": NPTL) (a se vedea pthreads(7)). Un futex este identificat de o bucata de memorie care poate fi partajata intre procese sau fire de execuie. In aceste procese diferite, nu este necesar ca futex-ul sa aiba adrese identice. In forma sa simpla, un futex are o semantica de semaforizare; este un contor care poate fi incrementat i decrementat atomic; procesele pot atepta ca valoarea sa devina pozitiva. Operaia futex are loc in intregime in spaiul utilizatorului in cazul in care nu apare nicio disputa. Nucleul este implicat doar pentru a arbitra cazul disputat. Deoarece orice proiectare sanatoasa va urmari sa nu existe o disputa, futex-urile sunt, de asemenea, optimizate pentru aceasta situaie. In forma sa simpla, un futex este un numar intreg aliniat care este atins doar de instruciunile de asamblare atomica. Acest numar intreg are o lungime de patru octei pe toate platformele. Procesele pot partaja acest numar intreg folosind mmap(2), prin intermediul segmentelor de memorie partajata sau pentru ca impart spaiul de memorie, caz in care aplicaia se numete in mod obinuit multifir ,,multithreaded". Semantica Orice operaie futex incepe in spaiul utilizatorului, dar poate fi necesar sa se comunice cu nucleul folosind apelul de sistem futex(2). Pentru a ,,urca" (up) un futex, executai instruciunile de asamblare corespunzatoare care vor determina CPU-ul gazda sa incrementeze atomic numarul intreg. Ulterior, verificai daca acesta s-a schimbat de fapt de la 0 la 1, caz in care nu au existat ateptari i operaiunea este gata. Acesta este cazul fara disputa, care este rapid i ar trebui sa fie obinuit. In cazul in care exista disputa, creterea atomica a schimbat contorul de la -1 (sau un alt numar negativ). Daca acest lucru este detectat, exista ateptari. Spaiul utilizatorului ar trebui acum sa fixeze contorul la 1 i sa ceara nucleului sa trezeasca orice ateptari folosind operaia FUTEX_WAKE. Ateptarea unui futex, pentru a-l ,,cobori" (down), este operaia inversa. Se descrete atomic contorul i se verifica daca acesta s-a schimbat la 0, caz in care operaia este efectuata, iar futex-ul nu a fost disputat. In toate celelalte circumstane, procesul ar trebui sa fixeze contorul la -1 i sa ceara nucleului sa atepte ca un alt proces sa urce futex-ul. Acest lucru se face folosind operaia FUTEX_WAIT. Apelului de sistem futex(2) i se poate transmite opional un temporizator care sa specifice cat timp trebuie sa atepte nucleul pentru ca futex-ul sa fie ridicat. In acest caz, semantica este mai complexa, iar programatorul este trimis la futex(2) pentru mai multe detalii. Acelai lucru este valabil i pentru ateptarea asincrona a futex-ului. VERSIUNI Suportul iniial pentru futex a fost integrat in Linux 2.5.7, dar cu o semantica diferita de cea descrisa mai sus. Semantica actuala este disponibila de la Linux 2.5.40 incoace. NOTE Pentru a reitera, futex-urile goale nu sunt concepute ca o abstracie uor de utilizat pentru utilizatorii finali. Se ateapta ca cei care implementeaza sa aiba cunotine de asamblare i sa fi citit sursele bibliotecii futex din spaiul utilizatorului la care se face referire mai jos. Aceasta pagina de manual ilustreaza cea mai frecventa utilizare a primitivelor futex(2); nu este in niciun caz singura. CONSULTAI I 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 (lucrarile de la Ottawa Linux Symposium 2002), biblioteca de exemple futex, futex-*.tar.bz2 . TRADUCERE Traducerea in limba romana a acestui manual a fost facuta de Remus- Gabriel Chelu Aceasta traducere este documentaie gratuita; citii Licena publica generala GNU Versiunea 3 sau o versiune ulterioara cu privire la condiii privind drepturile de autor. NU se asuma NICIO RESPONSABILITATE. Daca gasii erori in traducerea acestui manual, va rugam sa trimitei un e-mail la . Pagini de manual de Linux 6.06 31 octombrie 2023 futex(7)