Rinnakkaisohjelmointi, LH 3
- Tarkastellaan Dekkerin algoritmia (Alg. 3.10, s. 60).
Algoritmin lopussa muuttujille turn ja wantp (tai wantq) annetaan uudet arvot.
Voisiko ne antaa päinvastaisessa järjestyksessä (lause p10 ennen lausetta p9)?
Todista johtopäätöksesi.
- Tehtävät 3.11 ja 3.12 oppikirjasta
- Tehtävä 4.1 oppikirjasta
- Tehtävät 5.1 ja 5.3 oppikirjasta.
- [2 htp] Ohjelma PlusMinus. Meillä on yhteisessä muistissa 6 muuttujaa: X1, X2, X3, X4, Ctrl ja Sum. Kaikkien alkuarvo on nolla. Meillä on kaksi laskentaprosessia, jotka suorittavat 50 kertaa loopin, jonka kriittinen vaihe on:
- Jos muuttujan Ctrl arvo on pariton, vähennä kustakin Xi'stä luku 1. Muutoin lisää niihin luku 2.
- Lopuksi lisää 1 muuttujaan Ctrl ja laske muuttujien Xi summa muuttujaan Sum.
Toteuta tämä BACI'lla, käyttäen synkronointiin ainoastaan (muita) yhteisiä muuttujia. Mahdolliset odotukset voi toteuttaa busy-wait -tyyppisinä looppeina: while (...) {};.
Lopulta BACI'n prosessien hallinta antaa vuoron myös muille prosesseille, eli odotus ei ole ikuista.- Tee ohjelmasta versio, jossa kriittisen vaiheen suojaus ei toimi. Miten tämä ilmenee?
- Tee ohjelmasta versio, jossa kriittisen vaiheen suojaus toimii oikein. Miten tiedät, että ohjelmasi toimii oikein? Perustele.
- Miten ohjelmasi muuttuisi, jos laskentaprosesseja olisikin 4 tai 10 kappaletta?
Huom: sinun ei tarvitse muokata BACI-toteutusta 4 tai 10 laskentaprosessille, vaikka toki saat sen halutessasi tehdä. - Olisiko hyödyllistä käyttää 10 laskentaprosessia? Miksi?
Mikä olisi suurin hyödyllinen laskentaprosessien määrä? Miksi?
Teemu Kerola