Tavoite. Monitorit. Semafori perusmekanismi synkronointiin

Samankaltaiset tiedostot
Monitorit. Monitori Synkronointimenetelmiä Esimerkkejä. Andrews , Stallings 5.5

Monitorit. Tavoite. Monitori Synkronointimenetelmiä Esimerkkejä. Andrews , Stallings 5.5. Minimoi virhemahdollisuuksia

poissulkeminen ohjelmoijan vastuulla P():t ja V():t siellä, täällä ja tuolla - meniköhän oikein? Yksityiskohtia pois ohjelmoijalta kääntäjälle

Monitorit. Monitori Synkronointimenetelmiä Esimerkkejä

Tavoite. Monitorit. Semafori perusmekanismi synkronointiin. Hyötyjä:

Tavoite. Monitorit. Monitori Hoare Monitori. Minimoi virhemahdollisuuksia. Monitori Synkronointimenetelmiä Esimerkkejä

Ongelmakenttä. Rinnakkaisuuden tarve. Kommunikointiin tarvitaan. Ympäristö Suunnittelun yksinkertaistaminen Suorituskyky Luotettavuus

Ongelmakenttä. Yhteenvetoa. Ratkottava. Mekanismit. Lukkomuuttujat. Lukkomuuttujat, Spin Locks. Rinnakkaisuuden tarve. Kommunikointiin tarvitaan

Yhteenvetoa. Ongelmakenttä

Semaforit ja rinnakkaisuuden hallinta. Tuottajat ja kuluttajat. Lukijat ja kirjoittajat. Andrews 4.2, Rio 2004 / Auvo Häkkinen

Semaforit ja rinnakkaisuuden hallinta

Semaforit ja rinnakkaisuuden hallinta

Ongelmakenttä. Yhteenvetoa. Mekanismit. Ratkottava. Lukkomuuttujat, Spin Locks. Lukkomuuttujat. Rinnakkaisohjelmistot 2004 / Auvo Häkkinen 9-1

Semaforit ja rinnakkaisuuden hallinta. Tuottajat ja kuluttajat. Halkaistu binäärisemafori (Split binary semaphore) semaforit empty ja full

Käyttöjärjestelmät: poissulkeminen ja synkronointi

Jaana Diakite Projekti 1 JAVA-Monitorit 1(13) Rinnakkaisohjelmointi Anu Uusitalo

Rinnakkaisuus. parallel tietokoneissa rinnakkaisia laskentayksiköitä concurrent asioita tapahtuu yhtaikaa. TTY Ohjelmistotekniikka

OSA I: Yhteisten muuttujien käyttö Prosessit samassa koneessa. Sisältöä. Poissulkeminen. Halutut ominaisuudet 2-1. Rinnakkaiset, atomiset operaatiot

OSA II: Hajautettu ympäristö. Sisältö, osa II. Ei yhteistä muistia. Sanomanvälitys. Etäproseduurikutsu. Rendezvous. Rio 2004 / Auvo Häkkinen

Liite 1. Projektin tulokset (Semaforit Javassa) Jukka Hyvärinen Aleksanteri Aaltonen

OSA I: Yhteisten muuttujien käyttö. Prosessit samassa koneessa. Rio 2004 / Auvo Häkkinen 2-1

OSA I: Yhteisten muuttujien käyttö. Sisältöä. Prosessit samassa koneessa. Poissulkeminen ja synkronointi. Semaforit ja rinnakkaisuuden hallinta

5. Luento: Rinnakkaisuus ja reaaliaika. Tommi Mikkonen,

Oppimistavoitteet kurssilla Rinnakkaisohjelmointi

Palvelut. Sulautetut järjestelmät Luku 2 Sivu 1 (??) Sulautetut käyttöjärjestelmät

OSA I: Sisältöä. Atomisuus (atomic action) v Poissulkeminen ja synkronointi. Kriittinen (koodi)alue (critical section)

Rinnakkaisohjelmointi, Syksy 2006

