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, jotka eivät ole atomisia:

Atomic-ohjeet x86-prosessoreille

Atomic-ohjeet x86 -arkkitehtuuriprosessoreille :

Lisäksi monet luku-muokkaa-kirjoita konekäskyt suoritetaan atomisesti, kun niiden eteen on liitetty LOCK [4] ( operaatiokoodi 0xF0 ), kuten seuraavat:

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:

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:

  1. lisää atomikäskyt koodiin käyttämällä kääntäjän toimittamaa kokoonpanoohjelmaa , esimerkiksi gcc - kääntäjän GCC Inline Assemblya ;
  2. käytä kääntäjän toimittamia toimintoja, jotka kutsuvat atomikäskyjä, kuten gcc -kääntäjän __builtin_- tai __sync_-perheiden toimintoja ;
  3. käyttää kirjastojen toimittamia toimintoja, jotka kutsuvat atomikäskyjä, esimerkiksi Glib- kirjaston toimintoja ;
  4. 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

  1. CMPXCHG - Vertaa ja vaihda Arkistoitu 2. marraskuuta 2012 Wayback Machinessa .
  2. CMPXCHG8B - Vertaa ja vaihda 8 tavua Arkistoitu 30. marraskuuta 2012 Wayback Machinessa .
  3. 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."
  4. Atomioperaatiot. Ongelman historia . Haettu 12. marraskuuta 2012. Arkistoitu alkuperäisestä 17. marraskuuta 2012.
  5. Atomic Operations library - cppreference.com . Haettu 12. marraskuuta 2012. Arkistoitu alkuperäisestä 13. elokuuta 2015.

Linkit