Rinnakkaisohjelmointi, S2006, LH 3
Nämä tehtävät käsitellään harjoituksissa viikolla 46, 13-17.11.2006.Huom: Kaikkien pitäisi olla nyt jo jossakin opintopiirissä. Jos ette vielä kuulu opintopiiriin, niin lähettäkää luennoitsijalle sähköpostia asiasta. Parittomat ryhmitellään sitten (liki satunnaisesti) opintopiireihin tämän viikon jälkeen. Jos päädytte opintopiiriin sähköpostin lähettämisen jälkeen, niin kertokaa asiasta, jotta teitä ei vahingossa ryhmäytetä uudelleen.
- 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ä 4.2 oppikirjasta
- [2 htp] 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 3 tai 10 kappaletta?
(Tätä ei tarvitse toteuttaa, mutta saa jos haluaa!)
Teemu Kerola 06.11.2006 16:35