581332-8 Rinnakkaisohjelmistot




Erilliskuulustelu 27.9.2005
Kirjoita jokaiseen vastauspaperiisi nimikirjoituksesi ja nimen selvennys sekä kokeen nimi että päivämäärä.
Vastausohjeita:
  1. Vastaa lyhyesti seuraaviin kysymyksiin. [15 p]
    1. Mitä tarkoittaa "puomisynkronointi" (barrier synchronization)? Anna esimerkki puolisynkronoinnin käytöstä. (5 p)
    2. Mitä tarkoittaa, että tietty toimenpidesarja on suoritettava 'atomisena' (atomically)? Käytä esimerkkinä toimenpidesarjaa < x = x+1; y = y+1;>.(5 p)
    3. Miten etäproseduuri eroaa tavallisesta proseduurista? Mitä etäproseduuria kutsuttaessa tapahtuu kutsuvalle prosessille ja kutsutulle proseduurille? (5 p)

  2. Karhu ja mehiläiset ja semaforit [15p]
    Karhulla ja M:llä mehiläisellä on yhteinen hunajapurkki. Purkkiin mahtuu H hunaja-annosta, alkujaan se on kuitenkin tyhjä. Karhu nukkuu kunnes purkki on täyttynyt, sitten se syö kaiken hunajan ja jatkaa tämän jälkeen uniaan. Kukin mehiläinen kerää jatkuvasti hunajaa purkkiin. Mehiläinen, joka saa purkin täyteen, herättää karhun. Mehiläiset voivat jatkaa purkin täyttämistä vasta, kun karhu on lopettanut syömisen. Kuvaa karhu ja mehiläiset prosesseina ja kirjoita koodi, joka simuloi niiden toimintaa. Käytä semaforeja prosessien synkronointiin.
  3. Komponenttien kommunikointi sanomanvälitystä käyttäen [15 p]
    Hajautetun sovelluksen komponentit toimivat eri koneissa kaukana toisistaan, solmujen väliset yhteydet ovat hitaita ja saattavat joskus olla poikki. Sovelluksen komponentit kommunikoivat sanomanvälitystä käyttäen. Heikkolaatuisista yhteyksistä huolimatta sovelluksen toiminta edellyttää luotettavaa monilähetystä eli sitä, että sanoma välitetään joko kaikille ryhmä jäsenille tai sitten ei kenellekään.

    1. Esitä kaaviokuvana tai muuten selkeästi, miten lähettäjän ja vastaanottajien kommunikointi tulee hoitaa, jotta voidaan varmistua siitä, että kaikki vastaanottajat ovat todella saaneet sanoman tai jos näin ei ole, niin sanoman saaneet eivät siihen reagoi. (5 p)
    2. Kirjoita luotettavan monilähetyksen toteuttava rutiini käyttäen send ja receive -operaatioita ja globaaleja kanavia (lähettäjän koodi riittää, vastaanottajan koodia ei tarvitse kirjoittaa).(10 p)

  4. Monitori toimivaksi [15 p]
    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 eri ärjestyksessä:
      i) potilas1, lääkäri, potilas2;
      ii) potilas1, potilas2, lääkäri;
      iii) lääkäri, potilas1, potilas2; (6 p)
    2. Korjaa koodi oikein toimivaksi. Voit tehdä korjaukset tehtävän koodiin tai kirjoittaa ihan oman Vastaanottomonitorin ja sitä käyttävät prosessit lääkärille ja potilaille. (6 p)
    3. Miten varmistat potilaiden pääsyn tutkimukseen saapumisjärjestyksessä? (3 p)
          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( );
          }