Atomitoiminta
Atomioperaatio ( kreikaksi άτομος - jakamaton) - operaatio , joka joko suoritetaan kokonaan tai ei suoriteta ollenkaan; toiminto, jota ei voida osittain suorittaa tai osittain jättää suorittamatta.
Tässä artikkelissa kuvataan yksinkertaisimmat atomioperaatiot (luku, kirjoittaminen jne.), vaikka termi voi viitata korkeamman tason operaatioihin, kuten esimerkiksi sarjaan kyselyitä DBMS :ään yhden tapahtuman sisällä .
Atomioperaatioita käytetään moniprosessoritietokoneissa ja moniajokäyttöjärjestelmissä tarjoamaan pääsy useille prosesseille ja/tai useille saman prosessin säikeille niiden välillä jaettuihin resursseihin. Atomioperaatio suoritetaan vain yhdellä säikeellä .
Luokitus
Toiminnan atomiteetti voidaan tarjota laitteistolla (hardware) ja ohjelmistolla (ohjelmakoodi). Ensimmäisessä tapauksessa käytetään erityisiä koneohjeita , joiden atomiteetin takaa laitteisto. Toisessa tapauksessa käytetään erityisiä synkronointiohjelmistotyökaluja , joiden avulla jaettu resurssi lukitaan ; lukituksen jälkeen suoritetaan toiminto, joka on tehtävä atomisesti. Lukitus on ydintoiminto, joka joko myöntää säikeelle resurssin tai kertoo säikeelle, että resurssi on jo toisen säikeen tai prosessin käytössä (varattu).
Kokoamisohjeet ja atomiteetti
Koneohjeet, joiden suorittamista voidaan aina pitää atomina:
- koneohjeet tietojen lukemiseksi muistista kohdistetusta osoitteesta ja kirjoittamisesta yleiseen rekisteriin;
- koneohjeet tietojen lukemiseksi yleisrekisteristä ja sen kirjoittamiseksi muistiin kohdistettuun osoitteeseen;
- koneohjeet, jotka on erityisesti suunniteltu toimimaan atomisesti, joita kutsutaan yleisesti atomeiksi ohjeiksi.
Koneohjeet, jotka eivät ole atomisia:
- konekäskyt tietojen lukemiseen/kirjoittamiseen kohdistamattomassa osoitteessa (suorittamalla yhden näistä käskyistä prosessori pakotetaan käyttämään kahta muistisolua. Sillä hetkellä, kun prosessori käyttää yhtä solua, toinen prosessori voi vaihtaa toista solua);
- kaikki koneen ohjeet muodossa " lue-muokkaa-kirjoita " (yhden tällaisen käskyn suorittaminen rajoittuu tietojen lukemiseen muistista, tietojen vaihtamiseen ALU :hun ja tietojen kirjoittamiseen muistiin. Muistista lukemisen jälkeen muistin sisältö voi muuttua);
- merkkijonokoneen ohjeet x86-prosessoreille ;
- push ja pop koneen ohjeet x86-prosessoreille;
- konekäskyt, jotka toimivat erityisillä ohjausrekistereillä (tällaisia käskyjä voidaan suorittaa useissa prosessorijaksoissa ja ne voivat tuottaa kymmeniä tai satoja muistihakuja, niitä käytetään vain järjestelmäohjelmistoissa ) .
Atomic-ohjeet x86-prosessoreille
Atomic-ohjeet x86 -arkkitehtuuriprosessoreille :
- CMPXCHG, CMPXCHG8B, CMPXCHG16B on x86-prosessorien tärkein atomiohje, joka suorittaa vertailun ja vaihdon . Käytettäessä LOCK [1] [2] etuliitettä , se vertaa atomisesti muuttujan arvoa määritettyyn arvoon ja vertailun tuloksesta riippuen joko asettaa määritetyn arvon muuttujalle tai ei tee mitään. Se on perusta kaikkien ei-esto-algoritmien toteuttamiselle, joita käytetään usein spinlockien , RWLockien ja lähes kaikkien korkean tason synkronointielementtien, kuten semaforien, mutexien, tapahtumien jne., toteutuksessa;
- XCHG on operaatio tietojen vaihtamiseksi rekisterin ja muistisolun tai kahden rekisterin välillä. Tämän operaation atomiteetilla on merkitystä, kun käskyoperandi on muistisolu. x86 - prosessoreissa se suoritetaan atomisesti jopa ilman LOCK [3] -etuliitettä (tästä syystä tämän ohjeen käyttämistä vain rekisterin ja muistipaikan arvojen vaihtamiseen tulee välttää, tämä aiheuttaa tarpeettomia ja erittäin merkittäviä viiveitä koodin suoritus). Käytetään usein spinlockien toteutuksessa .
Lisäksi monet luku-muokkaa-kirjoita konekäskyt suoritetaan atomisesti, kun niiden eteen on liitetty LOCK [4] ( operaatiokoodi 0xF0 ), kuten seuraavat:
- yhteen- ja vähennyskomennot ADD, ADC, SUB ja SBB, jos kohdeoperandi on muistisolun osoite;
- lisäys- ja vähennyskomennot INC ja DEC;
- loogiset komennot AND, OR ja XOR;
- yhden operandin käskyt NEG ja NOT;
- bittitoiminnot BTS, BTR ja BTC;
- lisäys- ja vaihtooperaatio XADD.
LOCK-etuliite lukitsee muistin käytön käskyn ajaksi. Lukko voi ulottua operandin pituutta leveämmälle muistialueelle, kuten välimuistirivin pituudelle .
Atomic-ohjeet RISC-prosessoreissa
RISC -suoritinarkkitehtuurien ominaisuus on luku-muokkaa-kirjoituskäskyjen puuttuminen . DEC Alpha- , PowerPC- , MIPS- ja ARM- (ARMv6 ja vanhemmat) RISC -prosessorit tukevat estämätöntä yksinomaista muistin käyttöä. Atomioperaatiot toteutetaan käyttämällä eksklusiivisia luku-kirjoituskäskyjä LL ja SC seuraavasti:
- lastaus merkillä (LL - kuorma linkitetty);
- tietojen muutos;
- kirjoitusyritys (SC - tallenna ehdollinen).
Ensimmäinen käsky (LL) lataa tiedot muistipaikasta rekisteriin ja merkitsee sijainnin eksklusiivisen pääsyn sijainniksi. Seuraavaksi tehdään tarvittavat tietomuutokset rekisteriin. Tietojen kirjoittaminen rekisteristä muistiin (SC) suoritetaan vain, jos muistisolun arvo ei ole muuttunut. Jos arvo on muuttunut, kolme toimintoa (LL, data change ja SC) on toistettava.
Atomic-ohjeet ja kääntäjät
Korkean tason kielten kääntäjät eivät pääsääntöisesti käytä atomikäskyjä luodessaan koodia, koska ensinnäkin atomioperaatiot ovat moninkertaisesti resurssiintensiivisempiä kuin tavalliset, ja toiseksi kääntäjällä ei ole tietoa siitä, milloin tietoihin pitäisi päästä käsiksi. voidaan suorittaa atomisesti (koska edes C/C++:n muuttujan haihtuva modifikaattori ei tarkoita todellista tarvetta käyttää atomioperaatioita). Ohjelmoija voi tarvittaessa käyttää atomikäskyjä jollakin seuraavista tavoista:
- lisää atomikäskyt koodiin käyttämällä kääntäjän toimittamaa kokoonpanoohjelmaa , esimerkiksi gcc - kääntäjän GCC Inline Assemblya ;
- käytä kääntäjän toimittamia toimintoja, jotka kutsuvat atomikäskyjä, kuten gcc -kääntäjän __builtin_- tai __sync_-perheiden toimintoja ;
- käyttää kirjastojen toimittamia toimintoja, jotka kutsuvat atomikäskyjä, esimerkiksi Glib- kirjaston toimintoja ;
- käytä atomiteettia tukevia ohjelmointikieliä, kuten C11- ja C++14 -standardikieliä , jotka tukevat _Atomic- ja atomic-tyyppejä sekä atomic_-perheen toimintoja [5] .
Katso myös
Muistiinpanot
- ↑ CMPXCHG - Vertaa ja vaihda Arkistoitu 2. marraskuuta 2012 Wayback Machinessa .
- ↑ CMPXCHG8B - Vertaa ja vaihda 8 tavua Arkistoitu 30. marraskuuta 2012 Wayback Machinessa .
- ↑ http://faydoc.tripod.com/cpu/xchg.htm Arkistoitu 20. marraskuuta 2012 Wayback Machinessa "Jos muistioperandiin viitataan, prosessorin lukitusprotokolla otetaan automaattisesti käyttöön vaihtotoiminnan ajaksi, riippumatta LOCK-etuliitteen tai IOPL:n arvon olemassaolo tai puuttuminen."
- ↑ Atomioperaatiot. Ongelman historia . Haettu 12. marraskuuta 2012. Arkistoitu alkuperäisestä 17. marraskuuta 2012. (määrätön)
- ↑ Atomic Operations library - cppreference.com . Haettu 12. marraskuuta 2012. Arkistoitu alkuperäisestä 13. elokuuta 2015. (määrätön)
Linkit