Semaforit ja rinnakkaisuuden hallinta

Samankaltaiset tiedostot
Semaforit ja rinnakkaisuuden hallinta

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

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

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)

Semaforit Liisa Marttinen 2-1

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

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

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

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

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ä

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

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

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

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

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

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

Tavoite. Monitorit. Semafori perusmekanismi synkronointiin

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

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

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

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

5. Luento: Rinnakkaisuus ja reaaliaika. Tommi Mikkonen,

Rinnakkaisohjelmointi, Syksy 2006

Ohjelmoinnin peruskurssien laaja oppimäärä

13. Loogiset operaatiot 13.1

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

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

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

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

2 Konekieli, aliohjelmat, keskeytykset

Lukkiutuminen. Taustaa

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

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

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

ITKP102 Ohjelmointi 1 (6 op)

Javan perusteita. Janne Käki

Ohjelmoinnin perusteet Y Python

TIES542 kevät 2009 Yhteismuistisamanaikaisuus

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

Käyttöjärjestelmät II

Prosessi perinteisesti

Ohjelmoinnin peruskurssien laaja oppimäärä

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

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

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

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

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

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

11. Javan toistorakenteet 11.1

Ohjelmoinnin perusteet Y Python

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

12. Javan toistorakenteet 12.1

Ohjelmointi 2 / 2010 Välikoe / 26.3

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

Käyttöjärjestelmät II

Graafisen käyttöliittymän ohjelmointi Syksy 2013

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

Java kahdessa tunnissa. Jyry Suvilehto

Sisältöä SÄIKEET, SMP

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

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

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

Monitorit -projekti Rinnakkaisohjelmointi

Harjoitus 3: Flash-komponenttiarkkitehtuuri ( )

Kaksiloppuinen jono D on abstrakti tietotyyppi, jolla on ainakin seuraavat 4 perusmetodia... PushFront(x): lisää tietoalkion x jonon eteen

12. Javan toistorakenteet 12.1

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

811120P Diskreetit rakenteet

Oppimistavoitteet kurssilla Rinnakkaisohjelmointi

TIETORAKENTEET JA ALGORITMIT

Processes and threads

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Harjoitus 4 (viikko 47)

P e d a c o d e ohjelmointikoulutus verkossa

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

Ohjelmoinnin peruskurssi Y1

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

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

Osio 2: Luennot 5-8 Muistinhallinta

Harjoitus 3 (viikko 39)

Ohjelmointi 1 C#, kevät 2013, 2. tentti

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

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Algoritmit 1. Demot Timo Männikkö

Olio-ohjelmointi Javalla

Metodien tekeminen Javalla

Pino S on abstrakti tietotyyppi, jolla on ainakin perusmetodit:

1. (a) Seuraava algoritmi tutkii, onko jokin luku taulukossa monta kertaa:

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Transkriptio:

Semaforit ja rinnakkaisuuden hallinta Tuottajat ja kuluttajat Resurssien hallinta, vuoron antaminen Lukijat ja kirjoittajat Andrews 4.2, 4.4-4.6

Tuottajat ja kuluttajat Andrews: ss.158-160 3-2

Toimiiko oikein? Mitä pitääkään tarkistaa? Andrews Fig. 4.3: Producers and consumers using semaphores. (split binary semaphores)

0 Andrews Fig. 4.4: Bounded buffer using semaphores.

0 Entä, jos vain yksi mutex? Andrews Fig. 4.5: Multiple producers and consumers using semaphores.

Lukijat ja kirjoittajat 3-6

Lukijat ja kirjoittajat Yhteinen tietokanta DB tai joku muu objekti, esim. tdsto, lista, Kaksi kilpailevaa käyttäjäluokkaa Lukijat (readers) lukevat useita lukijoita voi olla käsittelemässä yhtäaikaa Kirjoittajat (writers) lukevat ja muuttavat vain yksi kerrallaan muuttamassa Luokka aktiivinen vain, jos toinen luokka passiivinen 3-7

