Atomisuus (ohjelmointi)

Wikipediasta
Siirry navigaatioon Siirry hakuun

Atomisuus (linearisointi) on tietotekniikassa eheystila.[1] Atomisuus ohjelmointikielissä tarkoittaa muuttujaa tai arvoa, joka ei ole pilkottavissa. Yksittäinen numeroarvo on atominen kun taas joukko numeroita ei ole.

Atomiset operaatiot eivät ole myöskään keskeytettäviä.[2]

Käsitteellä on merkitys esimerkiksi rinnakkaisuuden käsittelyssä ja operaatioiden synkronisaatiossa: kirjallisuudessa termi "atomisuus" on toisinaan rajoitettu koskemaan rekistereitä, mutta sitä voidaan laajentaa rinnakkain käsiteltäviin objekteihin.[1]

Eräät ohjelmointikielet määrittelevät atomisia tietotyyppejä ja toimintoja niiden käsittelyyn kuten C99 ja C++11 standardiversiot.

Tyypillisesti tietokoneen suoritin tai väylä voi siirtää tietoa pienissä erissä, jolloin useamman tavun kattava muuttuja ei ole täysin valmis. Esimerkiksi kahden tavun kokoisessa muuttujassa ensimmäinen tavu voi olla päivitetty uudempaan ja toinen tavu on vielä sen vanha arvo. Mikäli siirron synkronointia ei ole käytetty oikein rinnakkainen säie tai toinen suoritin voi lukea virheellisen arvon kun kirjoitus on vielä kesken. Myös välimuistin rakenne voi vaikuttaa miten synkronointi tehdään jotta eri suorittimilla on yhtenäinen arvo.

Esimerkki epäatomisesta toiminnosta on 64-bittisen kokonaisluvun käsittely 32-bittisellä suorittimella, joka käyttää useita konekielisiä komentoja toiminnon suorittamiseen.[3]

Suorittimissa voi olla atomisuutta tukevia käskyjä, joilla ohjelmistotason synkronointiprimitiivit kuten semaforit voidaan myös toteuttaa. Suorittimissa on arkkitehtuurista riippuen eri menetelmiä synkronisointitukeen:[4]

  • test and set
  • compare-and-swap (CAS)
  • load-link / store-conditional (LL/SC)
  • fetch-and-add (FAA)

Laitteistotason protokollat välimuistin yhtenäisyydelle voivat lisätä oman tukensa atomisuuden toteuttamiselle.

Rinnakkaisohjelmoinnissa toiminnoista käytetään termejä lineaarisaatio, jakamaton, keskeyttämätön.

Edut ja haitat

[muokkaa | muokkaa wikitekstiä]

Atomisien operaatioiden käyttö perinteisten poissulkemisen (mutex) ja lukituksen sijaan voi antaa merkittävän parannuksen suorituskyvylle.[5] Tehokkaiden lukottomien ratkaisujen toteuttaminen vaatii kuitenkin merkittävää panostusta kehitykseen.[6]

  1. a b Michel Raynal: Concurrent Programming: Algorithms, Principles, and Foundations, s. 112-113. Springer, 2013. doi:10.1007/978-3-642-32027-9 ISBN 978-3-642-32027-9 (englanniksi)
  2. Atomic operations QNX. Viitattu 2.3.2017.
  3. Atomic vs. Non-Atomic Operations preshing.com. Viitattu 9.2.2017.
  4. Levi Ego: Memory Synchronization Techniques (PDF) es.cs.uni-kl.de. Viitattu 14.4.2022. (englanniksi)
  5. Comparison: Lockless programming with atomics in C++ 11 vs. mutex and RW-locks arangodb.com. Viitattu 9.2.2017.
  6. The Danger of Atomic Operations abseil.io. 22.4.2014. Viitattu 14.4.2022. (englanniksi)