Harjoitusten vastaukset

Tietokoneen toiminta, Itseopiskelukurssi, HT 5 vast
HUOM: Katso nämä vastaukset vasta tehtyäsi itse tehtävät. Oppiminen tapahtuu pääasiassa tehtäviä ratkottaessa. Vastauksen katsominen heti kättelyssä on hyvän tehtävän hukkaanheittämistä oppimisen näkökulmasta.

  1. Aliohjelmat, makrot, literaalit, muuttujat, vakiot
    1. Anna esimerkki tilanteesta, jossa rutiini XYZ olisi parempi toteuttaa makrona kuin aliohjelmana. Perustelut? Esimerkki? XYZ on koodisarja, joka voi esiintyä missä tahansa rutiinissa. Se voi olla niin lyhyt, että sen toteuttaminen aliohjelmana aiheuttaisi turhan paljon yleisrasitetta. Voi olla myöskin, että jostain syystä halutaan nimenomaan käyttää nimiparametriä, mitä yleensä ei ole aliohjelmissa.
    2. Anna esimerkki tilanteesta, jossa rutiini XYZ olisi parempi toteuttaa aliohjelmana kuin makrona. Perustelut? Esimerkki? XYZ on yleiskäyttöinen rutiini, jonka käyttäytyminen halutaan pitää hyvin selkeästi rajattuna. Makroissa käytettyjen tunnusten merkitys vaihtelee sen mukaan, missä päin koodia makroa käytetään.
    3. Anna esimerkki tilanteesta, jossa on parempi toteuttaa lukuarvo X literaalina kuin vakiona käskyssä? Perustelut? Esimerkki? X on hyvin suuri, joten se ei mahdu vakioon. X:n arvo voi olla koodin kirjoitushetkellä vielä määrittelemätön, mutta jollain tavalla sille määritellään arvo literaalialueelle ennen koodin suoritusta.
    4. Anna esimerkki tilanteesta, jossa on parempi toteuttaa lukuarvo X vakiona käskyssä kuin literaalina? Perustelut? Esimerkki? X on pieni kokonaisluku, jolla ei ole mitään suurempaa semanttista merkitystä. Esimerkiksi, X on luku 1, joka listään loopin muuntelumuuttujan arvoon. Jos se toteutettaisiin literaalina, siitä aiheutuisi helposti vältettävissä oleva muistiviite.
    5. Miten literaalin käyttö eroaa muuttujan käytöstä? Edut? Haitat? Miten voidaan estää literaalin arvon muuttaminen?
      Literaalit on yleensä talletettu omalle muistialueelleen, joka voidaan suojata halutulla tavalla (esim. read-only). Literaalit ovat aina globaaleja, ja siten kaikkialla käytettävissä. Joissakin järjestelmissä sallitaan myös alustamattomien literaalien käyttäminen, jolloin literaalin arvo määritellän vasta siihen ensi kertaa viitattaessa.
    6. Miten literaalin käyttö eroaa käskyn vakio-osan käytöstä? Edut? Haitat?
      Literaalit ovat aina literaalialueella muistissa, joten niiden käytöstä seuraa aina ylimääräinen muistiviite. Literaaleilla on olla (yhtä käskyä) isompi semanttinen merkitys (esim. taulukon koko), jolloin literaalin arvoa muuttamalla uusi arvo näkyy heti kaikissa literaalin käyttöpaikoissa.

  2. Oletetaan, että levyn pyörimisnopeus on 7200 rpm, siinä on yksi luku/kirjoituspää per levypinta, sylintereiden (uraa per levypinta) lukumäärä on 2000, joka uralla on 50 sektoria ja sektorin koko on 0.5 KB. Otaksumme (epärealistisesti), että hakuvarren siirtoaika on lineaarinen urien lukumäärän suhteen ja että se on 0.02 ms per ura. Otaksumme (epärealistisesti), että luettavan tiedoston jokaisen sektorin sijainti on täysin satunnainen levyllä, mistä saadaan todennäköisyyslaskentaa käyttäen keskimääräiseksi ylitettävien urien lukumääräksi 667. Otaksumme edelleen (epärealistisesti), että tiedosto luetaan levyltä yksi sektori kerrallaan. Kauanko kestää 333.33 KB tiedoston lukeminen levyltä keskimäärin? Entä 24 MB tiedoston lukeminen?
    Pyörähdysaika on 60s/7200 = 8.33 ms. Yhden sektorin lukuaika on 667*0.02ms + 0.5*8.33ms + 8.33ms/50 =17.7ms. Pienen 333.33 KB tiedoston lukuaika on 667 * 17.7ms = 11.8s. Ison 24 MB tiedoston lukuaika on 48*1024*17.7 ms = 870s, koska yleensä levytiedostojen kokoja laskiessa 1MB=1024KB.

  3. Linkitys. Miten Tanenbaumin kirjan [Tane10 tai Tane06] kuva 7-15 (b) muuttuisi, jos moduulit linkitettäisiinkin (alhaalta ylöspäin) järjestyksessä ACDB kuvassa 7-15 käytetyn järjestyksen ABCD asemesta?

    Huomaa, että kuvassa 7-15 osoitteet kasvavat ylöspäin. Moduulit on esitelty kuvassa 7-14 [Tane10 tai Tane06].
    Moduuli A: sijainti 100, josta hyppy Branch to 300, B:n kutsu CALL 1300
    Moduuli B: sijainti 1300, josta hyppy Branch to 1600, C:n kutsu Call 500
    Moduuli C: sijainti 500, josta hyppy Branch to 700, D:n kutsu Call 1000
    Moduuli D: sijainti 1000, josta hyppy Branch to 1200

  4. Muistiinkuvattu I/O. Esimerkissä driver.k91 on kuvattu laiteajuri suoraa I/O toteutusta käyttäen. 
    1. Miten laiteohjain tietää, mitä sen pitäisi tehdä?
      Laiteajuri käskyttää sitä asettamalla kontrollirekisterin (muistipaikka 1048576) arvoksi 1.
    2. Mitä laiteajuri tekee sillä aikaa kun laite on tulostamassa lukua?  Kauanko tähän voi kulua aikaa?
      Suorittaa tiukassa loopissa lukien tilarekisteriä (muistipaikka 1048577). Odotusaika ei ole rajattu. Voi olla miljoonia konekäskyjä..
    3. Miten laite (laiteohjain) kertoo laiteajurille, että laitteelle annettu tehtävä on suoritettu?
      Tilarekisterin (muistipaikka 1048577) arvo asetetaan nollasta poikkeavaksi.
    4. Miten varsinainen (laiteajuria kutsunut) sovellusohjelma saa tietää, että laitteelle annettu tehtävä on suoritettu? 
      Kontrolli palaa sovellusohjelmalle laiteajurilta. SVC:llä kutsuttu laiteajuri tekee IRET-käskyn (interrupt return).
    5. Kuinka k.o. laiteajuria tulisi muuttaa, jos tulostus tehtäisiinkin epäsuoraa I/O:tä käyttäen? Tarkoitus ei ole antaa tarkkaa vastausta koodattuna, vaan kertoa pääpiirteissään, mitä kaikkea esimerkin ajurissa tulisi muuttaa, jos haluttaisiin käyttää epäsuoraa I/O:ta. 
      Mitä etua/haittaa tästä olisi? Tuleeko tästä mitään muutoksia tulostinlaitteiston (laiteohjaimen) vaatimuksiin?
      Laiteajuri ei jääkään odottamaan Wait-looppiin, vaan antaa suosiolla suoritusvuoron pois. Kun laiteohjain saa tehtävänsä valmiiksi, se merkitsee tiedon siitä tilarekisteriin ja antaa I/O-laitekeskeytyksen laiteajurille. Kun laiteajuri saa suoritusvuoron, se tarkistaa tilarekisteristä tiedot ja jatkaa muuten kuten suoraa I/O:ta käyttäen.
      ...
      SVC  SP, =SWITCH_PROCESS     ; give turn to some other process
      LOAD R1, @PtrStat ; resume here after I/O interrupt
      COMP R1, =fAllOK ; check status register if I/O failed or not
      ... 
      I/O:n odotusaikana voidaan nyt tehdä tuottavaa työtä, olettaen että valmiina suoritukseen -jonosta löytyisi joku muu ajokelpoinen prosessi. Laiteohjaimen tulee olla vähän älykkäämpi, koska se pitää pystyä antamaan I/O-laitekeskeytyksiä.

  5. Tämän viikon TitoTrainer tehtävät

