Tietokoneen toiminta, kesä 2000

Harjoitus 5

Käsitellään harjoitusryhmissä tiistaina 22.8.2000.

  1. Aliohjelma HuliViliHei käyttää ajoaikaista pinoa (siis aktivointitietuepinoa) välitulostensa tallettamiseen, koska rekisterit eivät riittäneet. Ohjelmointivirheen vuoksi osa näistä välituloksista jää pinoon (eli niitä ei ole poistettu sieltä esimerkiksi POP käskyillä), kun aliohjelmasta poistutaan EXIT käskyllä.
    Onko tästä haittaa ohjelman suoritukselle? Toisin sanoen, voiko aktivointitietuepino mennä sekaisin? Miksi menisi? Miksi ei menisi?

  2. Liukulukujen esittäminen
    1. Esitä luku 47.875 bittitasolla IEEE:n yksinkertaisen tarkkuuden liukulukuna.
    2. Muunna seuraavat yksinkertaisen tarkkuuden liukuluvut kymmenjärjestelmän luvuiksi:
                0 10000000 11000000000000000000000 
                0 10000010 10010000000000000000000 
      

  3. Hamming-koodi
    1. Kirjainmerkkien A ja B ASCII-koodit ovat kymmenjärjestelmässä 65 ja 66. Esitä merkkijono AB biteillä Hamming-koodia käyttäen.
    2. Oletetaan, että 7. bitti (oikealta) on muuttunut. Näytä, miten Hamming-koodi havaitsee ja korjaa muuttuneen bitin. Entä miten käy, jos kaksi bittiä muuttuu?
    3. Miksi Hamming-koodin käyttö ei ole hyvä ratkaisu langattomien verkkojen tiedonsiirron turvaamiseen?

  4. Välimuisti. Oletetaan, että tiedon saantiaika välimuistista on 1ns ja tavallisesta muistista 10 ns per sana. Välimuistin lohkon (rivin) koko on neljä sanaa. Oletetaan, että välimuistia käytettäessä 98% muistiviitteistä löytyy välimuistista.
    1. Jos välimuistia ei käytetä, niin kauanko keskimääräisesti kestää datan (1 sana) lukeminen rekisteriin?
    2. Jos välimuistia käytetään, niin kauanko keskimääräisesti kestää datan (1 sana) lukeminen rekisteriin?
    3. Miten prosessi tietää, löytyikö tieto välimuistista vai ei?
    4. Miten sovelluksen käyttäjä (ihminen) tietää, löytyikö tieto välimuistista vai ei?
    5. Miten käyttäjä (ohjelmoija) voi vaikuttaa välimuistin tehokkuuteen?

  5. Tutki ja selitä tätä CASE-toteutusta. Toimiiko ratkaisu?Jos ei, niin miten muuttaisit ratkaisua, jotta se toimisi? Vihje: numeroi käskyt ja anna symboleille numeeriset arvot, kokeile KOKSIlla.
    program CAse_case(input,output);
    var Eksponentti, Arvo : Integer;
    BEGIN
      Readln(Arvo,Eksponentti);
      case Eksponentti of
        0: Arvo := 1;
        1: ;
        2: Arvo := SQR(Arvo);
        3: Arvo := Arvo * SQR(Arvo);
      end;
      Writeln(Arvo)
    END.
    
    Eksponentti   DS 1
    Arvo          DS 1
    BEGIN  IN     R1,=KBD
           STORE  R1,Arvo
           IN     R2,=KBD
           STORE  R2,Eksponentti
           JNEG   R2,Virhe
           COMP   R2,=3
           JGRE   Virhe
           JUMP   @Case(R2)
    Case   DC Case0
           DC Case1
           DC Case2
           DC Case3
    Case0  LOAD   R3,=1
           JUMP   Esac
    Case2  LOAD   R3,Arvo
           MUL    R3,R3
           JUMP   Esac
    Case3  LOAD   R3,Arvo
           MUL    R3,R3
           MUL    R3,Arvo
    Esac   STORE  R3,Arvo
    Case1  LOAD   R3,Arvo
           OUT    R3,=CRT
    END    SVC    SP,=HALT  
    Virhe  SVC    SP,=HALT
    
  6. Oletamme, että virtuaalimuistijärjestelmässä
    1. Miten monta alkiota on sivutaulussa? Miten monta sivutilaa on keskusmuistissa?
    2. CPU suorittaa ohjelmaa, joka viittaa muuttujaan osoitteessa 2060. Selvitä miten tämän muuttujan todellinen muistiosoite saadaan, kun viitattu sivu sijaitsee viittaushetkellä keskusmuistin sivutilassa 10.
    3. Mitä tapahtuu, jos ko. sivu ei ole muistissa? Miten sivun puuttuminen havaitaan?