Etäproseduurikutsu, Remote Procedure Call (RPC) Etäproseduurikutsu. Poissulkeminen moduulin sisällä?

Etäproseduurikutsu. Etäproseduurikutsu, Remote Procedure Call (RPC)

Etäproseduurikutsu. RPC Toteutus Virhesemantiikka. Andrews 8.1, 10.3, Stallings 13.3

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

Tutoriaaliläsnäoloista

Ohjelmoinnin peruskurssien laaja oppimäärä

useampi ns. avain (tai vertailuavain) esim. opiskelijaa kuvaavassa alkiossa vaikkapa opintopistemäärä tai opiskelijanumero

Rinnakkaisohjelmistot. Liisa Marttinen Tietojenkäsittelytieteen laitos Helsingin yliopisto Kevät 2004

OSA II: Hajautettu ympäristö. Ei yhteistä muistia. Rio 2004 / Auvo Häkkinen

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Semaforit Liisa Marttinen 2-1

alkuarvo P(S) public V(S) public jos kriittinen alue vapaa, lukitse se ja jatka eteenpäin jos kriittinen alue varattu, odota

OSA II: Hajautettu ympäristö. Sisältö, osa II. Sanomanvälitys. Käsitteistöä. Sanomanvälitys. Kommunikointi. Sanomanvälitys. Etäproseduurikutsu

Semaforit. Semaforit. semafori S S.arvo. alkuarvo P(S) S.joukko V(S)

Etäproseduurikutsu, Remote Procedure Call (RPC) Etäproseduurikutsu. Poissulkeminen moduulin sisällä?

2 Konekieli, aliohjelmat, keskeytykset

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Hajautettu ympäristö Ei yhteistä muistia Kommunikointi sanomien välityksellä

Hajautettu ympäristö Ei yhteistä muistia Kommunikointi sanomien välityksellä

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Javan semaforit. Joel Rybicki, Aleksi Nur mi, Jara Uitto. Helsingin yliopisto

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Ohjelmoinnin peruskurssien laaja oppimäärä

812315A Ohjelmiston rakentaminen. Asynkronisuus

815338A Ohjelmointikielten periaatteet

Monitorit -projekti Rinnakkaisohjelmointi

TT00AA Ohjelmoinnin jatko (TT10S1ECD)

Yleistä. Esimerkki. Yhden palvelimen jono. palvelin. saapuvat asiakkaat. poistuvat asiakkaat. odotushuone, jonotuspaikat

Luento 4 Aliohjelmien toteutus

1. Tarkastellaan seuraavaa stokastista Petri-verkkoa: p 2. p 1. lock write 1

Jakso 4 Aliohjelmien toteutus

TIES542 kevät 2009 Yhteismuistisamanaikaisuus

Muistutus aikatauluista

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön?

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

11. Javan toistorakenteet 11.1

RINNAKKAINEN OHJELMOINTI A,

A TIETORAKENTEET JA ALGORITMIT

Ohjelmoinnin perusteet Y Python

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

IT K 1 45 K ä yt t öj ä rj estelmät

Sisältö, osa II. Sanomanvälitys. Kanavat. Hajautettu ympäristö Ei yhteistä muistia Kommunikointi sanomien välityksellä.

12. Javan toistorakenteet 12.1

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin

Jakso 4 Aliohjelmien toteutus

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Sisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten

13. Loogiset operaatiot 13.1

16. Ohjelmoinnin tekniikkaa 16.1

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

18. Abstraktit tietotyypit 18.1

Tietojenkäsittelyn perusteet 2. Lisää käyttöjärjestelmistä

Sisältö. 2. Taulukot. Yleistä. Yleistä

16. Ohjelmoinnin tekniikkaa 16.1

11/20: Konepelti auki

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Sisältö. 22. Taulukot. Yleistä. Yleistä

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia?

