futex(7) Miscellaneous Information Manual futex(7)

futex - futex - blocare rapidă în spațiul utilizatorului

#include <linux/futex.h>

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

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.

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.

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.

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

Traducerea în limba română a acestui manual a fost făcută 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.

2 mai 2024 Pagini de manual de Linux 6.8