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

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

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

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

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ä

Semaforit ja rinnakkaisuuden hallinta

Semaforit ja rinnakkaisuuden hallinta

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

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

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

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

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

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

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ä

Rinnakkaisohjelmointi

Rinnakkaisohjelmointi

Rinnakkaisohjelmointi

5. Luento: Rinnakkaisuus ja reaaliaika. Tommi Mikkonen,

Oppimistavoitteet kurssilla Rinnakkaisohjelmointi

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

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

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

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

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)

Lukkiutuminen. Taustaa

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

Ohjelmoinnin peruskurssien laaja oppimäärä

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.

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Prosessi perinteisesti

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ä

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

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

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

Graafisen käyttöliittymän ohjelmointi Syksy 2013

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

Luento 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

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

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

Käyttöjärjestelmät: prosessit

Sisältöä SÄIKEET, SMP

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

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

Jakso 12 Yhteenveto. Keskeiset asiat Teemu Kerola, K2000

Tietokoneen toiminta, K Tavoitteet (4)

Rinnakkaisohjelmointi, Syksy 2006

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

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

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

12. Javan toistorakenteet 12.1

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

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

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

2 Konekieli, aliohjelmat, keskeytykset

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

Käyttöjärjestelmät II

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

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

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

11. Javan toistorakenteet 11.1

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

12. Javan toistorakenteet 12.1

Luento 4 Aliohjelmien toteutus

OSA II: Sisältö, osa II. Sanomanvälitys. Käsitteistöä. Sanomanvälitys. Kommunikointi. Hajautettu ympäristö Ei yhteistä muistia.

Monipuolinen esimerkki

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

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Tavoite. Monitorit. Semafori perusmekanismi synkronointiin

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

Käyttöjärjestelmät II

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

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Jakso 4 Aliohjelmien toteutus

Jakso 4 Aliohjelmien toteutus

Rajapinta (interface)

Jakso 4 Aliohjelmien toteutus. Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio

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

Jakso 4 Aliohjelmien toteutus

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

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

Processes and threads

812315A Ohjelmiston rakentaminen. Asynkronisuus

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

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

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

Transkriptio:

OSA I: Yhteisten muuttujien käyttö Prosessit samassa koneessa 2-1

Sisältöä Poissulkeminen ja synkronointi Semaforit ja rinnakkaisuuden hallinta Lukkiutuminen Monitorit 2-2

Poissulkeminen ja synkronointi 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

Rinnakkaiset, atomiset operaatiot Kriittinen alue, useita käsittelijöitä Vain yksi saa edetä alueella kerrallaan Andrews 3.1. (s. 94-95) 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] input(in,..); out = in; output(out,..); 2-4

