[9 p] Kriittinen alue (vaihe). Oletetaan,
että monisäikeisen ohjelman yhteisessä
muistissa olevien muuttujien X, Y ja Z
käyttöä halutaan suojata kriittisen vaiheen
avulla. Muuttujiin viitataan ohjelmassa kuudessa
kohtaa, koodinpätkissä A, B, C, D, E ja F:
A: X <- 78 B: some1 <- X C: Y <- 87 D: Y <- Y+1 E: some4 <- X F: some5 <- Y
Y <- 49 some2 <- Y Y <- 0
Z <- X+Y some3 <- Z
Kohdassa A muuttujien Y ja Z vanhat arvot eivät saa
näkyä muille sen jälkeen kun X on saanut
uuden arvon ja Z'n uuden arvon tulee olla X'n ja Y'n uusien arvojen
summa. Kohdassa B muuttujien some1, some2 ja some3 uusien arvojen tulee olla
X'n, Y'n ja Z'n arvot koodinpätkän suorituksen
alkuhetkellä. Kohdassa F muuttujan Y vanha arvo ei saa olla saatavilla sen jälkeen kun se on kopioitu muuttujaan some5.
- [3 p] Mitkä näistä
(pseudo)koodinpätkistä (A, B, C, D ja E) tulee
suojata
kriittisenä alueena? Erityisesti, tarvitaanko kohtia
C tai D suojata, koska niissä muutetaan ainoastaan yhden muuttujan
arvo? Entä kohta E, jossa vain luetaan yhden muuttujan arvo?
Entä kohta F, jossa luetaan yhden muuttujan vanha arvo ja
nollataan se sitten?
- [2 p] Anna skenaario, jossa kriittisen alueen (A, B, ...) suojauksen puuttuminen aiheuttaa virhetilanteen. Selitä, mikä virhe syntyy.
- [2 p] Näytä (pseudokooditasolla), kuinka
kriittiset vaiheet
(A, B, ...) suojataan busy-wait -loopissa (esim test-and-set
-käskyn avulla). Millaisessa
laskentaympäristössä tämä
olisi järkevä ratkaisu? Miksi?
- [2 p] Näytä (pseudokooditasolla), kuinka kriittiset vaiheet (A, B, ...) suojataan monitorin avulla. Millaisessa laskentaympäristössä tämä olisi järkevä ratkaisu? Miksi?