Ylimääräisiä keskustelutehtäviä

  1. Mitä merkitystä sillä on, kutsutaanko laiteajuria aliohjelmakutsulla (CALL), käyttöjärjestelmän palvelukutsulla (SVC) vai viestillä (IPC, inter-process communication)?

  2. Miksi I/O:n toteutuksessa usein halutaan käyttää useita prosesseja (esim. laiteajuri)? Eikö olisi kätevämpää vain suorittaa I/O kerralla loppuun sitä haluavan prosessin toimesta?

  3. Mitä etua/haittaa on siitä, että laiteajuri toimii koko ajan etuoikeutetussa tilassa?

  4. Miksi käännös, linkitys ja lataus ovat erillisiä toimenpiteitä? Eikö olisi kätevämpää yhdellä kertaa muuntaa ohjelma korkean tason kielestä suoritettavaksi prosessiksi?

  5. Miten ja milloin Titokoneessa ilmenee käännös, linkitys ja lataus -käyttöjärjestelmäpalvelut?

  6. Anna kertauskysymystehtävän vastausvaihtoehtoja hyvine selityksineen seuraavaan kertauskysymykseen: "Mitkä seuraavista väitteistä liittyen  I/O:n toteutukseen ovat totta?"
    1. Anna ainakin kolme vastausvaihtoehtoa, jotka ovat totta.
    2. Anna ainakin kolme vastausvaihtoehtoa, jotka eivät ole totta.
    3. Anna ainakin kaksi vastausvaihtoehtoa, jotka voivat ehkä olla totta tai sitten ei.
    Palauta vastausvaihtoehdot selityksineen ohjaajalle. Tee vastausvaihtoehdot ja selitykset sellaisiksi, jotta niiden käyttö olisi hyödyllistä muille kurssin opiskelijoille. Vastausta saatetaan käyttää uuden kertaustehtävän laadinnassa. Jos vastausta ei saa käyttää tähän tarkoitukseen, mainitkaa asiasta palautuksessa.