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.