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

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

Rinnakkaisohjelmointi, Syksy 2006

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

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Projekti 1 Säikeet ja kriittisen vaiheen kontrollointi javalla

Monitorit -projekti Rinnakkaisohjelmointi

RINNAKKAINEN OHJELMOINTI A,

11. Javan toistorakenteet 11.1

T Henkilökohtainen harjoitus: FASTAXON

Olio-ohjelmointi Javalla

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

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

Rajapinta (interface)

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Johdatus Java 1.5:n semaforeihin

12. Javan toistorakenteet 12.1

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

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

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

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

12. Javan toistorakenteet 12.1

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

9. Periytyminen Javassa 9.1

Luento 6. T Ohjelmoinnin jatkokurssi T1 & T Ohjelmoinnin jatkokurssi L1. Luennoitsija: Otto Seppälä

Ohjelmoinnin peruskurssien laaja oppimäärä

14. Poikkeukset 14.1

Graafisen käyttöliittymän ohjelmointi Syksy 2013

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

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

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

10 Lock Lock-lause

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

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

8. Näppäimistöltä lukeminen 8.1

1 Tehtävän kuvaus ja analysointi

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

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

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

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

9. Periytyminen Javassa 9.1

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

Lukkiutuminen. Taustaa

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

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

8. Näppäimistöltä lukeminen 8.1

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

Olio-ohjelmointi Virhetilanteiden käsittely

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

Mikä yhteyssuhde on?

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

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

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

11. Javan valintarakenteet 11.1

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

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

Luokat ja oliot. Ville Sundberg

Luokan sisällä on lista

Periytyminen (inheritance)

812315A Ohjelmiston rakentaminen. Asynkronisuus

1. Omat operaatiot 1.1

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

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

7. Näytölle tulostaminen 7.1

58131 Tietorakenteet ja algoritmit (syksy 2015)

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

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Poikkeustenkäsittely

12. Näppäimistöltä lukeminen 12.1

7. Oliot ja viitteet 7.1

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

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

Tietokannat II -kurssin harjoitustyö

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

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Javan perusteita. Janne Käki

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

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Metodien tekeminen Javalla

Oliot viestivät metodeja kutsuen

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

5. Luento: Rinnakkaisuus ja reaaliaika. Tommi Mikkonen,

TIETORAKENTEET JA ALGORITMIT

Algoritmit 1. Demot Timo Männikkö

HOJ Säikeet (Java) Ville Leppänen. HOJ, c Ville Leppänen, IT, Turun yliopisto, 2012 p.1/55

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

Java kahdessa tunnissa. Jyry Suvilehto

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Listarakenne (ArrayList-luokka)

16. Javan omat luokat 16.1

11. Javan valintarakenteet 11.1

2 Konekieli, aliohjelmat, keskeytykset

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Transkriptio:

Semaforit Javassa Mari Kononow, Eveliina Mattila, Sindi Poikolainen 13.12.2008 HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Ohjetta saa käyttää opetukseen ja jatkokehitykseen

Johdanto Semaforeja käytetään yhtenä ratkaisumenetelmänä kriittisen vaiheen ongelmaan. Semafori ratkaisee poissulkemisongelman seuraamalla ja rajoittamalla kriittiseen vaiheeseen pääsevien prosessien määrää, mutta ei estä prosessien lukkiutumista. Mikäli ohjelmoijan semaforille asettama maksimiraja ei vielä ole täynnä, päästää semafori prosessin etenemään. Jos sallittujen prosessien määrä on jo täyttynyt, joutuu prosessi ensin odottamaan semaforilta etenemislupaa siihen saakka, että jokin aiemmin kriittiseen vaiheeseen etenemään päässyt prosessi luovuttaa omansa. Käyttö tapahtuu prosessissa siten, että kriittisen vaiheen edelle ja jälkeen lisätään semaforin operaatioiden kutsut. Idean alun perin kehittänyt Dijkstra käytti näistä nimityksiä P/V. Operaatioista käytetään yleisesti myös nimiä wait/signal. Prosessissa kriittistä vaihetta edeltävä kutsu P tai wait pyytää semaforilta etenemislupaa. Jos semaforille asetettuja etenemislupia on vielä jäljellä, vähentää semafori tästä määrästä yhden ja sallii prosessin edetä. Muussa tapauksessa prosessi joutuu odottamaan vuoroaan. Kriittisestä vaiheesta poistuttaessa kutsuttava operaatio V tai signal johtaa semaforin etenemislupien määrän lisäämiseen, jolloin mahdollisesti odottamassa olevat prosessit voidaan päästä jatkamaan. Semaforien käyttö Javassa Javassa semaforit on toteutettu luokan java.util.concurrent.semaphore ilmentyminä, jotka alustetaan kutsulla Semaphore(int permits) tai Semaphore(int permits, boolean fair). Integer-arvo määrittää semaforin tarjoamien lupien maksimimäärän, totuusarvomuuttuja fair taas kertoo, suositaanko pisimpään odottamaan joutuneita prosesseja. Semafori, jonka tarjoamien lupien maksimimäärä on rajoitettu kymmeneen, luodaan ja alustetaan esimerkiksi kutsulla Semaphore sem = new Semaphore(10); Prosessi pyytää semaforilta etenemislupaa metodia void acquire(), joka jää odottamaan luvan saamista. Mikäli ohjelmoija ei halua, että prosessi jää odottamaan, voidaan käyttää aksessoria boolean tryacquire(), joka yrittää saada semaforilta

