UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i Eksamensdag: 12. desember 2003 Tid for eksamen: 09.00 12.00 Oppgavesettet er på 5 sider. Vedlegg: INF3140/4140 Modeller for parallellitet Ingen Tillatte hjelpemidler: Alle trykte og skrevne Kontroller at oppgavesettet er komplett før du begynner å besvare spørsmålene. Først noen generelle råd og bemerkninger: Oppgavesettet består av tre uavhengige deler. Det er mange oppgaver og dermed viktig at du disponerer tiden godt. Poengene angitt på hver del antyder hvor mye vekt de forskjellige delene vil bli tillagt ved sensuren. Totalt kan du oppnå 60 poeng for denne besvarelsen. Merk at ikke alle deloppgaver teller like mye. Om oppgaveteksten på noe punkt er uklar eller upresis, kan du gjøre dine egne presiseringer. Formulér i så fall disse tydelig i oppgavebesvarelsen din. Legg vekt på å gi korte og klare forklaringer. (Fortsettes på side 2.) Lykke til!
Eksamen i INF3140/4140, 12. desember 2003 Side 2 Oppgave 1 Analyse (20 poeng) Det har den senere tid vært uklart hvor mange som faktisk reiser med Kolsåsbanen, så Malin og Tore bestemmer seg for å telle antall passasjerer på neste tog. Et tog består av én eller flere vogner. For å effektivisere arbeidet, bestemmer Tore seg for å løpe gjennom vognene og telle antall passasjerer i hver vogn. Ved fullført opptelling i en vogn skriver han tallet på en tavle. Malin skal beregne totalt antall passasjerer på toget. Dette gjør hun ved å legge antallet passasjerer som Tore har skrevet på tavlen, til summen hun har beregnet for vognene som allerede er talt. For å forsikre seg om at ingen passasjerertall går tapt, bruker de to tellere s og l. Vi lar s reprentere antall ganger Tore har skrevet et tall på tavlen og l representere antall ganger Malin har lest et tall fra tavlen. Vi antar at toget har n > 0 vogner, og at antall passasjerer i hver vogn er gitt i arrayet VOGN[n]. Et utkast til program er følgende: int tavle, s = 0, l = 0; process Tore { int vogn[n] = VOGN[n]; while (s < n) { <await (s == l); > tavle = vogn[s]; s = s+1; ## arrayet vogn[n] inneholder tallene ## som Tore skal levere til Malin process Malin { int passasjerer[n]; while (l < n) { <await (l < s); > if (l == 0) then passasjerer[l] = tavle else passasjerer[l] = passasjerer[l-1] + tavle; l = l+1; 1a Analyseregel (5 poeng) Analyseregelen for programsetningen if (B) S; er følgende: Formuler en analyseregel for utsagnet (Fortsettes på side 3.) {P B S {Q P B Q {P if (B) S; {Q {P if (B) then S1; else S2 {Q?
Eksamen i INF3140/4140, 12. desember 2003 Side 3 1b Invariant (5 poeng) Formuler en invariant for programmet over. 1c Kritiske regioner (5 poeng) Angi hva som er kritiske regioner i de to prosessene. Begrunn svaret. 1d Interferensfrihet (5 poeng) Er prosessene interferensfrie? Begrunn svaret. Oppgave 2 Monitor (20 poeng) Denne oppgaven ser på monitorer som kontrollerer allokering av minneblokker, men vi ser bort i fra selve den fysiske allokeringen. Anta at vi har to operasjoner request(amount) og release(amount), der amount er et positivt heltall. Når en bruker av monitoren gjør et kall til request må den vente til det er minst amount ledige minneblokker. En bruker frigjør allokert minne ved å gjøre kall til release. Monitoren skal benytte Signal and Continue-disiplin i alle deloppgaver. 2a (7 poeng) Lag en monitor som implementerer request og release. Det stilles ingen krav til rekkefølgen brukere får allokert minne. (Hint: Bruk covering condition metoden.) 2b (7 poeng) Lag en monitor som lar den minst ressurskrevende bruker få allokere først ( shortest-job-first allokeringsdisiplin). 2c (6 poeng) Lag en monitor der brukerne får allokert minne i den rekkefølgen de ankommer monitor ( first-come-first-served allokeringsdisipin). (Fortsettes på side 4.)
Eksamen i INF3140/4140, 12. desember 2003 Side 4 Oppgave 3 Meldingsutveksling (20 poeng) De tre gode vennene Ane, Bo og Kat bor i samme by. De går på kino sammen hver eneste kveld, noe de avtaler ved å sende tekstmeldinger (SMSer) til hverandre, alltid på samme måte: hver venn sender en melding til de to andre. Byen har bare én kinosal så eneste mulige uenighet er hvilken forestilling, dvs. hvilket tidspunkt, vennene skal velge. Dette løser de ved at den som vil gå på kino tidligst får viljen sin. Han/hun bestiller billetter hvis det er noen igjen, også via tekstmelding til kinoen, som svarer på samme måte. Billettkjøperen sier så ifra, stadig via tekstmelding, til de andre om det blir kinotur eller om de skal ta en øl i stedet. Dersom flere vil gå på samme (første) tidspunkt er det en fast regel for hvem som bestiller billetter. Her er et ufullstendig program som representerer vennene som prosesser:... kanal-deklarasjon(er) process Venn[i = 0 to 2] {... lokale variabel-deklarasjoner... while (true) {... bli enig om kinotidspunkt... if (... jeg skal bestille billetter...)... bestill billetter (hvis mulig) og gi beskjed... else... vent på beskjed om kino... if (... fikk bestilt billetter...) gå_på_kino(); # ferdiglaget else ta_en_øl(); # ferdiglaget process Kino { ta_imot_bestillinger(); # ferdiglaget Oppgaven går ut på å fullføre koden over ved å fylle inn der det står... tekst.... Du skal bruke asynkron meldingsutveksling (engelsk: asynchronous message passing). Merk at vennene representeres i en prosesstabell, dvs. samme kode brukes for hver venn. Anta at tidspunktet er et heltall, int. Anta at kodebitene angitt med # ferdiglaget er laget allerede. (Fortsettes på side 5.)
Eksamen i INF3140/4140, 12. desember 2003 Side 5 3a (5 poeng) Lag kanaldeklarasjoner for kommunikasjon mellom vennene, og for kommunikasjon med kinoen. Lag lokale variabeldeklarasjoner. 3b (15 poeng) Lag kode for: (i) å bli enige om kinotidspunktet, samt å avgjøre hvem som skal bestille billetter. (ii) å bestille billetter hvis mulig, samt å gi og motta beskjed om dette.