Försättsblad till skriftlig tentamen vid Linköpings Universitet Cover page for written exam at Linköping University Datum för tentamen Date of exam Sal Room Tid Time Kurskod Course code Provkod LADOK code Kursnamn/benämning Course name Institution Department Antal uppgifter som ingår i tentamen Number of assignments Antal sidor på tentamen (inkl. denna) Number of pages including cover Jour/Kursansvarig Responsible/Examiner Telefon till examinator Phone to examiner Besöker salen ca kl. Time of exam visit Kursadministratör Course administrator Tillåtna hjälpmedel Allowed aids 2012-06-01 TER1, TER2 14:00-18:00 TDDI04 TEN1 Operativsystem, realtids- och processprogrammering Concurrent programming, Operating systems and real-time operating systems IDA 8 uppgifter med totalt 45p (90 halvpoäng) 8 assignments for a total of 45 points 7 Klas Arvidsson klas.arvidsson@liu.se 013-28 24 90 Examinator besöker salen efter ca en timme After about one hour Madeleine Häger Dahlqvist 013-28 23 60, madeleine.hager.dahlqvist@liu.se Ordbok, enkel miniräknare (+,-,*,/) Dictionary, pocket calculator. Övrigt Other information Typ av papper Paper to use Antal anmälda Number of students signed up För betyg 3 krävs minst 11p på varje del. Resultat från duggan 2012-03-13 ersätter resultatet på Del VT1 om detta är fördelaktigt. Betygsgränser: U < 50% < 3 < 67% < 4 < 84% < 5 Gränserna är ungefärliga och kan komma justeras. Gränserna är endast stark vägledning till betyget. Det faktiska betyget sätts baserat på helhetsintryck (speciellt för gränsfall). Resultatet tillkännages efter (inom) 10 arbetsdagar. För full poäng krävs tydliga och motiverade svar om inget annan anges. Råder oklarhet om frågans formulering skall examinator tillfrågas vid besök i salen. Är detta inte möjligt skall oklarheten beskrivas i ditt svar, och du svarar så som du tror frågan är menad. Orimliga antaganden eller förenklingar av frågan ger poängavdrag. Rutigt, linjerat eller blankt No preference 114 1 (7)
TIPS: Byt uppgift minst var 30:e minut (eller varför inte använda round-robin med 10 minuters quanta?) Del VT1 (22.5p) 1. Operativsystemets grundstenar (6.5p) a) Vilka data lagras om en process? Vilka data lagras om en tråd? Hur förhåller sig kerneltrådar, processer och usertrådar till varandra? Var ligger ansvaret att schemalägga kerneltrådar, processer och usertrådar? (2.5p) b) Varför behövs trådar i operativsystemet? Varför kan man inte bara göra en sak i taget tills det är klart? Motivera. (1p) Kalle beskriver hur ett systemanrop för att läsa en fil går till. Så här beskriver han: 1) Processen kör i user-mode och behöver läsa en fil. 2) Processen sparar uppdraget (läsa fil) tillsammans med information om hur mycket som skall läsas, vilken fil det gäller och var den lästa informationen skall lagras på operativsystemets kernelstack. 3) Processen frågar OS om lov genom ett avbrott (interrupt). 4) OS kontrollerar att parametrarna på stacken är korrekta och rimliga. 5) OS ger processen tillstånd att utföra systemanropet. 6) Processen får svaret från OS i registret EAX och säger nu till CPU att byta till kernel mode (om svaret var positivt). 7) Processen kör i kernel mode och kan nu läsa filen. 8) Processen säger till CPU att byta tillbaka till user-mode. c) Du har fått uppgiften att bedöma Kalles svar och rätta honom där han gjort fel. Det är mycket viktigt att motivera alla rättelser tydligt. Både varför det är fel, och varför systemanropet måste gå till på det sätt du beskriver istället. (3p) 2. Filsystem (4.5p) Operativsystemet håller reda på en filkatalog, en free-map, en inode-tabell och för varje process dessutom en filtabell. a) Vilka data lagras om en fil i katalogen på disk? Tre viktiga data förväntas. (1.5p) b) Motivera kort varför operativsystemet är designat så att filer måste öppnas innan användning och sedan stängas. (1p) c) Beskriv noga hur linked allocation fungerar, inklusive en fördel och en nackdel. Rita en figur som du förklarar. (2p) 2 (7)
3. Minneshantering (5.5p) Ett mycket litet system med 8-bitars adress använder paging i en nivå (en sidtabell). Varje frame i systemet är 16 byte. Virtuellt minne används. a) Förklara generellt hur en logisk adress delas upp i sidnummer och offset. Motivera.Omdu vill kan du istället förklara för den specifika adressen 0x23 hexadecimalt (35 decimalt). Det ingår att ange hur många bitar varje del får. (1p) b) Sidtabellen (pagetable) innehåller viktig extra information utöver framenummer. Denna lagras typiskt som olika bitar. Två av dessa är valid bit och modified bit. Beskriv en av dessa två bitar och förklara när, hur och varför den används och uppdateras. (1.5p) c) Förklara hur varje del av adressen i uppgift a) används tillsammans med sidtabellen (pagetable) för att få fram den fysiska adressen. (1.5p) d) En process har hög pagefault rate. Vad bör operativsystemet göra? (0.5) Ett större system med 16-bitars adressering använder 256 byte per sida. Med 256 sidor i systemet och varje framepekare i pagetable 16-bit blir varje pagetable 512 byte stor. Det gör att en pagetable inte ryms i en frame, den behöver 2 frames. e) Förklara varför en pagetable som är större än en frame är ett problem. Namnge alternativt beskriv en lösning. (1p) 4. Schemaläggning (6p) process start length prioritet P1 4 3 1 (högst prioritet) P2 3 4 2 P3 6 3 3 P4 1 4 4 (lägst prioritet) Tabellen visar data för vid vilken tidpunkt ett antal processer startar, hur mycket exekveringstid var och en behöver samt vilken prioritet var och en har i systemet. a) Använd priority scheduling (med preemption) för att schemalägga processerna. (2p) b) Beräkna med förklaring turnaround time för process P1 i ditt schema i a) (0.5p) c) Som tillägg till ovan information får du veta att process P4 tar lås A när den exekverat i en tidsenhet och behöver exekvera med låset under 2 tidsenheter. Även process P1 försöker ta lås A när den exekverat en tidsenhet. Lås A är ledigt från start. Gör om ditt schema (rita ett nytt) i a) med hänsyn till denna information. Du måste tänka på i vilken kö en process placeras medan den väntar på ett lås, och vilken kö schemaläggningen använder. (2p) d) Jämför din lösning i a) och c). Beräkna turnaround time för P1 igen. Namnge eller förklara kort det problem som uppstått. Tips: fundera på vilka processer som borde ha prioritet över andra processer. (1p) e) Definiera vad som menas med ett realtidssystem. (0.5p) 3 (7)
Del VT2 (22.5p) 5. Lås och semaforer (5p) Kalle skriver ett flertrådat program i ett system som bara har tillgång till räknande semaforer (fungerar som semaforerna i Pintos). a) Förklara hur en räknande semafor fungerar. Vad är det som räknas? Under vilken situation kommer anropande tråd att placeras på en väntekö? Under vilken situation flyttas en väntande tråd tillbaka till readykön? (1.5p) b) Nu behöver kalle ett vanligt lås. Förklara hur han skall gå tillväga för att kunna använda en semafor istället för ett lås. Hur skall han låsa? Hur skall han låsa upp? Vilka nackdelar har en sådan lösning (konkret exempel)? (2p) c) Tråd P beräknar en produkt och lagrar resultatet i den delade variabeln R. Tråd Q behöver resultatet från P och har direkt tillgång att läsa R. Problemet är att Q inte vet om P är klar med uträkningen. Använd antingen en semafor eller ett condition och ge exempel på en lösning där uträkningen alltid är klar innan Q läser R. (1.5p) 6. Synkronisering (8p) Kalle har implementerat en associativ container (map) där man kan stoppa in en pekare till en processinformationsstruktur och få tillbaka en nyckel (hitta_ledig_plats). Man kan även fråga efter vilken struktur som är kopplad till en viss nyckel (hämta_pekare) och ta bort pekaren som hör till en viss nyckel (frigör_plats). Implementationen av detta hittar du på tentans sista sida. Operativsystemet använder datastrukturen när processer skapas (ett processid genereras genom att sätta in en pekare till processinformation i containern) och avslutas (processionformation tas bort), samt när information om en process behövs. Alla funktioner anropas alltså med en pekare till samma container. Det är givet att alla processer kan skapa nya processer, och att processer bara kan hämta information om eller ta bort sig själva. OBS! Sista sidan finns i två kopior. Renskriv på sida 7 och ta loss och lämna in den. a) Stryk under alla ställen i koden där en resurs gemensam för mer än en tråd används. (0.5p) b) Rita en ruta runt alla kritiska sektioner och förklara varför all kod inuti rutan är kritisk, samt varför koden utanför rutan inte är kritisk. (2p) (Utgå t.ex. från den sista raden i kritiska sektionen och förklara varför den beror av att något från sektionens första rad, eller demonstrera en exekveringssekvens som ger fel resultat.) c) Förklara hur du använder ett globalt lås för att synkronisera dina kritiska sektioner. (0.5p) d) Förklara en stor nackdel med lösningen i c). Motivera varför. (1p) e) Föreslå en lösning som tillåter flera trådar att samtidigt exekvera i for-loopen. (2p) f) Kalle funderar på om inte hårdvaruinstruktionerna test_and_set eller atomic_swap skulle gå att använda och kontrollerar om några sådana hårdvaruinstruktioner finns att tillgå. Tyvärr hittar han ingen av dem, men istället hittar han compare_and_swap. Även den finns på sista sidan. Visa hur han kan använda den istället för lås. (1p) g) Förklara vilka fördelar en hårdvaruinstruktion som compare_and_swap har gentemot motsvarande lösning med vanliga lås. (1p) 4 (7)
7. Deadlocks (5.5p) a) Det finns tre nödvändiga villkor och ett tillräckligt villkor för deadlock. Namnge och beskriv dessa villkor. (2p) b) I Kalles system inträffar följande 6 händelser. Rita en resursallokeringsgraf med processer (cirklar) och lås (rutor) samt pilar som beskriver de olika händelserna. Förklara vad olika pilar betyder. (2p) 1) Process 3 tar Lås C (lyckas) 2) Process 1 tar Lås A (lyckas) 3) Process 1 tar Lås B (lyckas) 4) Process 1 försöker ta Lås C (måste vänta) 5) Process 3 försöker ta Lås A (måste vänta) 6) Process 2 försöker ta Lås B (måste vänta) c) Vi har inte kännedom om vad som hänt före händelse 1. Ange med motivering vilka tre villkor som garanterat är uppfyllda vid händelse 6. Dvs. vilket villkor är kanske inte uppfyllt? (0.5p) d) Om deadlock inträffar, ange med motivering vid vilken händelse. Annars motiverar du varför deadlock inte inträffat. (1p) 8. Tillgänglighet och säkerhet (4p) Kalles brorson Bertram har satt upp en egen webserver för sin internetshop. Han använder en open-source webshop-portal med PHP. Databasen är MySQL, och servern kör Apache under Linux. Systemet har en användare (root) som har tillgång till allt och kör alla processer (speciellt webservern Apache och dess webapplikationer i PHP samt databasen MySQL). Eftersom upptid är viktigt och Bertram lagt mycket tid på uppbyggnaden av webshopen, och kunddatabasen samt all försäljningsinformation är mycket viktigt (behövs till företagets årsredovisning) så har Bertram investerat i en extra disk så han kan köra RAID. Han har valt RAID-nivå 0 för att inte slösa på diskutrymme. Det finns ingen backup, utan Bertram tycker att RAID-0 räcker. Tillgången till sidan är begränsad till Bertrams kunder genom ett PHP-script Bertram gjort själv. Lösenorden är lagrade i klartext i en fil passwords.txt. Filen ligger tillsammans med PHP-scriptet på webben. Bertram tittar ibland i filen via webben när användare ringer och har glömt sitt lösenord. Kunderna är viktiga och därför behövs snabb support. Nu kommer Bertram åt lösenorden från vilken dator som helst, till och med i sin smartphone, och det tycker han är praktiskt. Det som hindrar att andra tittar i filen är tre saker enligt Bertram: 1) Det går inte att lista filerna i mappen, man kommer automatiskt till inloggningssidan, så inga människor kan råka hitta lösenordsfilen. 2) Inga websidor länkar till filen, så inga robotar kan råka hitta lösenordsfilen. 3) Bara Bertram vet filens namn ( passwords.txt ) så inga andra vet vad de skall skriva för att visa filen. Bertram vet namnet, så för honom räcker det skriva in rätt URL. Eftersom Bertram är mycket seriös och vet att han inte alltid har så bra koll på det datatekniska har han anlitat dig som konsult. Han vill försäkra sig om att systemet är säkert och tillförlitligt. a) Förklara hur Bertram kan använda operativsystemets skyddsmekanismer för att bättre skydda systemet mot effekterna av ett intrång via t.ex. webbservern. Tänk på principle of least privilege. Motivera. (1p) b) Förklara hur Bertram skall skydda sig mot dataförlust och nertid. Motivera. (1p) c) Beskriv kort fyra åtgärder Bertram kan ta för att skydda sin lösenordslista på bästa sätt. (2p) 5 (7)
typedef container void* plats[size]; // alla index initieras till NULL void* hämta_pekare(container* k, int nyckel) return k->plats[nyckel]; else void* frigör_plats(container* k, int nyckel) void* info; info = k->plats[nyckel]; k->plats[nyckel] = NULL; return info; // returnera gamla värdet på platsen int hitta_ledig_plats(container* k, void* info) int i; for (i = 0; i < SIZE; ++i) if ( k->plats[i] == NULL ) // är det ledigt? k->plats[i] = info; return i; // indexet blir nyckel return -1; // koden motvarande detta körs i en hårdvaruinstruktion int compare_and_swap (int* reg, int oldval, int newval) int old_reg_val = *reg; if (old_reg_val == oldval) *reg = newval; return old_reg_val; 6 (7)
typedef container void* plats[size]; // alla index initieras till NULL void* hämta_pekare(container* k, int nyckel) return k->plats[nyckel]; else void* frigör_plats(container* k, int nyckel) void* info; info = k->plats[nyckel]; k->plats[nyckel] = NULL; return info; // returnera gamla värdet på platsen int hitta_ledig_plats(container* k, void* info) int i; for (i = 0; i < SIZE; ++i) if ( k->plats[i] == NULL ) // är det ledigt? k->plats[i] = info; return i; // indexet blir nyckel return -1; // koden motvarande detta körs i en hårdvaruinstruktion int compare_and_swap (int* reg, int oldval, int newval) int old_reg_val = *reg; if (old_reg_val == oldval) *reg = newval; return old_reg_val; 7 (7)