Atomműködés

Atomi ( görögül άτομος  - oszthatatlan) művelet  - olyan művelet, amelyet vagy teljesen végrehajtanak, vagy egyáltalán nem hajtanak végre; részben nem végrehajtható és részben nem végrehajtható művelet.

Ez a cikk a legegyszerűbb atomi műveleteket írja le (olvasás, írás stb.), bár ez a kifejezés magasabb szintű műveletekre is utalhat, mint például a DBMS -hez intézett lekérdezések sorozata egyetlen tranzakción belül .

Az atomi műveleteket többprocesszoros számítógépekben és többfeladatos operációs rendszerekben használják, hogy több folyamat és/vagy ugyanazon folyamat több szála számára biztosítsanak hozzáférést a közöttük megosztott erőforrásokhoz. Egy atomi műveletet csak egy szál hajt végre .

Osztályozás

A műveletek atomitását hardver (hardver) és szoftver (programkód) biztosíthatja. Az első esetben speciális gépi utasításokat használnak , amelyek atomitását a hardver garantálja. A második esetben speciális szinkronizáló szoftver eszközöket használnak , amelyek segítségével a megosztott erőforrást zárolják ; blokkolás után az atomosan végrehajtandó műveletet hajtják végre. A zárolás egy atomi művelet, amely vagy erőforrást ad egy szálnak , vagy közli a szálnak, hogy az erőforrást egy másik szál vagy folyamat már használja (elfoglalt).

Összeszerelési utasítások és atomitás

Gépi utasítások, amelyek végrehajtása mindig atominak tekinthető:

Nem atomi utasítások:

Atomic utasítások x86 processzorokhoz

Atomic utasítások x86 architektúrájú processzorokhoz :

Ezen kívül számos olvasási-módosítási-írási gépi utasítás atomszerűen hajtódik végre, ha előtagja LOCK [4] ( opcode 0xF0), például a következők:

A LOCK előtag zárolja a memóriahozzáférést az utasítás időtartamára. A zár kiterjedhet az operandus hosszánál szélesebb memóriaterületre, például egy gyorsítótár -sor hosszára .

Atomic utasítások RISC processzorokban

A RISC processzorarchitektúrák egyik jellemzője az olvasási-módosítási-írási utasítások hiánya . A DEC Alpha , PowerPC , MIPS és ARM (ARMv6 és régebbi) RISC processzorok támogatják a nem blokkoló, kizárólagos memóriahozzáférést. Az atomi műveletek egy pár exkluzív LL és SC olvasási-írási utasítással valósulnak meg a következők szerint:

Az első utasítás (LL) betölti az adatokat a memóriahelyről egy regiszterbe, és megjelöli a helyet a kizárólagos hozzáférés helyeként. Ezt követően megtörténik a szükséges adatmódosítások a nyilvántartásban. Az adatok a regiszterből a memóriába (SC) írása csak akkor történik meg, ha a memóriacella értéke nem változott. Ha az érték megváltozott, a három műveletet (LL, adatcsere és SC) meg kell ismételni.

Atomic utasítások és fordítók

A magas szintű nyelvek fordítói általában nem használnak atomi utasításokat a kód generálásakor, mert egyrészt az atomi műveletek sokszor erőforrásigényesebbek, mint a hagyományosak, másrészt a fordítónak nincs információja arról, hogy mikor kell hozzáférni az adatokhoz. atomosan kell végrehajtani (mert még a C/C++ változó illékony módosítója sem jelenti az atomi műveletek tényleges szükségességét). Ha szükséges, a programozó a következő módok egyikén használhatja az atomi utasításokat:

  1. szúrjon be atomi utasításokat a kódba a fordító által biztosított assembler segítségével , például a gcc fordító GCC Inline Assembly -jával ;
  2. használja a fordító által biztosított függvényeket, amelyek atomi utasításokat hívnak meg, például a gcc fordító __builtin_ vagy __sync_ családjának függvényeit ;
  3. használja a könyvtárak által biztosított függvényeket , amelyek atomi utasításokat hívnak, például a Glib könyvtár függvényeit ;
  4. használjon olyan programozási nyelveket, amelyek támogatják az atomitást, például a C11 és C++14 szabványnyelveket , amelyek támogatják az _Atomic és atomi típusokat, valamint az atomic_ család funkcióit [5] .

Lásd még

Jegyzetek

  1. CMPXCHG - Összehasonlítás és csere Archiválva : 2012. november 2. a Wayback Machine -nél .
  2. CMPXCHG8B - Hasonlítsa össze és cserélje ki 8 bájtot Archiválva : 2012. november 30. a Wayback Machine -nél .
  3. http://faydoc.tripod.com/cpu/xchg.htm Archiválva : 2012. november 20. a Wayback Machine -nél "Ha egy memória-operandra hivatkoznak, a processzor zárolási protokollja automatikusan megvalósul a csereművelet időtartama alatt, függetlenül a LOCK előtag vagy az IOPL értékének megléte vagy hiánya."
  4. Atomműveletek. A probléma története . Letöltve: 2012. november 12. Az eredetiből archiválva : 2012. november 17..
  5. Atomműveleti könyvtár - cppreference.com . Letöltve: 2012. november 12. Az eredetiből archiválva : 2015. augusztus 13..

Linkek