luvan ja palauttaa arvon false, mikäli lupia ei ole jäljellä. Jos odotukseen halutaan käyttää vain rajoitettu aika, metodille tryacquire(long time, TimeUnit unit) määritetään time-parametrillä miten kauan lupaa odotetaan. Odotusajan täyttyessä metodi palauttaa arvon false, jos lupia ei ollut jäljellä eikä niitä ehtinyt vapautua. Yleinen Semafori Yleisessä semaforissa voi saada arvokseen minkä tahansa ei-negatiivisen arvon. Yleisiä semaforeija käytetään laskemaan mm. Kuinka monta prosessia voi päästä suorittamaan kriittistä vaihetta, alustamalla semaforin arvo halutulla ei-negatiivisella arvolla (n). Kun n- määrä prosesseja on suorittamassa kriittistä vaihettaan, semaforin arvo on 0, ja muut prosessit joutuvat odottamaan blocked -tilassa vuoroaan, kunnes jokin suorittavista prosesseista päättää oman suorituksensa ja signalloi odottavaa. Yleistä semaforia voi myös käyttää samalla tavalla kuin counting-semaforia. Sen avulla voi pitää kirjaa saatavilla olevien resurssien määrästä. Counting-semafori ja yleinen semafori mielletään usein samoiksi. Alla on yleinen semafori toteutettu käyttämällä Javan wait() ja notify()-metodeita. Toteutuksessa semaforille annetaan alkuarvo, joka rajoittaa suoritukseen pääsevien prosessien määrää. class semaphore { protected int value = 0 ; protected semaphore() { value = 0 ; protected semaphore(int initial) { value = initial ; public synchronized void P() { value-- ; if (value < 0) try { wait() ; catch( InterruptedException e ) { public synchronized void V() { value++ ; if (value <= 0) notify() ;

Counting- Semafori Counting-semaforin idea on hallita saatavilla olevia resursseja. Counting-semafori on toteutettu yksinkertaisten lukkojen pohjalta siten, että semafori on säikeistä vapaa laskuri. Se saa alkuarvokseen käytettävissä olevien resurssien määrän. Esimerkiksi tietokantaa päivättävässä ohjelmistossa, laskurin määrä olisi saatavilla olevien tietokantayhteyksien määrä. Kun prosessi saa semaforin haltuun, saatavilla olevien tietokantayhteyksien määrää vähennetään yhdellä. Kun resurssia käytetään semafori vapautetaan ja laskuri kasvaa yhdellä. Mikäli prosessi yrittää saada semaforin haltuun kun kaikki resurssit ovat käytössä, se joutuu odottamaan vuoroaan blocked -tilassa. Javalla counting-semafori käyttämällä Javan wait()- ja notify()-operaatioita on toteutettu seuraavasti: public class CountingSemaphore { private int signals = 0; public synchronized void take() { this.signals++; this.notify(); public synchronized void release() throws InterruptedException{ while(this.signals == 0) wait(); this.signals--; Binäärisemafori Binäärisemafori eroaa yleisestä ja counting -semforeista siten, että sillä on totuusarvomuuttuja kokonaislukumuuttujan sijaan. Binäärisemaforin alkuarvo astetaan 1:ksi eli todeksi. Semaforin odotusoperaatio odottaa kunnes muuttujan arvo on 1 (true) ja sen

jälkeen asettaa sen 0:ksi (false). Signallointioperaatio muuttaa arvon 1:ksi (true) herättäen suorititettavan prosessin. Binäärisemaforin käyttö on tehokas mutexiin. Mutexin käyttö suojaa ainoastaan mutual exclusionin kun taas binäärisemaforia käytetään sekä synkronointiin, että mutual exclusioniin. Ben-ari binäärisemaforin avulla toteutettu mutual exclusion [BenA06]): Algorithm 6.1: Critical section with semaphores loop forever p1: non-critical section p2: wait (S) p3: critical section p4: signal(s) p binary semaphore (1,Ø) loop forever q1: non-critical section q2: wait (S) q3: critical section q4: signal(s) q Javassa binäärisemafori toteutetaan parametroimalla Semaphore-luokan konstruktori arvolla 1. Lupia suoritukseen on siis 0 tai 1 kappaletta (tosi, epätosi). Semaforeilla ei ole tietoa omistuksesta, ja näin ollen binäärisemaforin lukon voi aukaista muukin säie kun sen omistaja. Binäärisemaforin käyttö voi olla tehokas tapa esimerkiksi lukkiutumisesta toipuessa. Javalla toteutettu binäärisemafori: public class BinarySemaphore { private boolean locked = false; public AnotherBinarySemaphore() { // constructors public AnotherBinarySemaphore(boolean initial) {locked = initial; public AnotherBinarySemaphore(int initial) { if (initial < 0 initial > 1) throw new IllegalArgumentException("initial<0 initial>1"); locked = (initial == 0);

public synchronized void P() { while (locked) { try { wait(); catch (InterruptedException e) { locked = true; public synchronized void V() { if (locked) notify(); locked = false; Busy-wait -semafori Busy-wait -semafori eroaa muista semaforeista siten, että se ei sisällä sisäistä prioriteettijonoa kutsuvista prosesseista. Odotus on toteutettu busy-wait -silmukalla, jossa prosessi pyörii niin kauan kunnes se pääsee semaforin ohi. Prosessi ei siis mene suspended-tilaan, vaan käyttää suoritinta koko odotuksen ajan, mikä vie turhaan suorittimen laskentatehoa. Busy-wait -semaforin käyttö ei tämän vuoksi ole suositeltavaa, ainakaan mikäli odottavilla prosesseilla ei ole omaa prosessoria käytettävissään. Javassa busy-wait -semaforin käyttö ei juuri eroa binäärisemaforin käytöstä, sillä jos kutsussa lupien määräksi annetaan 1 ja fair -parametri jätetään pois, toimii semafori poissulkemisongelman ratkaisevan busy-wait -semaforin kaltaisesti. Semaforin sisäinen toteutus voidaan toteuttaa myös itse esimerkiksi pelkällä while -loopilla, jossa odotetaan semaforin arvon kasvamista nollaa suuremmaksi. Toteutuksessa voidaan myös mahdollistaa kutsujärjestyksen mukainen suoritus käyttämällä kutsuttavan metodin määrityksessä Synchronized -luokkaa, joka sallii vain yhden prosessin pääsyn kerrallaan busy-wait -silmukkaan.

Jaetut semaforit (Split semaphores) Jaetuilla semaforeilla tarkoitetaan kahta tai useampaa semaforia, joiden S.value arvojen summa on vakio. Nämä avulla saadaan prosessi odottamaan jonkin toisen prosessin toiminnon päättymistä. Jaetut semaforit on usein esitelty tuottaja-kuluttajaongelman yhteydessä, jossa tuottajaprosessin tulee tarkistaa, ettei tule ylituotantoa ja kuluttajan tulee tarkistaa, että tuotetta on jäljellä. Ben-Arin esitys tuottaja-kuluttaja -ongelmasta jaettuja semaforeja käyttäen (Alg.6.8 [BenA06]): Algorithm 6.8: producer-consumer (finite buffer, semaphores) finite queue of datatype buffer empty queue semaphore notempty (0, Ø) semaphore notfull (N, Ø) producer DataType d loop forever p1: d produce p2: wait(notfull) p3: append(d, buffer) p4: signal(notempty) consumer DataType d loop forever q1: wait(notempty) q2: d take(buffer) q3: signal(notfull) q4: consume(d) Tässä esimerkissä semaforit notempty ja notfull muodostavat jaettujen semaforien kokonaisuuden. Niiden arvojen summa on aina N, mikä voidaan ilmaista myös invariantilla: notempty + notfull = N. Tavallisissa jaetuissa semaforeissa N 2, mutta N voi myös olla 1, jolloin puhutaan binäärisistä jaetuista semaforeista. Tällöin kahden semaforin tapauksessa toisen semaforin arvo olisi aina 1 ja toisen 0. Jaettujen semaforien java-toteutus on melko yksinkertainen. Luodaan vain tarvittavan monta tavallista semaforia, joiden arvojen summa on aina haluttu N. Javalla toteutettuna: Semaphore notempty = new Semaphore(0, true); Semaphore notfull = new Semaphore(N, true);

/*** Producer ***/ while(true) { /* non-critical section */ try { notfull.aquire(); catch(interruptedexception ie) { /* error handling */ /** critical section **/ notempty.release(); /*** Consumer ***/ while(true) { /* non-critical section */ try { notempty.aquire(); catch(interruptedexception ie) { /* error handling */ /** critical section **/ notfull.release(); Negatiiviset arvot semaforeissa Yleensä semaforien alkuarvoksi asetetaan aina ei-negatiivinen kokonaisluku, mutta java mahdollistaa myös negatiivisten alkuarvojen käytön. Tämä tarkoittaa sitä, että semaforin signal -operaatiota pitää kutsua N kertaa (N = semaforin negatiivinen alkuarvo), ennen kuin mikään prosessi pääsee semaforin wait -käskyn ohi. Tuottaja-kuluttaja -tapauksessa tätä voisi soveltaa esimerkiksi siten, että tuotetta tulee tuottaa k kappaletta valmiiksi varastoon, ennenkuin kuluttaja voi kuluttaa yhtään tuotetta. Silloin koodi näyttäisi seuraavalta: Semaphore notempty = new Semaphore(-k, true); Semaphore notfull = new Semaphore(N, true); /*** Producer ***/ while(true) { /* non-critical section */ try { notfull.aquire(); catch(interruptedexception ie) { /*error handling*/ /** critical section **/ notempty.release(); /*** Consumer ***/ while(true) { /* non-critical section */

try { notempty.aquire(); catch(interruptedexception ie) { /*error handling*/ /** critical section **/ notfull.release(); (Tulee huomata, että tässä esimerkissä notempty ja notfull eivät enää ole jaettuja semaforeja, sillä niiden kokonaisarvo ei ole vakio!) Tämä on tietenkin hieman epätavallinen tilanne, mutta helpommin ymmärrettävä esimerkki olisi, että tietty määrä operaatioita (merk. Y) tulee suorittaa ennen erästä tiettyä operaatiota W. Alustetaan semaforin S alkuarvoksi Y. Tällöin voidaan suorittaa käsky signal(s) jokaisen Y-operaation jälkeen, ja kun kaikki nämä operaatiot on suoritettu ja semaforin arvo on 1, pääsee operaatio W semaforin läpi suoritukseen. Negatiivisen arvon avulla on myös helppoa selvittää odottavien prosessien määrä, eikä tarvitse esimerkiksi käydä koko prioriteettijonoa läpi.

Liite 1: Esimerkki semaforien käytöstä Javassa: Aterioivien filosofien ongelma import java.util.concurrent.semaphore; public class Philosopher extends Thread { private int id; // Every philosopher has a unique id public static final int COUNT = 4; // The count of philosophers and forks // A (fair binary) semaphore for each fork private static Semaphore[] forks = { new Semaphore(1, true), new Semaphore(1, true), new Semaphore(1, true), new Semaphore(1, true), new Semaphore(1, true) ; // Semaphore for the room, only 4 allowed in the room at the same time private static Semaphore room = new Semaphore(COUNT-1, true); public Philosopher(int id) { // Constructor with philosophers id this.id = id; private void think() { // Method for thinking System.out.println("Philosopher #"+this.id+" thinking..."); private void eat() { // Method for eating try { room.acquire(); // Entering the room forks[this.id].acquire(); // Reserving the forks forks[(this.id + 1)%COUNT].acquire(); catch(interruptedexception ie) { // Catched if interrupted System.out.println("Philosopher #"+this.id+" has been terminated."); return; System.out.println("Philosopher #"+this.id+" is eating..."); forks[this.id].release(); // Releasing the forks forks[(this.id + 1)%COUNT].release(); room.release(); // Leaving the room System.out.println("Philosopher #"+this.id+" has finished eating."); public void run() { // The main program of a philosopher System.out.println("Philosopher #"+this.id+" has been born!"); while(true) { // An eternal loop think(); eat();

public class Diner { // The main class creating the philosophers public Diner() { // Creating COUNT philosophers for(int i = 0; i < Philosopher.COUNT; i++) { new Philosopher(i).start(); public static void main(string[] args) { // Main program of Diner-class new Diner();

Liite 2: Kertaustehtävät Luento 5: Linkki tehtävään: http://db.cs.helsinki.fi/%7ekerola/php/practice.php? file=/home/fs/exmattil/public_html/rio/lukkiutuminen_dijkstra_s08_fi.xml <?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> <task id="tkts10011" type="singleselection" language="fi" author="pikkojoulu"> <!-- taskin attribuutit type = kyselyn tyyppi (singleselection, multiselection, range, text) language = kieli (en,fi,sw) --> <course>rinnakkaisohjelmointi</course> <topic>luento 5 - Lukkiutuminen</topic> <question>mikä on Dijkstran lukkiutumisen havaitsemisalgoritmin toimintaperiaate?</question> <!-- question voi sisältää <IMG> kuva-elementtejä --> <selection iscorrect="false"> <answer>algoritmi laskee lukkiutuimsen todennäköisyyden prosessien maksimiresurssitarpeiden perusteella. </answer> <explanation>pankkiirinalgoritmi (Banker's Algorithm) käyttää apuna prosessien maksimiresurssitarpeita, mutta ei sekään laske lukkiutuimsen todennäköisyyttäniiden perusteella. </explanation> <selection iscorrect="false"> <answer>prosesseja suoritetaan kunnes havaitaan, että prosessin suoritus kestää pidempään kuin oletettu suoritusaika. </answer> <explanation>prosesseille ei ole mahdollista laskea oletettua suoritusaikaa. Prosessi voi joutua esimerkiksi odottamaan käyttäjän syötettä. </explanation> <selection iscorrect="true"> <answer>algoritmin avulla etsitään kaikki prosessit joiden resurssitarpeet voidaan tyydyttää ja

joiden suoritus voi loppua.</answer> <explanation>algoritmi etsii prosessit joiden sen hetken resurssitarpeet voidaan tyydyttää ja oletetaan, että prosessin suoritus loppuu. Prosessien suorituksen päättyessä vapautuvat kaikki sen käyttämät resurssit. Vaihetta toistetaan kunnes ei enää löydy prosesseja joiden suoritus loppuu. Jäljelle jäävät ainoastaan ne prosessit jotka voivat lukkiutua.</explanation> <selection iscorrect="false"> <answer>jos lukkiutuminen tapahtuu niin palataan lukkiutumista edeltävään tilaan ja tallennetaan tieto niistä prosesseista jotka seuraavassa tilassa lukkiutuvat.</answer> <explanation>lukkiutumista edeltävään tilaan palaamista voidaan käyttää lukkiutumisen purkamiseen, mutta sen avulla ei voi havaita lukkiutuvia prosesseja. </explanation> </task>

Luento 9: Linkki tehtävään: http://db.cs.helsinki.fi/%7ekerola/php/practice.php?file=/home/fs/exmattil/public_html/rio/yleist %E4_luento9_s08_fi.xml <?xml version="1.0" encoding="iso-8859-1" standalone="yes"?> <task id="tkts10011" type="singleselection" language="fi" author="pikkojoulu"> <!-- taskin attribuutit type = kyselyn tyyppi (singleselection, multiselection, range, text) language = kieli (en,fi,sw) --> <course>rinnakkaisohjelmointi</course> <topic>luento 9 - Samanaikaisuuden hallinta hajautetussa ympäristössä</topic> <question>mikä seuraavista väitteistä pitää paikkansa?</question> <!-- question voi sisältää <IMG> kuva-elementtejä --> <selection iscorrect="false"> <answer>rendezvous-palvelinmallissa vastaanottavan prosessin tulee tietää kutsuvan prosessin id. </answer> <explanation>vastaanottajan ei tarvitse tietää kutsuvan prosessin id:tä, vaan päinvastoin kutsuvan prosessin tulee tietää vastaanottajan id. </explanation> <selection iscorrect="false"> <answer>rpc-palvelinmallissa ei koskaan voi olla useita samanaikaisia kutsuja </answer> <explanation>kutsuja voi olla useampi aktiivisena samaan aikaan, mikäli mutex-ongelma on ratkaistu kutsuttavan palvelun sisällä eikä kutsuvassa prosessissa.</explanation> <selection iscorrect="false"> <answer>synkronoidussa kommunikaatiossa vain vastaanottava prosessi odottaa kommunikaation valmistumista.</answer> <explanation>synkronoidussa kommunikaatiossa kummankin prosessin tulee odottaa kunnes kommunikaatio valmistuu.</explanation>

<selection iscorrect="true"> <answer>vastaanottajan odotussemantiikkana voi olla toiminnan jatkaminen, vaikka viestiä ei olisi vielä saapunut.</answer> <explanation>vastaanottajan ei välttämättä tarvitse saada viestiä toiminnan jatkamiseksi, vaikka viestin odottaminen onkin tavallisempaa.</explanation> </task>