UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i IN 147 Program- og maskinvare Eksamensdag: 12. mai 1997 Tid for eksamen: 9.00 15.00 Oppgavesettet er på 6 sider. Vedlegg: Tillatte hjelpemidler: Ingen Alle Kontroller at oppgavesettet er komplett før du begynner å besvare spørsmålene. Dette oppgavesettet består av 5 oppgaver som kan løses uavhengig av hverandre. Der det er snakk om programmering, skal programmene lages slik at de kan kompileres eller assembleres med gcc -ansi på SGI-maskinene her ved Ifi. Oppgave 1 JK-flip-flop (Total vekt 20%) Lykke til! Figur 1 viser en såkalt JK-flip-flop, der J, K og Clk er innganger, mens Q og Q er utganger. Forandringer på utgangene er knyttet til den fallende flanken på klokken (Clk), altså når klokken går fra høy til lav. J Q Clk K Q Figur 1: En JK-flip-flop Sammenhengen mellom inngangene J og K og utgangen Q er vist i sannhetsverditabellen i tabell 1 på neste side. Q(t) refererer til gjeldende verdi på utgangen, mens Q(t+1) sier hva utgangen blir etter første fallende flanke på Clk. (Fortsettes på side 2.)
Eksamen i IN 147, 12. mai 1997 Side 2 J K Q(t) Q(t+1) 0 0 0 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 Tabell 1: Sannhetsverditabellen for en JK flip-flop 1-a Boolsk ligning (Vekt 10%) Anta at du skal implementere en JK-flip-flop ved hjelp av en D-flip-flop. Skriv ned den enklest mulige ligningen for inngangssignalet D til D-flip-flop-en. 1-b Implementasjon med D-flip-flop (Vekt 10%) Tegn skjema for en JK-flip-flop basert på en D-flip-flop og et nettverk av AND-, OR- og NOT-porter. Oppgave 2 Primtall (Total vekt 25%) I figur 2 på siden etter er vist en C-funksjon som finner alle primtall mindre eller lik max og returnerer disse i en vektor prim. 2-a Oversettelse (Vekt 18%) Oversett denne funksjonen til MIPS assemblerspråk. Det er ikke nødvendig å ta hensyn til prosessorens pipeline. Hint Det er ikke nødvendig å forstå hvorledes denne funksjonen virker for å kunne oversette den. 2-b Pipeline (Vekt 7%) Vis (ved å referere til linjenummer) hvilke endringer som må gjøres i din løsning av forrige spørsmål for å ta hensyn til en pipeline med følgende egenskaper: Prosessoren steiler («stall-er») når instruksjonen etter en load avhenger av load-instruksjonen. Instruksjonen etter et hopp utføres alltid. Velg de endringer som reduserer eksekveringstiden. (Fortsettes på side 3.)
Eksamen i IN 147, 12. mai 1997 Side 3 #define FALSE 0 #define TRUE 1 #define MAX_PRIME 1000 Figur 2: En C-funksjon for å finne primtall unsigned char is_prime[max_prime+1]; void primes(int max, short prim[]) int i, j, n_prim = 0; if (max > MAX_PRIME) max = MAX_PRIME; for (i = 0; i <= max; i++) is_prime[i] = TRUE; for (i = 2; i <= max; i++) if (is_prime[i]) prim[n_prim++] = i; for (j = 2*i; j <= max; j += i) is_prime[j] = FALSE; prim[n_prim] = 0; Oppgave 3 Lagring av tekst (Total vekt 15%) Én ulempe ved Cs representasjon av tekst er at den ikke kan inneholde tegnet '\0'; et annet problem er muligheten for feil hvis man refererer utenfor tekstobjektet. Vi ønsker derfor å introdusere en ny representasjon av tekster basert på følgende deklarasjoner: typedef unsigned char uc; typedef struct uc *buf; int length; text; Her er buf en peker til en uc-vektor som inneholder teksten, mens length angir hvor mange tegn det er i den. text-variabelen t1 som inneholder "abcd" skal for eksempel representeres slik: t1 4 r - a b c d 3-a Henting av tegn fra tekst (Vekt 5%) Skriv funksjonen uc textfetch(text *t, int pos) som henter tegnet i posisjon pos (regnet fra 0) i t. Eksempelvis skal kallet (Fortsettes på side 4.)
Eksamen i IN 147, 12. mai 1997 Side 4 struct set int lower; int upper; double mean; vector[256]; Figur 3: Vektor med strukturer void adjust(int index, int lower_val, int upper_val, double mean_val) if (lower_val<vector[index].lower vector[index].upper<upper_val) vector[index].mean = mean_val; vector[index].lower = lower_val; vector[index].upper = upper_val; cx = textfetch(&t1,1) gi tegnet 'b' i cx. Hvis pos angir en posisjon utenfor teksten, skal det returneres en blank. 3-b Innsetting av tegn i tekst (Vekt 10%) Skriv funksjonen void textstore(text *t, uc c, int pos) som setter tegnet c inn i posisjon pos i t. Hvis pos<0, skal funksjonen ikke gjøre noe. Hvis pos 0 og angir en posisjon utenfor teksten, skal teksten utvides med blanke til den blir lang nok. (Dette innebærer at det må allokeres en ny vektor som buf kan peke på.) For eksempel skal kallet textstore(&t1, 'x', 7) resultere i at t1 nå ser slik ut: t1 8 r - a b c d x Oppgave 4 Hukommelseshierarki i en bussbasert multiprosessor (Total vekt 20%) Figurene 3 og 4 viser to varianter av en prosedyren adjust() og datastrukturen den opererer på. I figur 3 er dataene organisert som én vektor med struct-er, mens i figur 4 er datastrukturen organisert som 3 vektorer som ligger etter hverandre i hukommelsen. En int er et 32-bits heltall og en double er et 64-bits flyttall. Anta en maskin med felles hukommelse og to prosessorer. Prosessorer og hukommelse er knyttet sammen med en buss. Bussen kan bare brukes av en prosessor av gangen, og arbitrering blir brukt for å bestemme hvilken prosessor som slipper til først når begge prosessorene ønsker å bruke bussen (Fortsettes på side 5.)
Eksamen i IN 147, 12. mai 1997 Side 5 int lower[256]; int upper[256]; double mean[256]; Figur 4: Separate vektorer void adjust(int index, int lower_val, int upper_val, double mean_val) if (lower_val<lower[index] upper[index]<upper_val) mean[index] = mean_val; lower[index] = lower_val; upper[index] = upper_val; samtidig. Anta for enkelthets skyld at de to prosessorene veksler på å få bruke bussen. Hver prosessor har en «write back direct mapped» data-cache på 2 Kbyte, der det blir satt av plass ved miss i cache-en ved skriveoperasjoner. Cache-linjene er på 16 byte. For at prosessorene skal aksessere korrekte data implementerer maskinen cache-koherens ved hjelp av en «write invalidate»- protokoll. 4-a Simulering med koden i figur 3 (Vekt 7%) Utifra koden i figur 3, anta at prosessor 1 utfører prosedyrekallet adjust( 0, 16, 53, 78.16 ) samtidig med at prosessor 2 utfører prosedyrekallet adjust( 2, -6, 57, 11.37 ) og at testen i prosedyren adjust() slår til for begge prosessorene. Vis hvordan de to prosessorene aksesserer dataene og hvordan cache-ene betjener disse aksessene (inkludert tilstandsendingene), og hvilken trafikk som opererer på bussen. 4-b Simulering med koden i figur 4 (Vekt 7%) Løs forrige oppgave utifra koden i figur 4. 4-c Vurdering (Vekt 6%) Beskriv hvordan de to variantene fra figur 3 og figur 4 passer med maskinen, for eksempel med hensyn på cache-hit/miss-rater og antall bussaksesser. Oppgave 5 Trikk på enkeltspor (Total vekt 20%) Anta at vi har en trikkelinje som normalt går på dobbeltspor men som ett sted går på enkeltspor: Vest Øst (Fortsettes på side 6.)
Eksamen i IN 147, 12. mai 1997 Side 6 Vi skal lage et kontrollsystem som skal hindre kollisjoner på denne enkeltsporstrekningen. I dette systemet skal hver trikk være en egen prosess. 5-a Semaforer (Vekt 4%) Vis hvordan man kan bruke semaforer til å sikre at kun én trikk av gangen kjører på enkeltsporstrekningen. 5-b Forbedret løsning (Vekt 10%) Å kun kjøre én trikk av gangen gir dårlig utnyttelse av linjen. Utvid løsning fra forrige spørsmål slik at trikker som går østover får lov å kjøre inn på enkeltsporet hvis det er andre trikker der som også kjører østover; det tilsvarende skal gjelde for trikker som går vestover. Hint Dette problemet er en variant av leser/skriver-problemet. 5-c Monitorer (Vekt 6%) Implementér løsningen fra forrige spørsmål med monitorer.