Ratkaisu 1: R/W poissulkemisongelmana Yksinkertaistettu ongelma, yksink. ratkaisu Poissulkeminen kaikille muille => semafori rw Andrews Fig 4.8 Salli lukijoiden toimia rinnakkain Luokan poissulkeminen => semafori rw Eka lukija varaa DB:n lukijaluokalle, viimeinen lukija vapauttaa DB:n Kuka on eka / viimeinen? => laskuri nr testaa, varaa / vapauta => atominen: < > Andrews Fig 4.9 and Fig 4.10 Andrews: ss. 167-169 3-8

Andrews Fig. 4.8: An overconstrained solution.

Andrews Fig. 4.9: Outline of readers and writers solution.

Andrews Fig. 4.10: Readers and writers exclusion using semaphores.

Ratkaisu 2: R/W synkronointiongelmana Odota, kunnes sopiva ehto tulee todeksi Toiminnallisuus: < await (ehto) lauseet; > Ehdon testaus ja lauseosa atomiseksi Tila BAD: (nr > 0 and nw > 0) or nw > 1 RW: (nr == 0 or nw ==0) and nw <= 1 RW muuttumaton, oltava voimassa aina nr = number of readers, nw = number of writers Ohjelmoi s.e. ehto RW on aina true saa lukea nw == 0 saa kirjoittaa nr==0 and nw==0 3-12

Andrews Fig. 4.11: A coarse-grained readers/writers solution.

Ratkaisu 2, laajennettu Ota huomioon käyttövuorot Lukijat ensin, tai Vuoro prioriteetin perusteella: Kirjoittajat ensin! (jos muutokset tärkeitä; nälkiintymisvaara) Onko, joku odottamassa vuoroa? Ei voi kysyä semafori-operaatioilla oma laskuri Vuorojen toteutus rutiinissa SIGNAL Kriittinen alue vapautuu joku muu saa jatkaa, kuka? odottava lukija, odottava kirjoittaja, kokonaan uusi tulija Andrews Fig. 4.12 3-14

Jaettu binääriarvoinen semafori Liitä kuhunkin vahtiin (ehtoon) semafori ja laskuri Vain yksi semafori kerrallaan auki ( 0 <= (e+r+w) <= 1) await (nw==0) nr = nr+1 semafori: r = 0 waiting place for readers laskuri: dr number of delayed readers await (nr==0 and nw==0) nw = nw+1 semafori: w = 0 waiting place for writers laskuri: dw number of delayed writers poissulkeminen < > semafori: e = 1 waiting place for entry laskurit: nr, nw numbers of readers and writers 3-15