Lukkiutuminen. Taustaa Aterioivat Filosofit Ennaltaehkäisy Havaitseminen Välttely. Andrews 4.3 Stallings (tai mikä tahansa KJ-kirja)

4. Luento: Prosessit ja säikeets. Tommi Mikkonen,

Lukkiutuminen. Taustaa

4-13. Ratkaisu 4: OK, mutta... vrt. 2. Ratkaisu 3: OK. Ratkaisu 5: OK? Nälkiintyminen?

Taustaa. Lukkiutuminen. Seuraukset. Määritelmiä Lukkiuma (deadlock) päättymätön odotus BLOCKED-tilassa. prosessi P. prosessi Q. pyydä A? OK.

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Jakso 4 Aliohjelmien toteutus

12. Javan toistorakenteet 12.1

Transkriptio:

Tavoite Monitorit Andrews 5.1-5.2, Stallings 5.5 Monitori Synkronointimenetelmiä Esimerkkejä Minimoi virhemahdollisuuksia poissulkeminen ohjelmoijan vastuulla P():t ja V():t siellä, täällä ja tuolla - meniköhän oikein? Yksityiskohtia pois ohjelmoijalta kääntäjälle mitä yhteisiä muuttujia prosesseilla mikä semafori liittyy mihinkin kriittiseen alueeseen missä kohdassa kriittiset alueet sijaitsevat ohjelmakoodissa Kääntäjä voisi tuottaa koodia, jossa yhteiskäytön automaattinen kontrollointi yhteisiä muuttujia käytetään vain kriittisen alueen sisällä kriittiselle alueelle siirrytään ja sieltä poistutaan oikein mutta saattaa rajoittaa rinnakkaisuutta 5-2 Semafori perusmekanismi synkronointiin voidaan systemaattisesti ratkaista synkronointiongelmia melko alhaisen tason mekanismi => helppo tehdä virheitä unohtaa jokin P- tai V-operaatio tehdä ylimääräisiä P- tai V-operaatioita käyttää väärää semaforia unohtaa suojata jokin kriittinen alue Globaaleja muuttujia Varmistuttava että kaikki osat yhdessä toimivat oikein samaa mekanismia käytetään sekä poissulkemiseen että ehtosynkronointiin Kunkin P- ja V-operaation tarkoitus? Semaphores are like goto's and pointers: mistake prone, work okay but lack structure and ``discipline''. a disastrous typo: V(S); criticalsection(); V(S) leads to deadlock: P(S); criticalsection(); P(S) can lead to deadlock: P1: P(Q); P(S);... V(S); V(Q); P2: P(S); P(Q);... V(Q); V(S); 5-3 5-4 Monitori Monitori Hoare 1974 Kapseloitu data + sitä käsittelevät operaatiot abstraktit objektit ja julkiset metodit Vain metodeilla voi käsitellä dataa Kaikki yhteiset, pysyvät muuttujat monitorin sisällä Tarjoaa automaattisesti poissulkemisen vain yksi monitorin aliohjelma kerrallaan aktiivinen muut prosessit voivat olla odottamassa - joko pääsyä monitoriin tai monitorin ehtomuuttujassa kääntäjä! Aktiivinen prosessi - passiivinen monitori Prosessi kutsuu monitorin proseduuria 5-5 5-6 1

