atomi művelet
Az atomi (a görög atom Atomos - oszthatatlan.) Kezelés - amely művelet van végrehajtva, teljes egészében vagy nem végzett egyáltalán; amely művelet végezhető részben vagy részben megvalósított.
Ez a cikk ismerteti a legegyszerűbb az atomi műveleteket (növekmény, olvasni, írni, és m. P.), Bár a kifejezés utalhat egy magasabb szintű műveletek, mint például egy sor lekérdezések az adatbázis egyetlen tranzakció keretében.
Atomic műveleteket használnak többprocesszoros számítógépek és többfeladatos operációs rendszerek eléréséhez több folyamatok és / vagy több folyam egy folyamat a megosztott erőforrások között. Egy atomi művelet végrehajtásakor csak egy szál.
Az atomi műveleteket lehet biztosítani a hardver (hardware) és szoftver (programkód). Az első esetben használt speciális gépi utasításokat. atomicitás teljesítmény garantálja a berendezés. A második esetben, speciális szoftver szinkronizálást. amelyen keresztül a zár a megosztott erőforrás; után a zár műveletet végzünk el kell végezni atomically. Blokkolás egy atomi művelet, amely vagy megadja az erőforrás használatra a patak mellett. vagy tájékoztatja az áramlás, hogy az erőforrás már használják egy további cérnával vagy eljárás (foglalt).
Szerelési útmutató és atomos szerkesztése
Gép utasításokat mindig mondható atomi:
Gépi utasítások, amelyek nem atomi:
Atomic processzorok x86 utasítások szerkesztése
Atomic x86 architektúra processzorok utasításokat:
- CMPXCHG, CMPXCHG8B, CMPXCHG16B - atomi utasításokat x86 processzorok. teljesítő összehasonlítás és csere. Ha a LOCK előtagot atomically le a változó értékét a megadott értéket, és attól függően, az összehasonlítás eredménye, írja be a változó megadott értéket, vagy nem csinál semmit. Az végrehajtásának alapját lock-mentes algoritmusok. Gyakran használják a végrehajtása spinlocks. RWLock'ov és gyakorlatilag minden magasabb szintű szinkronizálás elemek, mint például a szemaforok, mutexes, események, stb.;
- Xchg - üzemeltetés adatok olvasására nyilvántartásban vagy a memória, az adatok írása és egy regiszter vagy memória. On x86 processzorok végzik atomosan. Gyakran használják a végrehajtása spinlocks.
Ezen kívül sok fajta gépi utasításokat „read-modify-write” végzett atomi jelenlétében az előtag LOCK (opkódot 0xF0), mint például a következők:
LOCK prefix hatására a memória hozzáférési zár idejére utasítást. Zár lehet osztani, hogy a memória szélesebb, mint a hossza a operandus, például a hossza a gyorsítótár-sor.
Atomic utasításokat RISC processzor szerkesztése
A jellemzője a processzor architektúra RISC semmiféle utasítást „read-modify-write”. A RISC processzorarchitektúrát DEC Alpha. PowerPC. MIPS és ARM (ARMv6 felett) mechanizmus támasztja blokkoló kizárólagos hozzáférést a memóriát. Atomic műveleteket hajtják végre egy pár LL és SC exkluzív írható-olvasható utasítások az alábbiak szerint:
- loading jelölt (LL - terhelés kapcsolódik);
- Adatok módosítása;
- próbál írni (SC - tárolja feltételes).
Az első utasítás (LL) terhelések adatot a memóriából egy regiszterbe, és megjelöli a cellát egy cellában kizárólagos hozzáférést. Következő elő a szükséges változtatásokat az adatok nyilvántartásba. Írja adatok nyilvántartásból memória (SC) csak akkor kerül végrehajtásra, ha az érték a memória cella nem változott. Ha az érték megváltozott, a három művelet (LL, adatok módosítása és SC) meg kell ismételni.
Atomic utasításokat és fordítóprogramok szerkesztése
Magas szintű nyelvi fordító. mint általában, nem használják közben kódgenerálást atomi utasításokat, mert egyrészt az atomi műveletek sokkal több erőforrást igényel, mint általában, másrészt a fordító nincs információ arról, hogy mikor az adatokhoz való hozzáférést kell végezni atomi (mivel még illékony módosítót egy változó C / C ++ nyelven nem jelent valós igény használni atomi műveletek). Ha szükséges, a programozó használhatja atomi utasításokat a következő módon:
- helyezze atomi utasításokat kódot a fordító által biztosított szerelő. így például, GCC Soros Assembly GCC fordító;
- használja a szolgáltatásainak a fordítóprogram, ami atomi utasításokat, például a családi funkciók __builtin_ vagy __sync_ gcc fordító;
- funkciók használata által biztosított könyvtárak és ami atomi utasításokat, például Glib könyvtári funkciókat;
- használja programozási nyelvek, amelyek támogatják atomicitás például nyelv C11 szabvány és a C ++ 14. Támogatott _Atomic és atom és funkciója a család atomic_.