Operațiunea atomică

Operație atomică ( greacă άτομος  - indivizibilă) - o operație  care fie este efectuată în întregime, fie nu este efectuată deloc; o operație care nu poate fi efectuată parțial și parțial neefectuat.

Acest articol descrie cele mai simple operații atomice (citire, scriere etc.), deși termenul se poate referi la operațiuni de nivel superior, cum ar fi, de exemplu, o serie de interogări către SGBD în cadrul unei singure tranzacții .

Operațiile atomice sunt utilizate în computerele cu mai multe procesoare și în sistemele de operare multitasking pentru a oferi acces pentru mai multe procese și/sau mai multe fire ale aceluiași proces la resursele partajate între ele. O operație atomică este efectuată de un singur fir .

Clasificare

Atomicitatea operațiilor poate fi asigurată de hardware (hardware) și software (codul de program). În primul caz, sunt utilizate instrucțiuni speciale ale mașinii , a căror atomicitate este garantată de hardware. În al doilea caz, sunt utilizate instrumente software speciale de sincronizare , cu ajutorul cărora resursa partajată este blocată ; dupa blocare se executa operatia ce trebuie facuta atomic. O blocare este o operațiune atomică care fie acordă o resursă unui fir de execuție , fie îi spune firului de execuție că resursa este deja utilizată de un alt fir de execuție sau proces (ocupat).

Instrucțiuni de asamblare și atomicitate

Instrucțiuni de mașină, a căror execuție poate fi întotdeauna considerată atomică:

Instrucțiuni de mașină care nu sunt atomice:

Instrucțiuni atomice pentru procesoare x86

Instrucțiuni atomice pentru procesoare cu arhitectură x86 :

În plus, multe instrucțiuni de mașină de citire-modificare-scriere sunt executate atomic atunci când sunt prefixate cu LOCK [4] ( opcode 0xF0), cum ar fi următoarele:

Prefixul LOCK blochează accesul la memorie pe durata instrucțiunii. O blocare se poate extinde pe o zonă de memorie mai largă decât lungimea operandului, cum ar fi lungimea unei linii de cache .

Instrucțiuni atomice în procesoarele RISC

O caracteristică a arhitecturilor procesoarelor RISC este absența instrucțiunilor de citire-modificare-scriere . Procesoarele DEC Alpha , PowerPC , MIPS și ARM (ARMv6 și mai vechi) RISC acceptă accesul exclusiv la memorie fără blocare. Operațiile atomice sunt implementate folosind o pereche de instrucțiuni exclusive de citire-scriere LL și SC, după cum urmează:

Prima instrucțiune (LL) încarcă datele din locația de memorie într-un registru și marchează locația ca locație pentru acces exclusiv. În continuare, se efectuează modificările necesare de date în registru. Scrierea datelor din registru în memorie (SC) se efectuează numai dacă valoarea celulei de memorie nu s-a schimbat. Dacă valoarea s-a modificat, cele trei operații (LL, modificarea datelor și SC) trebuie repetate.

Instrucțiuni atomice și compilatoare

Compilatorii limbilor de nivel înalt , de regulă, nu folosesc instrucțiuni atomice atunci când generează cod, deoarece, în primul rând, operațiunile atomice necesită mult mai multe resurse decât cele obișnuite și, în al doilea rând, compilatorul nu are informații despre când ar trebui accesul la date. să fie efectuată atomic (deoarece nici modificatorul volatil pentru o variabilă în C/C++ nu înseamnă o nevoie reală de a folosi operații atomice). Dacă este necesar, programatorul poate folosi instrucțiuni atomice în unul dintre următoarele moduri:

  1. inserați instrucțiuni atomice în cod folosind asamblatorul furnizat de compilator , de exemplu, GCC Inline Assembly al compilatorului gcc ;
  2. utilizați funcții furnizate de compilator care apelează instrucțiuni atomice, cum ar fi funcțiile familiilor __builtin_ sau __sync_ ale compilatorului gcc ;
  3. utilizați funcții furnizate de biblioteci care apelează instrucțiuni atomice, de exemplu, funcții ale bibliotecii Glib ;
  4. utilizați limbaje de programare care acceptă atomicitate, cum ar fi limbaje standard C11 și C++14 care acceptă tipurile _Atomic și atomic și funcțiile familiei atomic_ [5] .

Vezi și

Note

  1. CMPXCHG - Comparați și schimbați Arhivat 2 noiembrie 2012 la Wayback Machine .
  2. CMPXCHG8B - Comparați și schimbați 8 octeți Arhivat la 30 noiembrie 2012 la Wayback Machine .
  3. http://faydoc.tripod.com/cpu/xchg.htm Arhivat 20 noiembrie 2012 la Wayback Machine „Dacă se face referire la un operand de memorie, protocolul de blocare al procesorului este implementat automat pe durata operațiunii de schimb, indiferent de prezența sau absența prefixului LOCK sau a valorii IOPL.”
  4. Operații atomice. Istoria problemei . Consultat la 12 noiembrie 2012. Arhivat din original pe 17 noiembrie 2012.
  5. Biblioteca de operațiuni atomice - cppreference.com . Consultat la 12 noiembrie 2012. Arhivat din original la 13 august 2015.

Link -uri