Stýrikerfi I
09.12.41


Lokapróf 13. desember 1995


Leyfileg hjálpargögn: Kennslubækur og fyrirlestranótur


1. [10%] Búa á til 2 GB harðan disk með 20 plötum (skrifað á allar hliðar) þar sem hægt er að lesa allt að 154KB á msek. við bestu aðstæður. Ef gert er ráð fyrir að geirarnir séu 70 og að hver þeirra geymi 512 bæti, lýsið þá öðrum eiginleikum disksins (snúningshraða, fjölda spora) og áætlið leitartíma (access time) disksins.


2. [15%] Segjum að þið eigið að hanna reiknieiningu fyrir IEEE fleytitölur. Eitt af markmiðunum er að engir aukastafir (aukabitar er líklega réttara orð) tapist við reikniaðgerðir. Ef unnið er með 64-bita fleytitölur hve stór þurfa gistun þá að vera til að hægt sé að geyma í þeim niðurstöður aðgerðanna + eða * með fullri nákvæmni? En ef gjörvinn vinnur eingöngu með 32-bita fleytitölur?
Athugið að þið þurfið í raun að hanna nýjar gerðir fleytitalna með meiri bitafjölda og annari skiptingu milli svæða en einföld nákvæmni (32 bitar) og tvöföld nákvæmni (64 bitar). Einnig þurfið þið að réttlæta að þær gerðir geti geymt niðurstöður aðgerðanna í fullri nákvæmni og noti til þess lágmarksfjölda bita.


3. [10%] Í 8086 smalamálinu er skipunin xlat. Hún yfirleitt notuð til að ná í gildi úr töflu. Skipunin býst við að DS:BX bendi á töfluna og að AL innihaldi vísi (index) inn í töfluna. Eftir framkvæmd xlat inniheldur AL gildið sem er í töflunni. Ástæðan fyrir nafninu xlat er að það má ímynda sér að skipunin varpi (translate) gildinu í AL yfir í nýtt gildi.
Ein möguleg notkun á töflu er til að reikna heiltölu-kvaðratrót fyrir gildi á bilinu 0 til 255.
a)
Sýnið hvernig hægt er að leysa það vandamál með xlat skipuninni.
b)
Leysið sama vandamál án notkunar á xlat.
Þið þurfið ekki að búa til alla töfluna, sýnið bara fyrstu gildin í henni.


4. [20%] Hér að neðan er C++ kódi fyrir fall sem leitar með helmingunarleit að gildinu x í vektornum f. Fallið er skrifað endurkvæmt, sem er líklega ekki hraðvirkasta útgáfan, en er stutt og einföld. Skrifið eins fall í 8086-smalamáli. Það verður að vera endurkvæmt og kallanlegt úr Borland C++ (þ.e., verður að meðhöndla staflaramma rétt).
          // Notkun:	k = leita(f, i, j, x);
          // Fyrir:	f[i..j-1] er svæði í f, sem raðað er í vaxandi röð
          // Eftir:	i <= k <= j, f[i..k-1] < x <= f[k..j-1]

          int leita( int f, int i, int j int x ) {
              if( j-i < 1 ) return i;
              int m = (i+j)/2;
              if( f[m] < x )
                  return leita(f, m+1, j, x);
              else
                  return leita(f, i, m, x);
          }


5. [10%] Gjörvi nokkur hefur 6 þrepa pípun og 2 biðhólf (þ.e., næstu tvær skipanir á eftir hopp-skipun framkvæmast alltaf). Hér að neðan er forritsbútur fyrir þennan gjörva. Hvaða gildi hefur b í lokin? Ef þið þurfið að gefa ykkur einhverjar forsendur um hegðun pípunnar takið þær þá skýrt fram.
           load      b, 0
           load      a, 1
           cmpb, >   b, 0, yfir        ; ef b > 0 þá hoppa í yfir
           cmpb, <>  a, b, ut          ; ef a <> b þá hoppa í ut
   yfir    inc       b                 ; hækka b um 1
           add       b, 2              ; hækka b um 2
           utdec     b                 ; lækka b um 1


6. [10%] Hugmyndir um hvernig hægt sé að auka hraða á örgjörvum nýta sér oft eiginleika sem aðeins tilteknar gerðir forrita hafa. Hinn aukni hraði myndi þá aðallega koma fram í þess konar forritum. Hvernig á að ákveða hvort framkvæma eigi breytinguna á gjörvanum? Hvaða þættir koma þar við sögu? Er hægt að meta þá af einhverri nákvæmni?


7. [15%] Skrifið fallið hér að neðan sem PA-RISC smalamálsfall, sem fær inn tvö gildi í %arg0 og %arg1 og skilar margfeldi þeirra í %ret0.
          // Notkun:	k = margf(i, j);
          // Fyrir:	i og j eru heiltölur ³ 0
          // Eftir:	k er i*j

          int margf( int i, int j ) {
              int m = 0;
              while( i!=0 ) {
                  if( i%2 == 1 ) m = m+j;
                  j = 2*j;
                  i = i/2;
              }
              return m;
          }


8. [10%] Gefið er að Pentium örgjörvinn hefur tvö 8KB innri skyndiminni (skipana og gagna) sem bæði eru með tvær línur í mengi og að línustærðin er 32 bæti. Vistföng í Pentium eru 32 bitar.
a)
Lýsið þessum skyndiminnum aðeins nánar (skiptingu vistfangs, o.fl.)
b)
Sýnið forrit (í Pascal, C, eða sauðakóda) sem nýtir sér upplýsingarnar um gerð skyndiminnisins til að hægja á gjörvanum (þ.e., klekkja á skyndiminninu!)