Kurssikoe 10.12.2004
Vastausohjeita:
Oheinen
ratkaisu tuottaja-kuluttaja-ongelmaan ei toimi oikein. Mitä
virheitä ratkaisussa on ja mitä toimintaongelmia nämä
virheet aiheuttavat? Onko mahdollista lisätä tuottajien
ja kuluttajien rinnakkaisuutta? Jos on, niin miten? Korjaa koodi
oikein toimivaksi tai kirjoita aivan oma ratkaisusi. Muista
liittää kommentteja omaan koodiisi, vaikka annetussa
koodissa ei niitä olekaan!
char buffer[n];
int start = 0, end = 0;
sem empties = n, fulls =1, turn = 0;
process Producer[i=1 to M] {
char data;
....
while (true) {
.....
produce data;
P(empties);
P(turn);
buffer[end] = data;
end = (end + 1) % n;
V(fulls);
V(turn);
}
}
process Consumer[i=1 to N] {
char result;
.....
while (true) {
.....
P(turn);
P(fulls);
result=buffer[start];
start= (start + 1) % n;
V(turn);
V(empties);
use result;
}
}
Pitkän pohdinnan
jälkeen aterioivat filosofit (N kappaletta) olivat viimein
oivaltaneet, että yhdelläkin haarukalla on mahdollista
syödä spagettia ja jonkun aikaa harjoiteltuaan olivat
oppineet käteviksi yhdellä haarukalla syöjiksi. Nyt
kaikki pääsivät vaikka yhtä aikaa syömään
eikä kenenkään tarvinnut odotella nälkäisenä.
Tästä tosin syntyi uusi ongelma, sillä pöydällä
oleva spagettikulho oli melkein aina typötyhjä. Tähänkin
keksittiin ratkaisu: otettiin apupoika ruokapalkalla (spagettia!)
huolehtimaan ruuanvalmistuksesta.
Aina kun kulho on tyhjä,
poika valmistaa lisää spagettia, täyttää
filosofien ruokakulhon kukkuroilleen (M lautasellista) ja vie sen
pöydälle. Sitten poika syö keittiössä
kattilan pohjalta ja jää odottetelemaan kulhon
tyhjenemistä. Filosofit pääsevät taas
normaalirutiiniinsa: syömään spagettia ja syömisen
jälkeen ajattelemaan. Jokainen filosofi ottaa yhdellä
syöntikerralla yhden lautasellisen. Kun kulho aikanaan
tyhjenee, filosofit herättävät pojan valmistamaan
lisää spagettia.
Toteuta filosofit ja
apupoika prosesseina, joiden toiminta synkronoidaan monitoria
käyttäen. Kirjoita monitorin koodi sekä koodit
filosofiprosesseille sekä apupoikaprosessille.
Lähes koko vuoden
Pukin vetoporot vaeltavat Lapin tuntureilla ja syövät
jäkälää muiden porojen kanssa. Jouluaaton
lähestyessä vetoporot kokoontuvat Korvatunturille Pukin
pajan läheisyyteen. Kun kaikki N vetoporoa ovat saapuneet
paikalle, vetoporoista Petteri Punakuono ilmoittaa tästä
Pukille. Pukki valjastaa porot lahjareen eteen ja niin lähdetään
matkaan lahjoja jakamaan.
Kun Pukki on saanut
jaettua lahjat kaikille maailman lapsille, porot kiidättävät
Pukin taikareen takaisin Korvatunturille, jossa Pukki kiittää
poroja ja vapauttaa ne vaeltamaan muiden porojen kanssa.
Toteuta Pukki ja porot
prosesseina, jotka kommunikoivat sanomanvälitystä
käyttäen. Piirrä kaaviokuva, josta selviää
Pukin ja porojen välinen kommunikointi. Kirjoita Pukki-ja
Petteri-prosessin ja muiden poroprosessien koodit.