process Reader { while (true) { # <await (nw == 0) nr = nr + 1;> # read the database; <nr = nr -1;> P(e); #varmistaa atomisuuden if (nw > 0){ #joudutaan odottamaan dr = dr + 1; nr=nr+1; SIGNAL; V(e); P(r);} P(e); #varmistaa atomisuuden nr=nr-1 } } SIGNAL;

process Reader { while (true) { # <await (nw == 0) nr = nr + 1;> # read the database; <nr = nr -1;> P(e); #varmistaa atomisuuden if (nr>0 or nw > 0){ #joudutaan odottamaan dw = dw + 1; nw=nw+1; SIGNAL; V(e); P(w);} P(e); #varmistaa atomisuuden nw=nw-1 } } SIGNAL;

Andrews Fig. 4.12: Outline of readers and writers with passing the baton.

SIGNAL - vuoron antaminen: Lukijat ensin! if (nw == 0 and dr > 0) { dr = dr -1; V(r); # herätä odottava lukija, tai } else if (nr == 0 and nw == 0 and dw > 0) { dw = dw -1; V(w); # herätä odottava kirjoittaja, tai } else V(e); # päästä joku uusi etenemään Menetelmä: Viestikapulan välitys (Baton passing) 3-19

Viestikapulan välitys (Baton passing) Vain yksi etenee kerrallaan kriittisillä alueilla pyydettävä etenemislupaa: P(e) se etenee, joka saa semaforin e (~ viestikapula) Muiden odotettava Kokonaan uusi lukija tai kirjoittaja: P(e) Jos etenijän pyyntöön ei voi suostua: Lukijat: V(e); P(r) Kirjoittajat: V(e): P(w) 3-20

Etenijä aktivoi itse seuraavan viestikapulan haltijan (kohdassa SIGNAL) jos odottajia, herätä odottaja semaforista: joko V(r) tai V(w) jätä sille poissulkemissemafori valmiiksi kiinni: älä tee V(e) jos ei odottajia, jätä viestikapula vapaaksi uusille tulijoille: V(e) Herätetty välittää aikanaan kapulan seuraavalle ja se seuraavalle ja... Takaa ettei kukaan pääse etuilemaan! Ehdot taatusti voimassa, kun jonottaja saa prosessorin SIGNAL aktivoi vain yhden prosessin, kun ehto tuli todeksi FCFS 3-21

SIGNAL - vuoron antaminen: Lukijat ensin! if (nw == 0 and dr > 0) { dr = dr -1; V(r); # herätä odottava lukija, tai } else if (nr == 0 and nw == 0 and dw > 0) { dw = dw -1; V(w); } else V(e); # herätä odottava kirjoittaja, tai # päästä joku uusi etenemään Osa ehdoista on jo tiedossa, kun ollaan lukijassa tai kirjoittajassa => voidaan jättää pois eikä tarvitse enää testata! 3-22

Andrews Fig. 4.13: A readers / writers solution using passing the baton. Lukijat ensin Tarpeettomat osat annetusta SIGNAL-koodista poistettu

SIGNAL - vuoron antaminen: Kirjoittajat ensin! Reader: uusi lukija odottamaan, jos kirjoittaja odottamassa (rivi 5) if (nw>0 or dw>0) # DELAY { dr=dr+1; V(e); P(r); } Writer: herätä lukija vain, jos kirjoittajia ei odottamassa (rivi 13) if (dw>0) { # SIGNAL dw = dw-1; V(w); } elseif (dr>0) { dr = dr-1; V(r); } else V(e); # herätä kirjoittaja # herätä lukija # herätä uusi Muuta kuvaa 4.13 vastaavasti 3-24

Resurssien hallinta ja vuoronantaminen 3-25

Resurssien hallinta Manageri Objektit: varaus ja vapautus Vuorot: kuka odottajista saa jatkaa? Sisäinen kirjanpito kustakin erillisestä resurssista (private) ominaisuudet (esim. muistiosoite, koko, ) vapaa / varattu käyttäjä (esim. prosessin ID) Rajapinta, API (public) pyydä(parametrit) vapauta(parametrit) 3-26

Operaatioiden raaka runko pyydä(parametrit) < await (pyyntöön voi suostua) anna resurssi, merkitse varatuksi > vapauta(parametrit) < palauta resurssi kirjanpitoon > Vrt. entry protocol, exit protocol 3-27

Muistinhallinta (3) pyynnöt sivu kerrallaan prosessi c2 Muistinhallinta prosessi c1 GET pagepool ----- GET --- REL --- --- GET --- REL --- --- GET --- REL ---- koodi REL count mutex 1 avail 0 jono koodi FCFS! c3 c4 3-28

int count=max; sem mutex=1, avail=max; function GET(): returns addr { P(avail) ; // await P(mutex); // anna, merkitse get = pagepool[count]; count = count-1; V(mutex); } procedure REL(addr freepage) { P(mutex); // palauta count = count+1; pagepool[count] = freepage; V(mutex); V(avail) ; // pyyntöön voi suostua } pagepool 1,7,3,8,5,6,2,9,.. count mutex 0 avail 6 3-29

Toimivatko rutiinit oikein Poissulkeminen? Ei lukkiutumista (deadlock/livelock)? Ei tarpeettomia viipeitä? Lopulta onnistaa? 3-30

VÄÄRIN! int count=max; sem mutex=1, avail=max; function GET(): returns addr { P(mutex); P(avail) ; 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(avail) ; V(mutex); } avail 6 3-31

Resurssien hallinta, Yleinen ratkaisu pyydä(parametrit) P(mutex); # poissulkeminen if (pyyntöön ei voi suostua) DELAY; # odota semaforissa anna resurssi; SIGNAL; vapauta(parametrit) P(mutex); palauta resurssi; SIGNAL; DELAY ~ V(mutex), P(odotussemafori) SIGNAL ~ V(odotussemafori) else V(mutex) DELAY: Älä jätä prosessia Blocked-tilaan tärkeä semafori kiinni! SIGNAL: Herätä odottaja, jätä kriittinen alue kiinni (baton passing). 3-32

Palvelujärjestys Semaforin jonot aina FCFS Ongelma? Jäljellä 10 sivutilaa, eka haluaa 12, toka 5! Voiko semaforiin liittää prioriteetin? Jonotusjärjestys? Montako erilaista? Dynaaminen vuorottelu? Ratkaisu: yksityiset semaforit + oma jono Kullekin prosessille oma semafori, jossa odottaa yksin Vuoron antamiseen käytettävä tietorakenne (jono) erikseen alkiossa semafori ja kenties muuta tietoa Vuorottaja valitsee sopivan prosessin vuorojonosta, ja päästää liikkeelle semaforissa odottavan asiakkaan 3-33

Muistinhallinta (4) pyynnöt useita sivuja kerralla --- GET --- REL --- --- GET --- REL --- C3 PCB --- GET --- REL ---- GET { P(mutex) if DELAY SIGNAL } { P(mutex) SIGNAL } pagepool REL mutex 1 jono RQ pyynnöille count 10 count sem 12 C1 PCB FCFS! 3-34

procedure GET (nbr_of_units) { P(mutex); if (request can not be satisfied) { # DELAY RQ[tail].count = nbr_of_units; V(mutex); P(RQ[tail].sem); } take nbr_of_units for this process; if (! empty(rq) and RQ[i].count < count) V(RQ[i].sem); # SIGNAL else procedure REL (list_of_units) { V(mutex); P(mutex); } return units into pagepool; if (! empty(rq) and RQ[i].count < count) V(RQ[i].sem); # SIGNAL else V(mutex); }

SJN: Lyhyin työ seuraavaksi request(time,id): P(e); if (!free) DELAY; free = false; SIGNAL; release(): P(e); free = true; SIGNAL; 3-36

DELAY: Odottajan ID ja TIME (suoritusaika) suoritusajan mukaan järjestettyyn jonoon (PAIRS) oikeaan kohtaan V(e) eli vapauta kriittinen alue jää odottamaan vuoroasi P(b[ID]) Tässä tarvitaan kullekin oma semafori, jotta pystytään herättämään oikea prosessi: b[n] = ([n] 0) PAIRS-jono määrää järjestyksen: herätetään aina jonon ensimmäinen prosessi SIGNAL: Reguest-vaihe vapauta kriittinen alue V(e) eli päästä joku uusi Requestvaiheeseen Release-vaiheen lopussa Jos jonossa odottajia, niin ota jonon ensimmäisen alkiopari (time, ID) ja herätä prosessi ID: V(b[ID]; muuten V(e) 3-37

Andrews Fig. 4.14: Shortest job next allocation using semaphores.

Entä, jos resurssia enemmän kuin 1 yksikkö? amount = montako yksikköä prosessi tarvitsee tai palauttaa avail = montako yksikköä on vapaana (~free) request: testattava, onko vapaana tarvittu määrä yksiköitä amount <= avail. Jos on, niin varataan, muuten talletetaan myös amount myös tässä voidaan vapauttaa odottavia prosesseja, jos vapaita resursseja on tarpeeksi release: vapautetaan jonosta ensimmäinen prosessi, jonka tarpeet pystytään tyydyttämään 3-39

POSIX-kirjasto, pthread # include <pthread.h> pthread_mutex_init(), _lock(), _trylock(), _unlock(), _destroy() _mutexatrr_*(), pthread_rwlock_init(), _rwlock_rdlock(),_rwlock_tryrdlock(), _rwlock_wrlock(), _rwlock _trywrlock(), _rwlock_unlock(), _rwlock_destroy(), _rwlockattr_*(), # include <semaphore.h> sem_init(), sem_wait(), sem_trywait(), sem_post(), sem_getvalue(), sem_destroy(), Kurssi: Ohjelmointitekniikka (Java) Kurssi: Verkkosovellusten toteuttaminen Lue man- / opastussivut Java ei semaforeja synchronized objects oma toteutus? Andrews ch 4.6, 5.5 3-40

Kertauskysymyksiä? 3-41