Operații atomice
Operațiunile atomice sunt operațiuni care sunt efectuate ca o singură unitate sau care nu sunt executate deloc. Atomicitatea operațiunilor are o importanță deosebită în computerele multiprocesoare (și în sistemele de operare multitasking), deoarece accesul la resursele nedistruite trebuie în mod necesar să fie atomic.
Operația atomică este deschisă influenței unui singur flux.
Atomicitatea poate fi hardware (atunci când continuitatea este furnizată de hardware) și software-ul, atunci când se folosesc mijloace speciale de interacțiune inter-programată a mutexului. semaphore). În centrul său, instrumentele software pentru asigurarea atomicității sunt două faze: blocarea resursei și efectuarea operației în sine. Blocarea este o operație atomică care este fie reușită, fie returnează un mesaj ocupat.
Adesea, o operație atomică este o instrucțiune de asamblare, dar nu neapărat. De asemenea, mai important, nu fiecare instrucțiune de asamblare este atomică.
Instrucțiuni de asamblare și atomicitate
Operații care pot fi întotdeauna considerate atomice:
Operații care nu sunt atomice:
Instrucțiuni atomice x86
- CMPXCHG / CMPXCHG8B / CMPXCHG16B - comanda atomică de bază x86 comparație și schimb. Efectuează o comparație atomică a variabilei cu valoarea specificată și cu transferul, în funcție de această comparație. Este baza pentru implementarea tuturor algoritmilor care nu blochează. Acesta este adesea folosit în implementarea spinlocks și RWLocks, precum și aproape toate elementele de sincronizare la nivel înalt, cum ar fi Semaphores, Mutexes, Events etc., ca o implementare internă
- XCHG - operațiunea de schimb între memorie și registru se face atomic pe procesoarele x86. Acesta este adesea folosit în punerea în aplicare a spinlocks
În plus, multe comenzi ale tipului Read-Modify-Write pot fi făcute artificial folosind prefixul LOCK (opcode 0xF0):
- Adăugați și scădeți comenzile ADD / ADC / SUB / SBB în cazul în care memoria operand-receptor
- Instrumente de incrementare / degradare INC / DEC
- Comenzi logice AND / OR / XOR
- Comenzi NEG / NOT ONU-operand
- Operațiuni bit BTS / BTR / BTC
- Adaugarea si schimbarea operatiilor XADD
Instrucțiunile atomice și compilatorul
În primul rând, operațiile atomice sunt de multe ori mai scumpe decât cele normale și, în al doilea rând, compilatorul nu are informații când accesul ar trebui făcut prin instrucțiuni atomice (deoarece chiar și o variabilă volatilă nu înseamnă o reală nevoia de operații atomice). Din acest motiv, atunci când acest lucru este vital, programatorul folosește una din următoarele abordări:
- Asamblare inserare a instrucțiunii atomice corespunzătoare
- Folosind __builtin_ - extensii de compilatoare
- Utilizați învelișul "la nivel înalt" al unei biblioteci