Secţiunea critică

Versiunea actuală a paginii nu a fost încă revizuită de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită pe 25 octombrie 2017; verificările necesită 6 modificări .

O secțiune critică  este o secțiune a codului executabil al programului care accesează o resursă partajată (date sau dispozitiv) care nu trebuie utilizată simultan de mai mult de un fir de execuție . Când două (sau mai multe) fire sunt în secțiunea critică, apare o stare de „cursă” („concurență”). Pentru a evita această situație, trebuie îndeplinite patru condiții:

  1. Două fire nu trebuie să fie în regiuni critice în același timp.
  2. Programul nu ar trebui să facă presupuneri despre viteza sau numărul de procesoare.
  3. Un fir din afara regiunii critice nu poate bloca alte fire.
  4. Este imposibil ca un fir să aștepte pentru totdeauna pentru a atinge o regiune critică.

O secțiune critică este un  obiect de sincronizare a firelor de execuție care vă permite să împiedicați executarea simultană a unui anumit set de operațiuni (de obicei legate de accesul la date) de către mai multe fire de execuție. O secțiune critică îndeplinește aceleași sarcini ca un mutex .

Există diferențe terminologice între un mutex și o secțiune critică: deci o procedură similară cu „capturarea” unui mutex se numește intrarea în secțiunea critică ( ing.  enter ) și similară cu deblocarea mutexului - ieșirea din secțiunea critică ( ing.  leave ) .

Procedura de intrare și ieșire din secțiunile critice durează de obicei mai puțin timp decât operațiunile mutex similare, ceea ce se datorează absenței necesității de a accesa nucleul OS.

În sistemele de operare din familia Microsoft Windows , diferența dintre un mutex și o secțiune critică este că mutexul este un obiect nucleu și poate fi utilizat de mai multe procese în același timp, în timp ce secțiunea critică aparține procesului și servește la sincronizare. doar firele sale.

Secțiunile critice Windows au o optimizare pentru a utiliza o variabilă mutabilă atomic împreună cu obiectul „eveniment de sincronizare” al nucleului. Capturarea unei secțiuni critice înseamnă o creștere atomică a variabilei cu 1. Trecerea la așteptarea unui eveniment kernel se efectuează numai dacă valoarea variabilei înainte de captare era deja mai mare de 0, adică există o „concurență” reală a două sau mai multe fire pentru o resursă.

Astfel, în absența unei dispute, captarea/dealocarea unei secțiuni critice este ocolită fără apeluri către nucleu.

În plus, capturarea unei secțiuni critice deja ocupate înainte de a accesa nucleul așteaptă o perioadă scurtă de timp în buclă (numărul de iterații ale buclei ( de exemplu, număr de spin ) este stabilit de funcțiile InitializeCriticalSectionAndSpinCount () sau SetCriticalSectionSpinCount () )  număr variabil de utilizatori actuali și, dacă această variabilă devine egală cu 0, atunci capturarea are loc fără apeluri către nucleu.

Un obiect similar din nucleul Windows se numește FAST_MUTEX ( ExAcquire/ReleaseFastMutex ). Diferă de o secțiune critică prin faptul că nu acceptă redobândirea recursivă de către același fir.

Un obiect similar în Linux se numește futex .

Vezi și

Link -uri