Poissulkeminen Ohjelman perusmalli process CS[i=1 to n] { # n rinnakkaista prosessia while (true) { Entry protocol # varaa < kriittinen alue > # käytä (exclusive!) Exit protocol # vapauta ei kriittistä koodia; Ohjelmoi kriittiset alueet lyhyiksi 2-5

Halutut ominaisuudet Poissulkeminen Vain yksi prosessi kerrallaan suorituksessa kriittisellä alueella Ei lukkiutumisvaraa, ei elohiirtä Jos useita sisäänpyrkijöitä, jotain onnistaa deadlock livelock Ei tarpeettomia viipeitä, ei nälkiintymistä Jos alue vapaa, pääsy sallittava Lopulta onnistaa Kukaan ei joudu odottamaan ikuisesti 3 safety properties + liveness property 2-6

Spin Locks, Busy Waiting Andrews 3.2 (s. 97-101) 2-7

Lukkomuuttujat, Spin Locks Boolean-muuttuja lock lock==true kriittinen alue varattu 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; 2-8

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 L == 10 LOOP: LOAD R1,L JZER R1,LOOP LOAD R1,=0 STORE R1,L < kriittinen alue > LOAD R1,=1 STORE R1,L < kriittinen alue > LOAD R1,=1 STORE R1,L OK? Testaus ja asetus atomisesti! 2-9

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; > Käyttö: LOOP: TS L JUMP LOOP... 2-10

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ä 2-11

Test-and-Set ja TT-K91? 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 > LOAD R1,=1 STORE R1,L # L 1 OK? Moniprosessorijärjestelmä? Keskeytys? 2-12

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 = testatan ensin, onko lukko vapaa 2-13

Lukkomuuttuja ja lukko-operaatiot Muuttujan tyyppi lock Operaatiot esittely, alkuarvo lock x=1; # vapaa LOCK(x) loop test=ts(x); # aseta x = 0 until(test==1); # oliko vapaa? UNLOCK(x) x=1; [ Linux kernel: spinlock_lock(x), spinlock_unlock(x) ] [ vrt. kirja CSEnter, CSExit ] 2-14

Poissulkeminen lukkomuuttujaa käyttäen lock L=1; # käytä lukitsemaan tiettyä kriittistä aluetta # sopimus prosessien kesken! process CS [i=1 to N] { while (true){ ei kriittistä koodia; ei kriittistä koodia; Tulkinta: L=1 yhdellä lupa edetä # n rinnakkaista! LOCK(L); # varaa < kriittinen alue > # käytä (exclusive!) UNLOCK(L); # vapauta 2-15

Aktiivinen vs. passiivinen odotus busy-wait: turhaa laitteiston käyttöä! 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-16

Semaforit Andrews 4.1 (s. 153-155), 6.3 (s. 276-279) 2-17

Semaforit alkuarvo semafori S public P(S) private S.arvo public V(S) private 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-18

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-19

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-20

P/V:n toteutus KJ:n ytimessä (Andrews Fig 6.5) P(S) if (S.arvo > 0) S.arvo = S.arvo - 1 else aseta prosessin tilaksi Blocked, lisää prosessi jonoon S.jono call Vuorottaja() V(S) if (isempty(s.jono)) S.arvo = S.arvo + 1 else siirrä S.jonon ensimmäinen prosessi Ready-jonoon (tilaksi Ready) call Vuorottaja() 2-21

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-22

Poissulkeminen semaforia käyttäen sem mutex=1; # vain perinteinen muuttujan nimi process CS [i=1 to N] { # rinnakkaisuus! while (true){ ei kriittistä koodia; P(mutex); # varaa < critical section > # käytä (exclusive!) V(mutex); ei kriittistä koodia; # vapauta yksi semafori kullekin erilliselle kriittiselle alueelle huomaa oikea alkuarvo 2-23

P(lock) P(lock) P(lock) V(lock) V(lock) V(lock) Vrt. Stallings Fig. 5.10 Bacon Fig 9.19

Esimerkki: Muistinhallinta (1) prosessi c2 Muistinhallinta prosessi c1 GET pagepool ----- GET... REL --- --- GET... REL --- --- GET... REL --- koodi REL count koodi 2-25

addr pagepool[1:max]; # käyttö pinona int count=max; function GET(): returns addr { get = pagepool[count]; count = count-1; pagepool 1,7,3,8,5,6,2,9,.. count procedure REL(addr freepage) { count = count+1; pagepool[count] = freepage; 2-26

Toimiikos toi? addr pagepool[1:max]; int count=max; framepool pagepool 1,7,3,8,5,6,2,9,.. count 6 function GET: returns addr { get = pagepool[count]; count = count-1 GET==6 function GET: returns addr { get = pagepool[count]; count = count-1 GET==6 2-27

Muistinhallinta (1): poissulkeminen addr pagepool[1:max]; int count=max; sem mutex=1; function GET(): returns addr { P(mutex); get = pagepool[count]; count = count-1; V(mutex); pagepool 1,7,3,8,5,6,2,9,.. count mutex 0 procedure REL(addr freepage) { P(mutex); count = count+1; pagepool[count] = freepage; V(mutex); 2-28

Synkronointi Andrews 4.2 (s. 156-164) 2-29

Synkronointi 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 synkronointikohtaan? tarvitsee paikan missä odottaa (~jonottaa) 2-30

Synkronointi semaforia käyttäen sem A_Ready = 0; 0 ei ole tapahtunut, 1 on tapahtunut Tuottaja tuota A V(A_ready); Kuluttaja P(A_ready); kuluta A Kumpi ehtii ensin? Oikea alkuarvo? 2-31

Muistinhallinta (2): synkronointi addr pagepool[1:max]; int count=max; sem mutex=1, avail=max; function GET() : returns addr { P(avail); P(mutex); get = pagepool[count]; count = count-1 V(mutex); procedure REL(addr freepage) { P(mutex); count = count+1; pagepool[count] = freepage; V(mutex); V(avail); pagepool 1,7,3,8,5,6,2,9,.. count mutex 0 avail 6 2-32

Puomisynkronointi (barrier) n prosessia työskentelee yhdessä Iteratiivinen käsittely, synkronointi tietyn välivaiheen jälkeen aika Prosessi A synkronoi Prosessi B synkronoi Prosessi C synkronoi I II 2-33

process Worker [i = 1 to N] { while ( ) { käsittele vaihe x:n alku ; toimita synkronoititieto kaikille muille; odota synkronoititietoa kaikilta muilta; käsittele vaihe x:n loppu; aika Worker[1] synkronoi odota Worker[2] synkronoi odota Worker[3] synkronoi odota 2-34

Puomisynkronointi sem arrive1 = 0, arrive2 = 0; process Worker1 { käsittele alkuosa 1 V(arrive1); # lähetä synkronointitapahtuma P(arrive2); # odota toista prosessia käsittele loppuosa 1 process Worker2 { käsittele alkuosa 2 V(arrive2); # lähetä synkronointitapahtuma P(arrive1); # odota toista prosessia käsittele loppuosa 2 Huomaa järjestys! 2-35

Puomisynkronointi, yleiset semaforit sem arrive=0, continue[1:n] = ( [N] 0 ); process Worker [i=1 to N] { käsittele alkuosa i V(arrive); # synkronointitapahtuma koordinaattorille P(continue[i]); # odota toisia prosesseja käsittele loppuosa i process Coordinator { while (true) { count = 0; while (count < N) { P(arrive); count++; for [i = 1 to N] V(continue[i]); # odota, kunnes N synkronointitapahtumaa # synkronointitapahtuma prosesseille Entä jos vain yksi continue-semafori? 2-36

Rinnakkaisuuden hallinta resurssien varaus get/rel muuttujat hallinnan toteutus P/V semafori P/V:n toteutus LOCK/UNLOCK lukkomuuttuja GET {P(mutex) V(mutex) REL {P(mutex) V(mutex) P( ) LOCK(lock) UNLOCK(lock) pagepool mutex avail V( ) LOCK(lock) UNLOCK(lock) LOCK/UNLOCK toteutus test-and-set-käsky lukkomuuttuja LOCK loop..ts(x)... UNLOCK x = 1 2-37

Kertauskysymyksiä? 2-38