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

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

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

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

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

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ä

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

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

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

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

Rinnakkaisohjelmointi

Rinnakkaisohjelmointi

Rinnakkaisohjelmointi

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

5. Luento: Rinnakkaisuus ja reaaliaika. Tommi Mikkonen,

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

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

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

Oppimistavoitteet kurssilla Rinnakkaisohjelmointi

Tieto ja sen osoite (3) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Osoitinmuuttujat. Tieto ja sen osoite (5)

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

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Lukkiutuminen. Taustaa

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

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

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

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

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

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

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

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

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

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä

Prosessi perinteisesti

Stallings, Luku 4.1. KJ-I I S2005 / Tiina Niklander, kalvot Auvo HäkkinenH

Semaforit Javassa. Mari Kononow, Eveliina Mattila, Sindi Poikolainen HELSINGIN YLIOPISTO

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

Luento 3 (verkkoluento 3) Ttk-91 konekielinen ohjelmointi. Ohjelman esitysmuoto Konekielinen ohjelmointi ttk-91:llä (Titokone, TitoTrainer)

Käyttöjärjestelmät: prosessit

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

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

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

Käyttöjärjestelmät II

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ä:

12. Javan toistorakenteet 12.1

Graafisen käyttöliittymän ohjelmointi Syksy 2013

TIES542 kevät 2009 Yhteismuistisamanaikaisuus

Stallings, Luku 4.1. KJ-I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 4-1. KJ-I I S2004 / Tiina Niklander, kalvot Auvo Häkkinen 12-1

Tietokoneen toiminta, K Tavoitteet (4)

Jakso 12 Yhteenveto. Keskeiset asiat Teemu Kerola, K2000

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

Sisältöä SÄIKEET, SMP

11. Javan toistorakenteet 11.1

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

Ohjelmoinnin peruskurssi Y1

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

Käyttöjärjestelmät II

12. Javan toistorakenteet 12.1

Ohjelmoinnin perusteet Y Python

Jakso 4 Aliohjelmien toteutus

Jaetun muistin muuntaminen viestin välitykseksi. 15. lokakuuta 2007

Rinnakkaisohjelmointi, Syksy 2006

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Yleiskuva. Käyttöjärjestelmät II. Tietokonejärjestelm. rjestelmä. KJ ja laitteistopiirteet. KJ ja laitteistopiirteitä.

Ohjelmoinnin perusteet Y Python

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

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

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset

Tiedon sijainti suoritusaikana (3) Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Miten tietoon viitataan? (4)

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

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

SÄIKEET, SMP. Sisältöä. Stallings, Luku 4. Prosessi vs. säie Miksi säikeitä? ULT: Käyttäjätason säikeet KLT: Säikeiden toteutus ytimessä

Sisältöä SÄIKEET, SMP

Luento 4 Aliohjelmien toteutus

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

2 Konekieli, aliohjelmat, keskeytykset

Ongelma(t): Jotta tietokone olisi mahdollisimman yleiskäyttöinen ja suorituskykyinen, niin miten tietokoneen resurssit tulisi tarjota ohjelmoijalle,

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Processes and threads

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Muuttujat Tietorakenteet Kontrolli Optimointi Tarkistukset

Monipuolinen esimerkki

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Java-kielen perusteet

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

Transkriptio:

