Futex

Futex ( în engleză  futex , prescurtare de la engleză  fast userspace mutex ) este o primitivă de sincronizare ușoară de nivel scăzut [1] , pe baza căreia sunt implementate alte primitive și mecanisme, cum ar fi mutexuri , semafore și variabile de condiție [2] . De asemenea, futexe-urile pot participa la organizarea unor mecanisme de sincronizare mai complexe, cum ar fi bariere și blocări de citire-scriere , permițându-vă să activați simultan un grup de sarcini. A fost introdus inițial în versiunile timpurii ale nucleului Linux 2.5 [1] . Mai târziu, o primitivă aproape identică a fost implementată în nucleuFerestre [3] .

Istorie

A apărut pentru prima dată în versiunea 2.5.7 a nucleului Linux, stabilizarea semantică s-a încheiat în versiunea 2.5.40 .

Dezvoltat de Hubertus Franke (la Centrul de Cercetare Thomas Watson al IBM ), Matthew Kirkwood și Rusty Russell de la Centrul de tehnologie IBM Linux și dezvoltatorul Red Hat Ingo Molnar.

Informații generale

Un futex este un număr întreg aliniat în memoria partajată (pentru procesoare multiple) în spațiul utilizatorului și o coadă de așteptare în spațiul kernel [4] . Pentru a organiza un futex, este necesară cel puțin o pagină de memorie , mapată la spațiul de adrese al fiecăruia dintre procesele care participă la futex. Apelurile de sistem sunt destinate numai bibliotecilor de streaming din spațiul utilizatorului și numai sub formă de instrucțiuni în limbaj de asamblare [5] .

Un număr întreg partajat poate fi incrementat sau decrementat cu o instrucțiune de asamblare una într -o singură. Procesele legate de acest futex așteaptă ca această valoare să devină pozitivă. Toate operațiunile cu futexe sunt aproape complet efectuate în spațiul utilizatorului (în absența concurenței [6] ), funcțiile nucleului corespunzătoare sunt utilizate doar într-un set limitat de cazuri controversate. Acest lucru face posibilă creșterea eficienței utilizării primitivelor de sincronizare , deoarece majoritatea operațiunilor nu folosesc arbitrajul și, prin urmare, evită utilizarea apelurilor de sistem relativ costisitoare ( apeluri de sistem în engleză  ).

Obiectele CRITICAL_SECTION din API-ul Win32 sunt optimizate în mod similar , ca și FAST_MUTEX în kernelul Windows [7] .

Note

  1. ↑ 12 Ulrich Drepper . Futexes Are Tricky (engleză) (PDF)  (link indisponibil) . Red Hat Inc. (11 decembrie 2005). Preluat la 16 iunie 2019. Arhivat din original la 16 iunie 2019.  
  2. Remi Denis-Courmont. Alte utilizări ale futex  . Remlab . Remlab.net (21 septembrie 2016). Preluat la 17 iunie 2019. Arhivat din original la 17 iunie 2019.
  3. Remi Denis-Courmont. Condiție variabilă cu futex  . Remlab . Remlab.net (21 septembrie 2016). Preluat la 16 iunie 2019. Arhivat din original la 16 iunie 2019.
  4. Oshana, 2015 , 8.12 Stai în afara nucleului dacă este deloc posibil.
  5. Scott, 2013 .
  6. Doug Abbott. Implementări Pthreads // Linux pentru aplicații încorporate și în timp real, ediția a 3-a. - Newnes, 2012. - 296 p. — ISBN 978-0-12-391433-0 .
  7. Eliberați-vă de blocajele codului în secțiunile critice din Windows . Data accesului: 13 ianuarie 2010. Arhivat din original la 24 decembrie 2013.

Literatură

Link -uri