Provided by: manpages-ro_4.21.0-2_all 

NUME
futex - futex - blocare rapidă în spațiul utilizatorului
REZUMAT
#include <linux/futex.h>
DESCRIERE
Nucleul Linux oferă futexes („Fast user-space mutexes”, mutex-uri rapide în spațiul utilizatorului) ca
element de bază pentru blocarea rapidă în spațiul utilizatorului și pentru semafoare. Futex-urile sunt
foarte simple și se pretează foarte bine la construirea unor abstracțiuni de blocare de nivel superior,
cum ar fi mutex-urile, variabilele de condiție, blocările 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 nativă POSIX pentru fire de execuție („Native POSIX
Thread Library”: NPTL) (a se vedea pthreads(7)).
Un futex este identificat de o bucată de memorie care poate fi partajată între procese sau fire de
execuție. În aceste procese diferite, nu este necesar ca futex-ul să aibă adrese identice. În forma sa
simplă, un futex are o semantică de semaforizare; este un contor care poate fi incrementat și decrementat
atomic; procesele pot aștepta ca valoarea să devină pozitivă.
Operația futex are loc în întregime în spațiul utilizatorului în cazul în care nu apare nicio dispută.
Nucleul este implicat doar pentru a arbitra cazul disputat. Deoarece orice proiectare sănătoasă va
urmări să nu existe o dispută, futex-urile sunt, de asemenea, optimizate pentru această situație.
În forma sa simplă, un futex este un număr întreg aliniat care este atins doar de instrucțiunile de
asamblare atomică. Acest număr întreg are o lungime de patru octeți pe toate platformele. Procesele pot
partaja acest număr întreg folosind mmap(2), prin intermediul segmentelor de memorie partajată sau pentru
că împart spațiul de memorie, caz în care aplicația se numește în mod obișnuit multifir „multithreaded”.
Semantică
Orice operație futex începe în spațiul utilizatorului, dar poate fi necesar să se comunice cu nucleul
folosind apelul de sistem futex(2).
Pentru a „urca” (up) un futex, executați instrucțiunile de asamblare corespunzătoare care vor determina
CPU-ul gazdă să incrementeze atomic numărul întreg. Ulterior, verificați dacă acesta s-a schimbat de
fapt de la 0 la 1, caz în care nu au existat așteptări și operațiunea este gata. Acesta este cazul fără
dispută, care este rapid și ar trebui să fie obișnuit.
În cazul în care există dispută, creșterea atomică a schimbat contorul de la -1 (sau un alt număr
negativ). Dacă acest lucru este detectat, există așteptări. Spațiul utilizatorului ar trebui acum să
fixeze contorul la 1 și să ceară nucleului să trezească orice așteptări folosind operația FUTEX_WAKE.
Așteptarea unui futex, pentru a-l „coborî” (down), este operația inversă. Se descrește atomic contorul
și se verifică dacă acesta s-a schimbat la 0, caz în care operația este efectuată, iar futex-ul nu a fost
disputat. În toate celelalte circumstanțe, procesul ar trebui să fixeze contorul la -1 și să ceară
nucleului să aștepte ca un alt proces să urce futex-ul. Acest lucru se face folosind operația
FUTEX_WAIT.
Apelului de sistem futex(2) i se poate transmite opțional un temporizator care să specifice cât timp
trebuie să aștepte nucleul pentru ca futex-ul să fie ridicat. În acest caz, semantica este mai complexă,
iar programatorul este trimis la futex(2) pentru mai multe detalii. Același lucru este valabil și pentru
așteptarea asincronă a futex-ului.
VERSIUNI
Suportul inițial pentru futex a fost integrat în Linux 2.5.7, dar cu o semantică diferită de cea descrisă
mai sus. Semantica actuală este disponibilă de la Linux 2.5.40 încoace.
NOTE
Pentru a reitera, futex-urile goale nu sunt concepute ca o abstracție ușor de utilizat pentru
utilizatorii finali. Se așteaptă ca cei care implementează să aibă cunoștințe de asamblare și să fi
citit sursele bibliotecii futex din spațiul utilizatorului la care se face referire mai jos.
Această pagină de manual ilustrează cea mai frecventă utilizare a primitivelor futex(2); nu este în
niciun caz singura.
CONSULTAȚI Ș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 (lucrările de la Ottawa Linux Symposium
2002), biblioteca de exemple futex, futex-*.tar.bz2 https://mirrors.kernel.org/pub/linux/kernel/people
/rusty/.
TRADUCERE
Traducerea în limba română a acestui manual a fost creată de Remus-Gabriel Chelu
<remusgabriel.chelu@disroot.org>
Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o
versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă Nicio
RESPONSABILITATE.
Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-
ro@lists.sourceforge.net.
Pagini de manual de Linux 6.03 30 octombrie 2022 futex(7)