Sisältöä OSA I: Yhteisten muuttujien käyttö Prosessit samassa koneessa Poissulkeminen ja nti Semaforit ja rinnakkaisuuden hallinta Lukkiutuminen Monitorit 2-1 2-2 Atomisuus (atomic action) v Poissulkeminen ja nti alkutila tila muutoksen jälkeen tilamuutos välitiloja ei näy Rinnakkaiset, atomiset operaatiot Spin Locks Semaforit Synkronointi Andrews 2.1-2.5, 3.1-3.2, 4.1-4.2, 6.3 ja Stallings 5.1,5.3-5.4 yksittäinen konekäsky on atominen usean konekäskyn vaatima muutos = kriittinen alue (critical section) on tehtävä atomiseksi keskinäisellä poissulkemisella (mutual exclusion) muut prosessit eivät pääse käsittelemään tilamuutoksen muuttujia eli suorittamaan omaa kriittista aluettaan Liisa Marttinen 2-4 Kriittinen (koodi)alue (critical section) int buf[n]; process kertoma (int arvo) { int apu = 1, i =2; while (i<= arvo) { apu = i*apu; i++; buf[arvo] = apu; buf Yhteinen muistialue process laskija( ) { int apu, luku,...; laske jotain; luku=f( ); # laske luku apu = buf[luku]; if (apu = = 0)... else lasketaan taas;... { { 2-5 Rinnakkaiset, atomiset operaatiot Kriittinen alue, useita käsittelijöitä Vain yksi saa edetä alueella kerrallaan char out, in; procedure echo { input (in, keyboard); out = in; output (out, display); process P[i=1 to 2] {... echo();... prosessi P[1] input (in,..); out = in; output (out,..); prosessi P[2] Andrews 3.1. (s. 94-95) input(in,..); out = in; output(out,..); 2-6 1

Poissulkeminen Ohjelman perusmalli process CS[i=1 to n] { # n rinnakkaista prosessia ei kriittistä koodia Entry protocol # varaa < kriittinen koodialue > # käytä (exclusive!) Exit protocol # vapauta Ohjelmoi kriittiset alueet lyhyiksi! Vain välttämätön 2-7 Halutut ominaisuudet Poissulkeminen Vain yksi prosessi kerrallaan suorituksessa kriittisellä alueella Ei lukkiutumisvaraa, ei elohiirtä Jos useita sisäänpyrkijöitä, jotain onnistaa Ei tarpeettomia viipeitä Jos alue vapaa, pääsy sallittava Lopulta onnistaa, ei nälkiintymistä Kukaan ei joudu odottamaan ikuisesti 3 safety properties + liveness property deadlock livelock 2-8 bool in1= false, in2=false; process CS1 { <await (!in2) in1 =true;> /*entry*/ in1= false; /*exit*/ process CS2 { <await (!in1) in2 =true;> /*entry*/ in2= false; /*exit*/ Kaksi prosessia entry protocol! exit protocol! Entä jos prosesseja onkin N kappaletta? Onko varattu (joku käyttää) vai Spin Locks, Busy Waiting Andrews 3.2 (s. 97-103) vapaa (ei kukaan käytä)? 2-9 2-10 Lukkomuuttujat, Spin Locks Boolean-muuttuja lock Lock== true kriittinen alue varattu (in1 V in2 V V inn) lock==false kriittinen alue vapaa Entry protocol while (lock) ; # aktiivinen odotus, pörrää # check again if (!lock) # busy loop lock=true; Exit protocol lock=false; bool lock=false; process CS[i=1 to N] { <await (!lock) lock =true;> /*entry*/ lock= false; /*exit*/ 2-11 2-12 2

Toteutus symbolisella konekielellä muuttuja L: L==1, jos kriittinen alue vapaa L==0, jos kriittinen alue varattu LOOP: LOAD R1,L JZER R1,LOOP LOAD R1,=0 STORE R1,L < kriittinen alue > LOAD R1,=1 STORE R1,L L == 1 0 OK? Testaus ja asetus atomisesti! LOOP: LOAD R1,L JZER R1,LOOP LOAD R1,=0 STORE R1,L < kriittinen alue > LOAD R1,=1 STORE R1,L 2-13 Test-and-Set-käsky Oma konekielen käsky atominen laitetason suoritus (execute-vaihe) argumentti: lukkomuuttuja boolean paluuarvo TS L merkitys: < temp=l; L=0; if (temp==1) jump *+2; > merkitään varatuksi! Käyttö: LOOP: TS L JUMP LOOP Saa edetä! Jää odottamaan!... 2-14 Test-and-Set ja TT-K91? bool TS(bool lock) { < bool initial = lock; /* arvo talteen */ lock = true; /* lukitse lukko */ return initial; > /* palauta lukon arvo */ Andrews s. 99 Test and Set toiminto lausekielellä esitettynä TS Ri,L < Ri mem[l] mem[l] 0 if (Ri==1) jump *+2 > entry exit LOOP: TS R1,L # L: 1(vapaa), 0(varattu) JUMP LOOP < kriittinen alue > # tänne, jos R1 = 1 LOAD R1,=1 STORE R1,L # L 1 OK? Moniprosessorijärjestelmä? Keskeytys? 2-15 2-16 TEST and bool lock=false; SET process CS[i=1 to N] { while(ts(lock)) skip; lock= false; Toteutuvatko vaatimukset? Poissulkeminen? OK! Vain yksi prosessi kerrallaan suorituksessa kriittisellä alueella Ei lukkiutumisvaraa, ei elohiirtä? OK! Jos useita sisäänpyrkijöitä, jotain onnistaa Ei turhia viipeitä, ei nälkiintymistä? OK! Jos alue vapaa, pääsy sallittava Lopulta onnistaa? EI VÄLTTÄMÄTTÄ Kukaan ei joudu odottamaan ikuisesti Ongelmana suorituskyky, jos monta prosessia kilpailemassa ja koko ajan tutkimassa ja kirjoittamassa lukkomuuttujaan Rasittaa muistia ja muistiväylää Kirjoittaminen häiritsee välimuistin toimintaa => Test-and-Test-and-Set = testataan ensin, onko lukko vapaa 2-17 2-18 3

Test and Test and Set kilpailu muistista (lukkomuuttuja) => huono suorituskyky TS kirjoittaa aina lukkomuuttujaan => välimuisti muuttuu => muiden prosessorien välimuistit eivät enää ole ajantasalla while (lock) skip; # pörrätään, kun lukko päällä (lock=true) while (TS(lock)) { # yritetään saada lukko itselle while (lock) skip; # pörrätään, jos ei saatu (lock = true) nyt useinmiten vain luetaan arvoa ja harvemmin kirjoitetaan! 2-19 bool lock=false; process CS[i=1 to N] { while(lock) skip; while(ts(lock)) { while(lock) skip; lock= false; TEST and TEST and SET 2-20 Lukkomuuttuja ja lukko-operaatiot Muuttujan tyyppi Operaatiot lock CSenter - CSexit <await (B) S;> toteutus: esittely, alkuarvo lock x=1; # vapaa LOCK(x) UNLOCK(x) loop test=ts(x); # aseta x = 0 until(test==1); # oliko vapaa? x=1; CSenter; while (!B) {Csexit; {CSexit;??? Delay; CSenter Csenter; S; CSexit; [ Linux kernel: spinlock_lock(x), spinlock_unlock(x) ] [ vrt. kirja CSenter, CSexit ] Ethernetin MAC-protokolla 2-21 2-22 Poissulkeminen lukkomuuttujaa käyttäen lock L=1; # käytä lukitsemaan tiettyä kriittistä aluetta # sopimus prosessien kesken! Aktiivinen vs. passiivinen odotus busy-wait: turhaa laitteiston käyttöä! process CS [i=1 to N] { # n rinnakkaista! while (true){ LOCK(L); # varaa < kriittinen alue > # käytä (exclusive!) UNLOCK(L); # vapauta Tulkinta: L=1 yhdellä lupa edetä kilpailu useita prosesseja (käyttävät yhteistä prosessoria), jotka haluavat päästä kriittiselle alueelle livelock pienen prioriteetin prosessi kriittisellä alueella suuren prioriteetin prosessi pörrää LOCK-operaatiossa vaihtoehto jos pääsy ei sallittu, odota Blocked-tilassa 2-23 2-24 4

Semaforit Semaforit Andrews 4.1 (s. 153-155), 6.3 (s. 276-279) public public alkuarvo P(S) V(S) private private semafori S S.arvo S.jono P() aka WAIT() aka Down() jos kriittinen alue vapaa, lukitse se ja jatka eteenpäin jos kriittinen alue varattu, odota V() aka SIGNAL() aka Up() jos joku odotusjonossa, päästä joku etenemään muuten vapauta kriittinen alue atomisia 2-25 2-26 Yleistä semaforeista Alkuperäinen idea: Dijkstra (60-luvun puoliväli) binäärisemaforit: vain arvot 0 ja 1 käytössä Operaatiot Alustus sem S=1; sem forks[5] = ([5] 1); P(S) (= passeren) V(S) (= vrijgeven) S.arvo 1 vapaa / avoinna / etenemislupa 0 varattu / suljettu / eteneminen kielletty S.jono Etenemislupaa Blocked-tilassa odottavat prosessit Toteutus: PCB:t linkitetyssä listassa (=jono) 2-27 Yleiset semaforit: S.arvo ~ resurssilaskuri S.arvo > 0 vapaiden yksiköiden lkm, etenemislupien määrä kuinka monta prosessia voi tehdä P()-operaation joutumatta Blocked tilaan ja semaforin jonoon S.arvo = 0 ei vapaita [ jotkut toteutukset: S.arvo < 0 ] jonossa odottavien prosessien lkm Ei operaatiota jonon käsittelyyn / pituuden kyselyyn! semaforin arvon kyselemiseen! jos tarve tietää, ylläpidä ko. tieto omassa muuttujassa 2-28 P/V:n toteutus KJ:n ytimessä (Andrews Fig 6.5) P(S) V(S) if (S.arvo > 0) S.arvo = S.arvo - 1 else aseta prosessin tilaksi Blocked, lisää prosessi jonoon S.jono call Vuorottaja() if (isempty(s.jono)) S.arvo = S.arvo + 1 else siirrä S.jonon ensimmäinen prosessi Ready-jonoon (tilaksi Ready) call Vuorottaja() 2-29 P/V:n toteutus (toinen tapa, Stallings Fig. 5.6 ja 5.7) P(S) V(S) S.arvo = S.arvo - 1 if (S.arvo < 0) aseta prosessin tilaksi Blocked, lisää prosessi jonoon S.jono call Vuorottaja() S.arvo = S.arvo + 1 if (S.arvo >= 0) siirrä S.jonon ensimmäinen prosessi Ready-jonoon call Vuorottaja() Miten ohjelmoijan huomioitava tämä toteutusero? 2-30 5

Poissulkeminen semaforia käyttäen sem mutex=1; # vain perinteinen muuttujan nimi P(lock) process CS [i=1 to N] { # rinnakkaisuus! while (true){ # varaa < critical section > # käytä (exclusive!) # vapauta V(lock) P(lock) P(lock) V(lock) yksi semafori kullekin erilliselle kriittiselle alueelle huomaa oikea alkuarvo V(lock) 2-31 2-32 Esimerkki: Muistinhallinta (1) prosessi --...... prosessi c1 c2... koodi Muistinhallinta addr [1:MAX]; int =MAX; addr function () { addr memaddr; memaddr = []; = -1; return memaddr ; procedure (addr freepage) { = +1; [] = freepage; # vapaita muistitiloja ; käyttö pinona 1,7,3,8,5,6,2,9,.. koodi 2-33 2-34 Toimiikos tuo? addr [1:MAX]; int =MAX; framepool 1,7,3,8,5,6,2,9,.. 6 addr function : addr function : { get memaddr = []; = { get memaddr = []; = []; []; = -1 = -1 ==6 ==6 Muistinhallinta (1): poissulkeminen addr [1:MAX]; int =MAX; sem mutex=1; addr function () { Addr memaddr; memaddr = []; = -1; return memaddr; procedure (addr freepage) { = +1; [] = freepage; 1,7,3,8,5,6,2,9,.. mute x 0 2-35 2-36 6

Ehtonti Ehtonti Andrews 4.2 (s. 156-164) Prosessi P1 käskyjä kerro tapahtumasta käskyjä Prosessi P2 käskyjä odota tapahtumaa käskyjä... Tapahtuma: mikä tahansa kiinnostava puskuri_täynnä, io_valmis, laskenta valmis, kriittinen alue vapaa (Looginen) tapahtuma semaforimuuttuja Kumpi ehtii ensin ntikohtaan? tarvitsee paikan missä odottaa (~jonottaa) 2-37 2-38 Synkronointi semaforia käyttäen sem A_Ready = 0; 0 ei ole tapahtunut, 1 on tapahtunut Tuottaja tuota A V(A_ready); Kumpi ehtii ensin? Oikea alkuarvo? Kuluttaja P(A_ready); kuluta A Muistinhallinta (2): nti addr [1:MAX]; int =MAX; sem mutex=1, avail=max; addr function () { addr memaddr; P(avail); memaddr = []; = -1 return memaddr; procedure (addr freepage) { = +1; [] = freepage; V(avail); 1,7,3,8,5,6,2,9,.. mutex 0 avail 6 2-39 2-40 aika Puominti (barrier) n prosessia työskentelee yhdessä Iteratiivinen käsittely, nti tietyn välivaiheen jälkeen Prosessi A Prosessi B Prosessi C I II aika Worker[1] odota process Worker [i = 1 to N] { while () { käsittele vaihe x:n alku ; toimita ntitieto kaikille muille; odota titietoa kaikilta muilta; käsittele vaihe x:n loppu; Worker[2] Worker[3] odota odota 2-41 2-42 7

Puominti Väärin toteutettu puominti! sem arrive1 = 0, arrive2 = 0; process Worker1 { käsittele alkuosa 1 V(arrive1); # lähetä ntitapahtuma P(arrive2); # odota toista prosessia käsittele loppuosa 1 process Worker2 { käsittele alkuosa 2 V(arrive2); # lähetä ntitapahtuma P(arrive1); # odota toista prosessia käsittele loppuosa 2 Huomaa järjestys! 2-43 sem arrive1 = 0, arrive2 = 0; process Worker1 { käsittele alkuosa 1 P(arrive2); # odota toista prosessia V(arrive1); # lähetä ntitapahtuma käsittele loppuosa 1 process Worker2 { käsittele alkuosa 2 P(arrive1); # odota toista prosessia V(arrive2); # lähetä ntitapahtuma käsittele loppuosa 2 Johtaa lukkiutumiseen: kumpikin vain odottaa toista!! 2-44 Entä toimiiko näin? Onko mitään haittaa? sem arrive1 = 0, arrive2 = 0; process Worker1 { käsittele alkuosa 1 P(arrive2); # odota toista prosessia V(arrive1); # lähetä ntitapahtuma käsittele loppuosa 1 process Worker2 { käsittele alkuosa 2 V(arrive2); # lähetä ntitapahtuma P(arrive1); # odota toista prosessia käsittele loppuosa 2 2-45 Puominti, yleiset semaforit sem arrive=0, continue[1:n] = ( [N] 0 ); process Worker [i=1 to N] { käsittele alkuosa i V(arrive); # ntitapahtuma koordinaattorille P(continue[i]); # odota toisia prosesseja käsittele loppuosa i process Coordinator { = 0; while ( < N) { # odota, kunnes N ntitapahtumaa P(arrive); ++; for [i = 1 to N] V(continue[i]); # ntitapahtuma prosesseille Entä jos vain yksi continue-semafori? 2-46 Virheellinen puominti! Miksi näin? sem arrive=0, continue= 0; process Worker [i=1 to N] { käsittele alkuosa i V(arrive); # ntitapahtuma koordinaattorille P(continue); # odota toisia prosesseja käsittele loppuosa i process Coordinator { = 0; while ( < N) { # odota, kunnes N ntitapahtumaa P(arrive); ++; for [i = 1 to N] V(continue); # ntitapahtuma prosesseille 2-47 Kilpailutilanne V(arrive); P(continue); Mitä tässä voi tapahtua? V(arrive); P(continue); koordinaattori P(arrive) OK N kertaa! V(continue) N kertaa; 2-48 8

Rinnakkaisuuden hallinta resurssien varaus get/rel muuttujat hallinnan toteutus P/V semafori P/V:n toteutus LOCK/UNLOCK lukkomuuttuja {P(mutex) V(mutex) {P(mutex) V(mutex) P( ) LOCK(lock) UNLOCK(lock) mut ex avail V( ) LOCK(lock) UNLOCK(lock) Kertauskysymyksiä? LOCK/UNLOCK toteutus test-and-set-käsky lukkomuuttuja LOCK loop..ts(x)... UNLOCK x = 1 2-49 2-50 9