Atomisuus (ohjelmointi)

Atomisuus (linearisointi) on tietotekniikassa eheystila. 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ä.

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.

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.

Suorittimissa voi olla atomisuutta tukevia käskyjä, joilla ohjelmistotason synkronointiprimitiivit kuten semaforit voidaan myös toteuttaa. Suorittimissa on arkkitehtuurista riippuen eri menetelmiä synkronisointitukeen:
 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 käytetään toiminnoista käytetään termejä lineaarisaatio, jakamaton, keskeyttämätön.

Edut ja haitat 

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

Katso myös 
 Synkronointi (ohjelmointi)
 ACID
 Read-copy-update (RCU)

Lähteet 

Ohjelmointi