Løsningsforslag til eksamen i INF03 Kjell Åge Bringsrud (oppgave 4 og 5) Dag Langmyhr (oppgave 2 og 3). desember 2003 Sigbjørn Næss (oppgave og 6) Boolsk algebra Sannhetsverditabellen er vist i tabell på neste side. Ved hjelp av Carnaugh-diagrammene i figur funksjonene forenkles til ge_0 = + a le_8 = a 3 + a 2a a 0 Kretsdiagrammene med logiske porter er vist i figur 2 på neste side. (Det finnes andre varianter som også er OK; man kan for eksempel skrive om uttrykkene ved hjelp av de Morgans teorem og få enklere kretser ved å bruke NAND- ognor-porter.) Signalet eq_9 kan lages ved å koble ge_0 og le_8 tilinngangenpåen 2-inputs NOR-port. a a Figur : Carnaugh-diagram for henholdsvis ge_0 og le_8. 2 Oversettelse ;;; Rutinenavn: neven 2 ;;; Synopsis: Finne antall partall i en vektor. 3 ;;; Signatur i C: short neven(short a[]) 4 ;;; Inn-parametre: R0: adressen til a[0] 5 ;;; Ut-parametre: R0: resultatet 6 ;;; Registre: R0: &a[ix] 7 ;;; R: a[ix] 8 ;;; R2: n 9 ;;; R3: 00-ix 0 neven: st R,saveR ; Gjem unna registre. 2 st R2,saveR2 ; 3 st R3,saveR3 ;
a ge_0 le_8 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Tabell : Sannhetsverditabellen det spørres etter i oppgave a ge_0 a a le_8 ge_0 le_8 eq_9 Figur 2: Kretser for henholdsvis ge_0, le_8 og eq_9 2
4 5 and R2,R2,#0 ; n = 0; 6 ld R3,v00 ; r3 = 00; 7 8 loop: ldr R,R0,#0 ; r = a[ix]; 9 add R0,R0,# ; ++ix; 20 and R,R,# ; r = r & 0x000 2 brnp test ; if (r==0) 22 add R2,R2,# ; ++n; 23 test: add R3,R3,#- ; --r3; 24 brp loop ; Gå i løkke inntil r3==0. 25 26 add R0,R2,#0 ; r0 = n; 27 ld R,saveR ; Hent tilbake registre. 28 ld R2,saveR2 ; 29 ld R3,saveR3 ; 30 ret ; Retur. 3 32 v00:.fill 00 ; Konstanten 00 33 saver:.fill 0 ; Gjemmested for registre. 34 saver2:.fill 0 ; 35 saver3:.fill 0 ; 3 C-programmering char *db_get (char *k) 2 { 3 /* Find data for given key k in the structure. */ 4 5 struct db_elem *p = db_first; 6 7 while (p) { 8 if (strcmp(p->key,k) == 0) return p->data; 9 p = p->next; 0 } 2 /* Requested element does not exist; return NULL. */ 3 4 return NULL; 5 } 6 7 void db_remove (char *k) 8 { 9 struct db_elem *p = db_first, *p2 = NULL; 20 2 if (db_first == NULL) { 22 /* There is nothing to do when the structure is empty. */ 23 24 return; 25 } 26 27 while (p) { 28 if (strcmp(p->key,k) == 0) { 29 /* Remove this element. */ 30 3 if (p2 == NULL) { 32 /* The element is first in the list. Let db_first point past p. */ 33 34 db_first = p->next; 35 } else { 36 /* The pointer p2 points to the element _preceding_ p. 3
37 Let p2->next point past p. */ 38 39 p2->next = p->next; 40 } 4 42 /* Remove the element: */ 43 44 free(p->key); free(p->data); free(p); 45 return; 46 } 47 48 p2 = p; p = p->next; 49 } 50 } 4 Tildeling av prosessortid 4a Hensikten er å gjøre tildelingen av prosessortid mer rettferdig ved at de prosessene som har mye igjen av sitt tildelte tidskvant settes inn lenger fram i proessorkøen enn de som nesten har brukt opp hele sitt tidskvant. Prosessene settes inn i køen så noenlunde i henhold til forbrukt tid. 4b Fordelen er at man får en mer rettferdig tildeling av prosessoren. Ulempen er at prosessoren må bruke tid på å regne ut hvor i køen prosessen skal plasseres hver gang prosessen gir fra seg prosessoren eller interuptes. 5 Internminne 5a Det logiske minnet er vanligvis større enn den fysiske, men benyttes fordi prosesser likevel skal kunne allokeres til et kontinuerlig (logisk) minneområde. Siden det logiske området er større enn det fysiske minne, vil vanligvis ikke alle deler av det logiske området ligge inne i minne samtidig (noe må swappes ut på disk). Det logiske minnet adresseres med logiske adresser, og disse må på en eller anen måte mappes over i de virkelige fysiske adressene til minnelokasjonene i maskinen. Denne mappingen vil skje til adresselokasjoner som er ledig når mappingen foretas, og innebærer ikke at de nødvendigvis tilordnes et kontinuerlig område i det fysiske minnet. 5b Vanligvis vil første delen av adressen til minnelokasjon angi hvilken side man skal til mens den andre halvdelen angir offset innenfor en side. Dersom en side er en potens av 2 stor, vil offset passe nøyaktig inn i de minst signifikante bit-ene i adressen. 5c Følgende vil skje: 4
FIFO LRU 072 (Minnet fylles iniyielt opp.) 072 (Minnet fylles iniyielt opp.) 723 (Page fault; 3 skal inn.) 723 (Page fault; 3 skal inn.) 723 (Side 2, 7 og brukes i rekkefølge.) 723 (Side 2, 7 og brukes i rekkefølge.) 7230 (Page fault; 0 skal inn.) 720 (Page fault; 0 skal inn 3 skal ut siden den har ligget lengst.) 7230 (3 brukes.) 703 (Page fault; 3 skal inn 2 går ut siden den har ligget lengst.) Som det går fram av oversikten, vil FIFO føre til 2 page faults og LRU føre til 3. 5d Ved bruk av LRU må systemet hele tiden holde orden på hvilke sider som har ligget lengst i minne. Med et stort antall sider, vil dette innebære mye bokføring, og man vil fortsatt kunne få situasjoner som den i oppgave 5c der en side swappes ut for deretter å skulle brukes igjen umiddelbart. 6 Flervalgsoppgave 6a 6b 6c 6d 6e 6f 6g 6h 6i 6j 3 4 3 3 4 4 3 4 5