Kriittinen alue

Kriittinen alue (engl. critical section) on sellainen osa tietokoneohjelmaa, joka käsittelee jonkin toisen prosessin tai säikeen kanssa yhteistä muistipaikkaa tai muuta resurssia.[1]

Jos vähintään kaksi eri prosessia tai säiettä muuttaa samaa muistipaikkaa yhtä aikaa, päivityksen tulos on usein väärä. Siksi on tärkeää tunnistaa tällaiset ohjelman osat eli kriittiset alueet ja tarvittaessa suojata ne poissulkemisen (engl. mutual exclusion) avulla. Ongelma esiintyy vain silloin, jos muuttujaa päivitetään, sillä monenkaan prosessin tekemä yhtäaikainen lukeminen ei aiheuta virhetoimintoja.

Kriittisen alueen ei tarvitse olla monimutkainen. Muuttujan arvon kasvattaminen yhdellä (ohjelmointikielellä siis a := a+1) on ilman poissulkemista altis ongelmille. Jos kuvittelemme, että meillä on kaksi suoritinta, jotka ajavat a:ta kasvattavan ohjelmakoodin täsmälleen yhtä aikaa, huomaamme, että päivitys ei toimi oikein. Jos a:n arvo on alussa vaikkapa 1, pitäisi kahden lauseen a := a+1 jälkeen arvon olla 3, mutta jos nämä lauseet suoritetaan täsmälleen yhtä aikaa, kumpikin suoritin lukee a:n arvoksi yksi, kasvattaa sitä sen jälkeen yhdellä ja tallettaa a:ksi kaksi.

Ongelmaan ei tarvita kahta suoritinta, sillä jos prosessia tai säiettä vaihdetaan kesken kriittisen alueen suorituksen, voidaan päätyä samaan tulokseen. Käyttöjärjestelmän ytimessä sama ongelma esiintyy myös siinä muodossa, että ydin käsittelee jotain muuttujaa, jota jokin keskeytyspalvelu päivittää.

Myös muut resurssit kuin muisti on altis ongelmalle. Esimerkiksi jos kaksi prosessia pääsee yhtä aikaa ohjaamaan tulostinta, on tuloste käyttökelvoton.

LähteetMuokkaa

  1. Ilkka Haikala ja Hannu-Matti Järvinen: Käyttöjärjestelmät (luku 3). Talentum 2003. ISBN 951-762-837-4