Laskuharjoitus
Rinnakkaisohjelmointi, LH 5
- Tee Aterioivien filosofien -ongelman ratkaisu suojatuilla objekteilla (protected objects)
- Ratkaise edellisen harjoituksen Yksisuuntainen silta tehtävä monitorilla. Jos haluat, voi kokeilla algoritmejasi BACIssa, sijoittamalla ne silta-simulaattorin ratkaisurunkoon. (Tarkkaile simulointiaikana yhteisten muuttujien west_bound ja east_bound arvoja ja katso, että animoidulla "sillalla" on sopivasti autoja. Virittele parametreja sopivasti tarvittaessa.)
Toimiihan algoritmisi oikein ainakin seuraavissa eritystapauksissa:
- Ensimmäinen auto tulee yksin suuntaan A tai B.
- Sillalla 5 autoa suuntaan A ja paikalle tulee uusi auto suuntaan A tai B.
- Sillalla on 4 autoa suuntaan A, uusi auto tulee suuntaan B ja sitten heti perään toinen uusi auto tulee suuntaan A.
- Sillalla on autoja, jotka poistuvat jättäen sillan tyhjäksi. Toiseen suuntaa oli odottamassa autoja.
- Sillalla on autoja, jotka poistuvat jättäen sillan tyhjäksi. Uusi auto tulee suuntaan A tai suuntaan B.
- Tehtävät 8.8, 8.9 ja 8.10 oppikirjasta.
- Tehtävät 10.2 (ks. Alg. 10.2) ja 10.11 (ks. Alg. 10.3) oppikirjasta.
- [2 htp] Lue artikkeli Real-world Concurrency (Bryan Cantrill, Jeff Bonwick, ACM Queue vol. 6, no. 5 - September 2008, ACM html, local pdf)
ja pohdi seuraavia kysymyksiä artikkelin perusteella.
- Mitä realistisia vaihtoehtoja nykyisten sovellusten nopeuttamiseen on monisäikeisen rinnakkaisohjelmoinnin lisäksi?
- Mikä merkitys on kuumilla ja kylmillä koodin suorituspoluilla (hot and cold paths)?
- Miksi luku- ja kirjoituslukkojen käyttö olekaan aina hyvä asia? Mikä on rekursiivinen luku-lukko ja mikä ongelma siihen liittyy?
- Mitä hyötyä on CPU-sidonnaisten lukkojen käytöstä?
- Mitä tarkoittaa käsite prioriteetin perintä (priority inheritance) ja miksi se onnistuu helpommin busy-wait mutex-lukkojen kuin semaforien kanssa?
- Miksi lukkojen järjestys (lock ordering) on tärkeä ja mikä ongelma on sen toteuttamisessa?