Hyötyjä: Kutsuvan prosessin ei tarvitse välittää siitä, kuinka monitorin aliohjelmat (proseduurit) on toteutettu. Monitorin toteuttajan ei tarvitse välittää siitä, missä ja miten sen proseduureja kutsutaan. => voidaan toteuttaa erikseen => rinnakkaisten ohjelmien tekeminen tulee helpommaksi, samoin niiden ymmärtäminen. Toteutus eri ohjelmointikielissä erilaiset määrittelyt Osa ohjelmointikieltä => kääntäjä osaa generoida monitorin toteutuksen koodin koodin poissulkemisen toteuttaminen: ohjelmointikielessä, kirjaston avulla tai käyttöjärjestelmässä yhden prosessorin koneessa keskeytykset kieltämällä monen prosessorin koneessa lukoilla ja keskeytykset kieltämällä 5-7 5-8 Esittely (Andrewsin kirjassa ja kurssilla käytetty) monitor Mname { pysyvien muuttujien määrittely proseduurit alustuslauseet Monitori staattinen olio Prosessi kutsuu monitorin proseduureja Monitorin muuttujien arvot pysyvät niin kauan kuin monitori on olemassa (permanent) Kutsu call Mname.opname(arguments) (Mname voidaan jättää pois, jos opname on yksikäsitteinen) Monitori on abstraktin datatyypin ilmentymä => Vain proseduurien nimet (opname) näkyvät monitorin (mname) ulkopuolelle Monitorissa ei voi viitata monitorin ulkopuolisiin muuttujiin, vain monitorissa määriteltyihin ja parametrina (arguments) saatuihin Monitorin pysyvät muuttujat alustetaan ennen kuin yhtäkään sen proseduuria kutsutaan eli heti monitorin luomisen yhteydessä suoritetaan alustuslauseet 5-9 5-10 Prosessien synkronointi monitorilla poissulkeminen (mutual exclusion) implisiittistä vain yksi prosessi voi olla aktiivisena monitorissa eli suorittamassa jotain monitorin proseduuria ei useaa prosessia suorittamassa samaa proseduuria ei useaa prosessia suorittamassa eri proseduureja ohjelmoijan ei siis tarvitse huolehtia tästä ehtosynkronointi ohjelmoijan vastuulla; vain ohjelmoija tietää, millaista synkronointia prosessien välillä tarvitaan täytyy ohjelmoida eksplisiittisesti ehtomuuttujia (condition variables) käyttäen Huom! SW-monitori Monitorin muuttujat yhteiskäytössä. Vain yksi prosessi kerrallaan suorittaa monitorin koodia. Proseduureissa voi käyttää paikallisia muuttujia, kullakin prosessilla niistä oma kopio (pinossa). Stallings Fig. 5.21: Structure of a Monitor. 5-11 5-12 2

Ehtomuuttujat ja operaatiot cond cv ei arvoa - vain jono ehtoa cv odottaville Blocked-tilaan siirretyille prosesseille (paikka odotukselle, odotushuone wait(cv) laita prosessi jonoon odottamaan operaatiota signal() prosessi joutuu aina jonoon! signal(cv) jos jono tyhjä, no operation, ehtomuuttuja ei muista jos jonossa prosesseja, herätä jonon ensimmäinen huuto odotushuoneeseen: Seuraava! empty(cv) palauta true, jos jono on tyhjä vrt. semafori! 5-13 Monitorin käyttövuorot koodattava eksplisiittisesti synkronointi aina ohjelmoijan vastuulla jos prosessi ei voi jatkaa monitorin sisällä, vapauta monitori muiden käyttöön: kutsu wait(cv) odotus tavallaan monitorin ulkopuolellla, passiivisena! kun odotukseen liittyvä ehto tulee todeksi, kutsu signal(cv) signal() herättää monitorin sisällä jo olleen toisen prosessin Kumpi saa jatkaa proseduurissaan? Herättäjä? Herätetty? 5-14 Signaloinnin vaihtoehdot Signal and Continue (nonpreemptive) signaloija jatkaa, herätetty prosessi suoritukseen myöhemmin, kun aikanaan saa monitorin haltuunsa Signal and Wait (preemptive) signaloija odottaa, herätetty saa jatkaa heti (= prosessin vaihto) ks. Fig 5.21: signaler into urgent queue Odottavat prosessit ehtomuuttujan jonossa Odotus poissuljetun alueen ulkopuolella ks. Fig 5.21 monitor waiting area Signal and Continue Java, POSIX: phtreads-kirjasto, Andrewsin kirja (tämä kurssi) S&C vain vihje, että juuri silloin vaadittu ehto true, ehto ei kuitenkaan välttämättä enää ole voimassa, kun herätetty prosessi pääsee jatkamaan odotuskohdastaan tarkistettava ennenkuin voi jatkaa! Signal and Wait kirjallisuudessa Myös uudet prosessit kilpailemassa pääsystä monitorin sisälle Onko ehto enää true, kun herätetty pääsee jatkamaan? Tarkastettava uudelleen! 5-15 Andrews Fig. 5.1. 5-16 Semaforin toteutus monitorina P(s): <await (s > 0) s = s-1;> if (s = = 0) wait (pos); s=s-1; V(s): <s= s + 1;> s=s+1; signal(pos); monitor Semaphore { int s = 0; cond pos; procedure Psem() { if (s == 0) wait (pos); s = s -1; procedure Vsem() { s = s +1; signal (pos); Toimiiko oikein, jos käytetään SC:tä? Entä jos if:n tilalla while? 5-17 Tilanne OK vapautetun prosessin mennessä monitoriin! pos. : signal(pos) Signal and wait (SW) Signal and Urgent wait 5-18 3

Miten saataisiin toimimaan myös FIFOna myös SC:tä käytettäessä? condition passing (vrt. paton passing) Onko tilanne enää turvallinen vapautetun prosessin päästessä monitoriin?. : signal(pos) pos. Signal and continue (SC) procedure Psem() { if (s == 0) wait (pos); else s = s -1; procedure Vsem() { if (empty(pos)) s = s +1; else signal (pos); 5-19 5-20 Esim: Semaforin toteutus monitorin avulla Andrews Fig. 5.2 Signal and Wait: FIFO semaphore ehto varmasti voimassa, kun herätetty suoritukseen Signal and Continue: kun herättäjä poistuu monitorista, monitorin jonossa ensimmäinen saa pääsee monitoriin (ei välttämättä juuri herätetty) muuttujien arvot saattaneet muuttua uudelleen, ennenkuin herätetty pääsee suorituksen Andrews Fig 5.3: FIFO semaphore using passing the condition Odotettu ehto voimassa, ojenna se sellaisenaan herätettävälle ehto varmasti voimassa, kun herätetty jatkaa muille prosesseille ehto ei ole voimassa (sitä ei merkitä näkyviin!) 5-21 Andrews Fig. 5.2. while varmistaa, että ehto on yhä voimassa: se testataan ennen kuin prosessi saa jatkaa. Jos ehto ei ole voimassa (joku toinen on muuttanut sitä), prosessi joutuu uudelleen odotustilaan (herätettiin turhaan, joku pääsi etuilemaan). 5-22 condition passing Andrews Fig. 5.3. condition passing estää etuilun: odottajat pääsevät monitoriin FIFOjärjestyksessä (signal(pos)) Monitoriin pyrkijät päästetään etenemään, vain jos odottajia ei ole: ei muuteta ehtoa => joutuvat odotustilaan. Synkronointi if, koska ehto ei ole voimassa; muut pysähtyvät tähän, mutta vapautettu odottaja ei enää tarkasta ehtoa, vaan etenee monitorissa 5-23 5-24 4

Synkronointi (Condition Synchronization) process Producer[i=1 to N] { typet data; while (true) { tuota data; call Bounded_Buffer.deposit(data); process Consumer[i=1 to M] { typet data; while (true) { call Bounded_Buffer.fetch(data); kuluta data; vrt. 4.5 Andrews Fig. 5.4. 5-25 Prosessit monitorin ulkopuolella! Miksi? 5-26 Lisää operaatioita Lukijat ja kirjoittajat monitorissa wait (cv, rank) odota arvon mukaan kasvavassa järjestyksessä (priority wait) minrank(cv) palauta jonon ensimmäisen prosessin arvo signal_all(cv) herätä kaikki ehtomuuttujassa cv odottavat prosessit S&C: while (! empty(cv)) signal(cv); S&W: ei kovin hyvin määritelty miksei? lukijat usea lukija voi samanaikaisesti olla lukemassa request_read release_read tietokanta, johon kirjoitetaan ja josta luetaan tietokanta on monitorin ulkopuolella, mutta sinne pääsee vain monitorin kautta kirjoittajat kirjoittajalla yksinoikeus tietokantaan request_write release_write vrt. semafori! 5-27 5-28 monitor RW_Controller { # paikallisten muuttujien määrittelyt prosedure request_read( ) {. procedure release_read () { procedure request_write () { procedure release_write ( ){. process Reader [i=1 to M] {. request_read(); read_database; release_read(); process Writer [i=1 to N] {. request_write ( ); write_database; release_write( ) ehtomuuttujia: oktoread kun ei kukaan kirjoittamassa, oktowrite kun ei kukaan lukemassa tai kirjoittamassa => tarvitaan muuttujia: nr = lukijoiden lukumäärä, nw = kirjoittajien lukumäärä procedure request_read { while (nw >0) wait (oktoread); nr = nr +1; procedure request_write(){ while (nr>0 nw>0) wait(oktowrite); nw=nw+1; 5-29 5-30 5

procedure release_read(){ Kaikkien herätys (Broadcast Signal) nr= nr-1; if (nr = =0) signal (oktowrite); # viimeinen lukija herättää # yhden kirjoittajan procedure release_write () { nw = nw -1; # poistuva kirjoittaja herättää yhden kirjoittajan ja kaikki lukijat signal(oktowrite); signal_all (oktoread); Huom: DB ei monitorin sisällä! Miksei? 5-31 vrt. 4.13 Andrews Fig. 5.5. 5-32 Lyhyin työ ensin herätys prioriteetin perusteella wait(cv) vie prosessin fifo-jonoon; herätys jonoonmeno järjestyksessä wait(cv, rank) vie prosessit rank-muuttujan mukaan nousevaan järjestykseen ja herättää pienimmällä rank-arvolla odottamaan menneen prosessin ensimmäiseksi prosedure request (int time) { if (free) free =false; else wait(turn, time); 5-33 Prioriteetin mukaan jonotus (Priority Wait) Odotus ajan (time) mukaisessa järjestyksessä Condition passing: Pidä resurssi varattuna, anna varattuna seuraavalle prosessille! Ei etuilua! vrt. 4.14 Andrews Fig. 5.6. 5-34 Ajastinkello prosesseille kaksi operaatiota delay(interval) # viivyttää kutsuvaa prosessia # interval määrän tikityksiä # herätetään vasta kun haluttu aika #on kulunut procedure delay(int interval){. kellon tikitys tick # kasvattaa aikaa tietyin välein procedure tick() {. 5-35 Eri tapoja toteuttaa aina kun kello tikittää, herätetään kaikki odottavat prosessit tarkastamaan itse, onko jo aika herätä = kattava herätys (covering condition) herätetään vain ne, jotka todella ovat tarpeeksi nukkuneet ja voivat jatkaa toimintaansa prioriteettiodotus + tarkistus onko jo aika herätä jokaisella odottavalla oma ehtomuuttuja monimutkaisempi ratkaisu 5-36 6

Kattava herätys (Covering Condition) Priority Wait Jokaiselle oma herätysaika! Herätysajan mukaan järjestykseen Herätä kaikki odottajat - tarkistakoot itse, onko jatkamislupa edelleen voimassa! Andrews Fig. 5.7. 5-37 Ensimmäisen jonossa olevan arvo (=herätysaika) Herätä vain ne, jotka voivat jatkaa! Andrews Fig. 5.8. 5-38 Synkronointi Rendezvous: Nukkuva parturi Priority wait helppo ohjelmoida, tehokas ratkaisu voi käyttää, jos odotusehdoilla staattinen järjestys Covering condition voi käyttää, jos herätetty prosessi voi tarkistaa ehdon uudelleen ei voi käyttää, jos odotusehdot riippuvat myös muiden odottavien prosessien tiloista Jos minrank ei riitä odotuksen/vuorojen järjestämiseen, talleta yhteiset odotusehdot pysyviin muuttujiin ja jätä prosessit odottamaan yksityisiin ehtomuuttujiin ohjelmoi itse jonon ylläpito (jonotusjärjestys) 5-39 Useita aktiivisia prosesseja Rendezvous: kahden prosessin kohtaaminen vrt. puomisynkronointi Kutakin odotussyytä varten ehtomuuttuja ja laskuri rendezvous: uusi asiakas - vapaa parturi Asiakkaan odotettava, että parturi vapaa ovi auki Parturin odotettava, että asiakas paikalla asiakas poistuu 5-40 Tapahtumien synkronointi Asiakkaan tärkeät vaiheet (tapahtumat): cinchair eli istu tuoliin (asiakas on nyt kohtauspaikalla) cleave eli poistu parturista Parturin vaiheet bavail eli vapaudu parranajoon bbusy eli aja partaa bdone eli asiakkaan parta ajettu Oikea järjestys laskurien avulla: bavail >= cinchair >= bbusy >= bdone >= cleave barber = bavail - cinchair Ongelma: laskurit kasvavat koko ajan! open = bdone - cleave Monitorin rakentelua int barber = 0, int chair = 0, open = 0; parturin ja asiakkaan toimintojen tahdistus ehtomuuttujilla: 4 eri tahdistuskohtaa asiakas odottaa parturin vapautuvan parturi odottaa asiakasta (= asiakas on tuolissa) asiakas odottaa poistumismerkkiä (= ovi auki) parturi odottaa asiakkaan poistumista kullekin oma ehtomuuttuja (cond) barber_available # signalled when barber > 0 chair_occupied # signalled when cinchair > 0 door_open # signalled when open > 0 customer_left # signalled when open == 0 chair = cinchair - bbusy 5-41 5-42 7

asiakkaan käyttämä proseduuri procedure get_haircut() { # odota tarvittaessa parturia while (barber == 0) wait (barber_ available); # varaa parturi barber = barber 1; # istu tuoliin ja ilmoita olevasi paikalla chair = chair + 1; signal(chair_occupied); # odota parranajon valmistumista eli oven avautumista while (open == 0) wait (door_open); # sulje ovi ja ilmoita lähteneesi open = open -1; signal (customer_left); Parturin käyttämät proseduurit procedure get_next_customer() { # parturi vapautunut; ilmoittaa tästä mahdollisille odottajille barber = barber + 1; signal ( barber_available); # odottaa asiakasta parturituoliin while (chair == 0) wait (chair_occupied); # tuoli merkataan vapaaksi (jo tässä!) chair = chair - 1; 5-43 5-44 procedure finished_cut() { # avaa ovi ja ilmoita parranajon päättymisestä open = open +1; signal (door_open); # odota asiakkaan poistumista while (open > 0) wait (customer_left); Systemaatt. ratkaisu resurssi: muuttuja varaus: vähennä (-) vapautus: lisää (+) varo muita: while 5-45 Andrews Fig. 5.10. 5-46 process Barber { typet data; while (true) { call Barber_Shop.get_next_customer();... parturoi... call Barber_Shop.finished_cut() process Customer[i=1 to M] { while (true) {.. tee sitä ja tätä... call Barber_Shop.get_haircut(); POSIX-kirjasto, pthread # include <pthread.h> ehtomuuttujat käyttö yhdessä mutexin kanssa monitori pthread_cond_init(), *_wait(), *_signal(), *_broadcast(), *_timedwait(), *_destroy() Java, synchronized methods automaattinen poissulkeminen monitori ei ehtomuuttujia, yksi implisiittinen odotusjono / objekti operaatiot wait(), notify(), notifyall() c Lue man- / opastussivut c Andrews ch 5.4, 5.5 5-47 5-48 8

Kertauskysymyksiä? 5-49 9