Operația atomică (atom din greaca atomică - indivizibilă) este o operație care este fie efectuată în întregime, fie nu este efectuată deloc; o operație care nu poate fi finalizată parțial și parțial nerealizată.
Acest articol descrie cele mai simple operații atomice (increment, citire, scriere și m. P.), Deși termenul se poate referi la o operațiuni de nivel superior, cum ar fi, de exemplu, o serie de interogări la baza de date într-o singură tranzacție.
operații atomice sunt utilizate în computere multiprocesor și sisteme de operare multi-tasking pentru a avea acces la mai multe procese și / sau mai multe fluxuri de la un proces la resurse partajate între ele. O operație atomică este efectuată de către un singur fir.
Atomicitatea operațiilor poate fi asigurată de hardware (hardware) și software (cod de software). În primul caz, se utilizează instrucțiuni speciale de mașină. Atomicitatea performanței este garantată de echipament. În cel de-al doilea caz, se folosesc instrumente speciale de sincronizare software. cu ajutorul căruia este blocată resursa partajată; După blocare, are loc operația pe care doriți să o efectuați în mod atomic. O blocare este o operație atomică care oferă fie o resursă pentru a folosi fluxul. sau spune firul că resursa este deja utilizată de un alt fir sau proces (ocupat).
Instrucțiuni de asamblare și atomalitate
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 procesoarele x86 Editare
Instrucțiuni atomice pentru procesoarele x86:
- CMPXCHG, CMPXCHG8B, CMPXCHG16B este instrucțiunea atomică de bază pentru procesoarele x86. efectuarea unei comparații și schimburi. Atunci când se utilizează cu prefixul LOCK, se compară atomic valoarea variabilei cu valoarea specificată și, în funcție de rezultatul comparației, se scrie variabilei valoarea specificată sau nu se face nimic. Este baza pentru implementarea tuturor algoritmilor care nu blochează. adesea folosite în implementarea spinlock-ului. RWLock'ov și aproape toate elementele de sincronizare la nivel înalt, cum ar fi semaphorele, mutexurile, evenimentele etc .;
- XCHG este o operație pentru citirea datelor dintr-un registru sau memorie și scrierea datelor către un registru sau o memorie. Pe procesoarele x86 se execută atomic. Acesta este adesea folosit în punerea în aplicare a spinlocks.
În plus, multe tipuri de instrucțiuni mașină „citire-modificare-scriere“ realizată atomically în prezența BLOCAT prefix (opcode 0xF0), cum ar fi următoarele:
Prefixul LOCK face ca accesul la memorie să fie blocat pe durata executării instrucțiunilor. Blocarea se poate extinde până la zona de memorie mai mare decât lungimea operandului, de exemplu lungimea liniei de cache.
Instrucțiuni atomice ale procesoarelor RISC Editați
Particularitatea procesoarelor de arhitectură RISC este absența instrucțiunilor formularului "read-modify-write". În procesoarele RISC cu arhitecturi DEC Alpha. PowerPC. MIPS și ARM (ARMv6 și ulterior) suportă mecanismul de acces exclusiv pentru memorie fără blocare. Operațiile atomice sunt implementate folosind o pereche de instrucțiuni exclusive de citire și scriere LL și SC după cum urmează:
- Încărcați cu o marcă (LL - încărcare legată);
- schimbarea datelor;
- încercați să scrieți (SC - depozit condiționat).
Prima instrucțiune (LL) încarcă datele din locația de memorie în registru și marchează celula ca o celulă pentru acces exclusiv. Apoi se fac modificările necesare ale datelor din registru. Scrierea datelor din registru în memorie (SC) se efectuează numai dacă valoarea locației de memorie nu sa schimbat. Dacă valoarea sa schimbat, trebuie repetate trei operații (LL, modificarea datelor și SC).
Instrucțiuni atomice și compilatoare Editare
compilatoare de limbi străine la nivel înalt. de regulă, nu utilizați în timpul instrucțiunilor atomice de generare de cod, pentru că, în primul rând, operațiunile atomice este mult mai mult decât de obicei, și în al doilea rând, la compilatorul nu există nici o informație cu privire atunci când accesul la datele ar trebui să fie efectuate atomically mari consumatoare de resurse (din chiar modificator volatil la o variabilă în C / C ++ limbajul nu înseamnă o necesitate reală de a utiliza operații atomice). Dacă este necesar, programator poate folosi instrucțiuni atomice în următoarele moduri:
- introduceți instrucțiunile atomice în cod utilizând asamblarea furnizată de compilator. de exemplu, GCC Inline Assembly a compilatorului gcc;
- utilizați caracteristicile oferite de compilator și poate cauza instrucțiuni atomice, de exemplu, o familie de funcții __builtin_ sau __sync_ compilator gcc;
- utilizați funcțiile furnizate de biblioteci și solicitați instrucțiuni atomice, de exemplu, funcțiile bibliotecii Glib;
- folosiți limbi de programare care susțin atomicitatea, de exemplu, 14 limbi C11 și C ++. tipuri de sprijin _Atomic și atomic și funcții ale familiei atomice.