Helsingin yliopisto
Tietojenkäsittelytieteen laitos

Rinnakkaisohjelmistot,syksy 2005, Harjoitus 5

5. - 9.2005

Andrews: 5.2 Monitors, ss 215-224 (ks. myös 5.4-5.5 pthreads-kirjasto ja Java, vaikka näistä ei kysytä kokeessa), 7.1-7.5 Message Passing, ss 295-314, Stallings 5.6 Message Passing

Tehtävissä harjoitellaan sekä monitorin että sanomanvälityksen käyttöä prosessin tahdistamiseen. Etenkin sanomavälitystehtävissä ymmärtämisen helpottamiseksi kannattaa piirrellä kuvia.


1 - MONITORI TOIMIVAKSI

  1. Alla oleva monitorin koodi ei toimi joka tilanteessa oikein. Selvitä, mitä ongelmia ohjelmassa on. Tutki esimerkiksi, mitä tapahtuu, kun potilaat ja lääkäri pääsevät monitoriin järjestyksessä:
          i) potilas1, lääkäri, potilas2;
          ii) potilas1, potilas2, lääkäri;
          iii) lääkäri, potilas1, potilas2; 
    
  2. Korjaa koodi oikein toimivaksi ja varmista lisäksi, että potilaat pääsevät tutkimukseen saapumisjärjestyksessä.
        monitor Vastaanotto {
        cond sisään;
        cond ulos;
        cond tutki;
        boolean varattu  =  false;
           
       procedure Tulevastaanotolle ( ) {    # potilaan koodi
          if (varattu) wait(sisään);        # odota sisäänkutsua  
          varattu = true;        # merkitse varatuksi      
          mene tutkimushuoneeseen
          signal(tutki);    # ilmoita lääkärille
          ole tutkittavana
          wait(ulos);     #  jää odottamaan poistumismerkkiä
          poistu tutkimushuoneesta  
       }
      
       procedure Tutkipotilas ( ) {   # lääkärin koodi
          signal(sisään); # kutsu potilas sisään
          wait(tutki); # odotetaan potilasta   
          tutki potilas 
          signal(ulos);   # anna poistumissignaali
          varattu =false; # vapauta tutkimushuone    
          }
       }
                                                                                                                                                 
      process Potilas(  )[i = 1 to n]  {
          while (true) {
             tee mitä ikinä teet
             tuntuu sairaalta
             call  Vastaanotto.Tulevastaanotolle ( );
            
          }
       }
    
       process Lääkäri(  ) {
          while (true)  call Vastaanotto.Tutkipotilas( );
        }
    
    

2 - NUKKUVA PARTURI MONITORIIN

Nukkuvan parturin monitor-ratkaisu on esitetty Andrewsin kirjan kuvassa 5.10.

  1. Mitkä while-lauseet voisivat olla if-lauseita? Perustele. Minkä vuoksi kirjan ratkaisussa ko. kohdissa on kuitenkin while-lauseet? Vihje: huomaa, että monitor-proseduurin toiminta on suurimmaksi osaksi keskeytymätöntä.
  2. Esitä parturiongelmalle yksinkertaisin mahdollinen perusratkaisu ts. oleta signal-and-continue -semantiikka, ja että partureita ja tuoleja on vain yksi (ks. kirjan kuva 5.9). Perustele tekemäsi muutokset.
  3. Laajenna parturiliikettä: yleistä kuvan 5.10 ratkaisua siten, että parturiliikkeessä toimii useita partureita samaan aikaan.

3 - PROSESSIEN TAHDISTUS SANOMANVÄLITYKSELLÄ

Laskenta on jaettu rinnakkaisuuden saavuttamiseksi N:lle eri prosessille. Niihin on ohjelmoitu vikasietoisuutta varten joukko tahdistuspisteitä: jos jotain menee pieleen, voidaan myöhemmin jatkaa jostain tahdistuspisteestaä.

Aina kun prosessin suoritus saapuu tahdistuspisteeseen, se tallettaa sen hetkiset tilatietonsa levylle. Tallettamisensa se saa tehdä vasta kun, kaikki muutkin prosessit ovat saaneet tahdistusta edeltävät vaiheet valmiiksi ja päässeet omaan tahdoistuspisteeseensä. Suoritus saa jatkua laskennan seuraavaan vaiheeseen vasta, kun kaikki ovat saaneet tallettamisensa valmiiksi. Prosessien välinen kommunikointi perustuu sanomanvälitykseen.

Esittele kommunikoinnissa tarvittavat kanavat ja kirjoita tahdistukseen tarvittavat koodin osat.

4 - SANOMANVÄLITYSTÄ KORVATUNTURILLA

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.

5 - PANKKITILIN YHTEISKÄYTTÖ

Pankkitili on usean henkilön käytössä, joista jokainen voi tallettaa tilille tai nostaa tililtä rahaa. Tili ei saa koskaan mennä negatiiviseksi. Koodaa palvelin, joka huolehtii tilin käytöstä. Asiakkaat voivat pyytää joko jonkun rahasumman talletusta tai rahasumman nostoa. Jos tilillä ei ole tarpeeksi rahaa, niin pyyntöä viivytetään. Asiakkaat ja palvelin käyttävät sanomanvälitystä kommunikointiin.

6 - TIETOKANTAPALVELIN

Toteutetaan lukijat/kirjoittajat -ongelmalle sellainen ratkaisu, jossa varsinaiset lukija- ja kirjoittajaprosessit eivät pääsekään suoraan käsiksi tietokantaan, vaan esittävät luku- ja kirjoituspyyntönsä tietokannan kirjoittamisesta ja lukemisesta huolehtiville palvelijaprosesseille (n kappaletta). Valvottava tietokanta on omassa erillisessä palvelimessaan ja vain palvelijaprosesseilla on pääsy tietokantaan. Asiakkaiden (lukijat ja kirjoittajat) ja palvelijoiden välinen kommunikointi perustuu asynkroniseen sanomanvälitykseen. Piirrä kuva tilanteesta. Mitä kommunikointikanavia tarvitaan? Millaisia ovat niissä kulkevat sanomat? Miten asiakkaat pyytävät luku- tai kirjoituspalvelua? Hahmottele palvelijaprosessien koodi.

Vihje: Koska yhteistä tietokantaa käyttäviä palvelijaprosesseja on monta, niin ratkaisussa on varmistettava, että vain yksi prosessi kerrallaan on kirjoittamassa eikä kukaan ole tällöin lukemassa. Lukuja voidaan tehdä useita samanaikaisesti. Palvelijaprosessit voivat käyttää kirjan kuvassa 5.5 esitettyä monitoria luku- ja kirjoitustoimintojen synkronointiin.

7- ANNA PALAUTETTA KURSSISTA
mutta mielellään vasta kokeen jälkeen, jotta voit kommentoida myös koetta käsitteleviä kohtia.

Se, joka ei koskaan epäile, ei tiedä mitään.

Liisa Marttinen