Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

Relevanta dokument
Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18:00

Operativsystem ID2200 Tentamen TEN1 3.8 hp :00-18:00

Operativsystem ID2206 Tentamen TEN1 4.5 hp :00-18:00

Operativsystem ID1200/06 Tentamen :00-18:00

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Operativsystem (IS1350) :00-12:00

Operativsystem (ID2200/06) XX XX:00-XX:00

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Operativsystem ID2200/06 omtentamen :00-18:00

Operativsystem ID1200/06 Tentamen :00-18:00

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Operativsystem ID2200/06 tentamen och omtentamen :00-12:00

Operativsystem ID2200/06 omtentamen :00-12:00

Operativsystem ID2200/06 omtentamen :00-18:00

Operativsystem ID2200/06 omtentamen :00-12:00

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Operativsystem ID2200/06 omtentamen :00-18:00

Operativsystem ID2200/06 tentamen och omtentamen :00-12:00

Operativsystem ID2200/06 omtentamen :00-18:00

Operativsystem ID2200/06 omtentamen :00-12:00

Operativsystem ID2200/06 omtentamen :00-12:00

Programmering II (ID1019) :00-11:00

Programmeringsteknik med C och Matlab

... Funktionsanrop. Vad händer när man kör ett program?

Vad händer när man kör ett program? Program och processer. Funktionsanrop. Avsluta programmet

Övning från förra gången: readword

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

Pekare och arrayer. Indexering och avreferering

Flera processer. Minneshantering. Trashing kan uppstå ändå. Ersätta globalt

Dagens OS. Unix, Linux och Windows. Unix. Unix. En översikt av dagens OS Titt på hur de gör. Många varianter Mycket gemensamt. En del som skiljer

Programmering av inbyggda system. Pekare och Arrayer. Viktor Kämpe

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Tentamen *:58/ID100V Programmering i C Exempel 3

TDDIU81. Processer och trådar. Andreas Dahlberg, Jonathan Doherty, Tony Magnusson, Patrik Ottosson, Rasmus Siljedahl

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

Programmering II (ID1019) :00-12:00

TDIU01 - Programmering i C++, grundkurs

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Programmering II (ID1019) :00-12:00

Tommy Färnqvist, IDA, Linköpings universitet

Fö 5+6 TSEA81. Real-time kernel + Real-time OS

Programmering II (ID1019) :00-11:00

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

F5: Högnivåprogrammering

TDDC76 - Programmering och Datastrukturer

Realtidsstöd i Minix. En laborationrapport. Oktober 2012

Fö 8: Operativsystem II. Minneshantering. Minneshantering (1) Minneshantering (2) Minneshantering och Virtuelltminne.

Svar till tentamen den 16 december 2013 Datorarkitekturer med operativsystem, EDT621, 7,5 poäng

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Olika OS. Unix, Linux och Windows. Unix. Unix. En översikt av ett par OS. Titt på hur de gör. Många varianter. Mycket gemensamt. En del som skiljer

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

F5: Högnivåprogrammering

Institutionen för elektro- och informationsteknologi, LTH

Datorteknik. Föreläsning 5. Realtidssystem och realtidsprogrammering. Institutionen för elektro- och informationsteknologi, LTH.

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

#include <stdio.h> #include <string.h>

Programmering av inbyggda system. Pekare och Arrayer. Ulf Assarsson. Originalslides av Viktor Kämpe

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

Programmering II (ID1019) :00-17:00

4 grundregler. Minneshantering. Problemet. Windows minkrav

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Tentamen i Algoritmer & Datastrukturer i Java

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Möte 7: Uppföljning av föreläsningen med Peer Instruction - (PI)

Minnestilldelning (allokering) och frigörande (avallokering) av minne

TDDC74 Programmering: Abstraktion och modellering Tenta, kl 14 18, 11 juni 2014

Abstrakta datastrukturer

2 Pekare och dynamiska variabler.

Tentamen i Introduktion till programmering

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Minnet från processorns sida Datorteknik

SP:PROG3 HT12 Tenta

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Poster ( structar ) Postdeklarationer

Schemaläggning Unix. Minneshantering etc. Linux. Schemaläggning av trådar (kernel threads) Detaljer. Operativsystem - Lektion 7

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Mål. Datorteknik. Innehåll. Innehåll (forts) Hur ser ett program ut? Hur skapas maskinkoden?

printenv sort pager printenv grep args sort pager

Datastrukturer. föreläsning 3. Stacks 1

TDDC76 - Programmering och Datastrukturer

*Pekarvärden *Pekarvariabler & *

Ulf Assarsson. Grundläggande C-programmering del 2 Pekare och Arrayer. Läromoment:

En processor kan ha en klockfrekvens på flera GHz. Det går alltså a9 exekvera en instruk=on väldigt for, givet a9 instruk=onen finns i processorn.

Tentamen Datorteknik och realtidssystem, TSEA81 Datum Lokal

Tentamen i ID2206, ID2200 samt IS1350 Operativsystem

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

IS1200 Datorteknik. Övning CE_O4 Maskinnära programmering med C Förberedelser till hemlaboration 1

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Tentamen Datastrukturer D DAT 035/INN960

Typkonvertering. Java versus C

Föreläsning 10. Pekare (Pointers)

Öppna filer och filsystem i PintOS Hemuppgift TDDI81, 21/

Tentamen i. Programmering i språket C

Föreläsning 5: Introduktion av pekare

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

Introduktion C-programmering

Lite om länkade strukturer

Transkript:

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp 2018-04-03 14:00-18:00 Omtentander på ID2200 TEN1 3.8 hp och ID2206 TEN1 4.5 hp skall inte skriva denna tentamen! Instruktioner Du får, förutom skrivmateriel, endast ha med dig en egenhändigt handskriven A4 med anteckningar. Svaren skall lämnas på dessa sidor, använd det utrymme som nns under varje uppgift för att skriva ner ditt svar. Svar skall skrivas på svenska eller engelska. Du skall lämna in hela denna tentamen. Inga ytterligare sidor skall lämnas in. Betyg Tentamen har ett antal uppgifter där några är lite svårare än andra. De svårare uppgifterna är markerade med en stjärna, [p*], och ger poäng för de högre betygen. Vi delar alltså upp tentamen i grundpoäng och högre poäng. Se först och främst till att klara grundpoängen innan du ger dig i kast med de högre poängen. Notera att det av de 24 grundpoängen räknas bara som högst 22 och, att högre poäng inte kompenserar för avsaknad av grundpoäng. Gränserna för betyg är som följer: Fx: 12 grundpoäng E: 13 grundpoäng D: 16 grundpoäng C: 20 grundpoäng B: 22 grundpoäng och 6 högre poäng A: 22 grundpoäng och 10 högre poäng Gränserna kan komma att justeras nedåt men inte uppåt. 1

1 Processer 1.1 fork() [2p] När man skapar en ny process genom att använda fork() så kommer de två processerna att dela vissa saker. Vilka, om några, av följande saker kommer de två processerna att dela? Stack nej Heap nej Globalt minne nej Kod-area nej Öppna ler ja 1.2 vad nns på stacken [2p] Antag att vi gör ett proceduranrop till foo() som i exemplet nedan och att all informations läggs på stacken dvs vi använder inte register för argument och resultat, vad nns då på stacken när vi kommer in i foo? Rita upp en stack och beskriv vad som nns där. Visa även var stackpekaren och baspekaren pekar. ESP/EBP previous EBP return IP 3 4 location of z int foo ( int x, int y ) { return x + y ; int bar () { int z ; z = foo (3, 4) return z ; 2

1.3 vad är felet [2p] I programmet nedan har vi en procedur print_fibs/0 som med hjälp av some_fibs/1 skriver ut en sekvens med Fibonacci-tal från 0 till 46. Allt fungerar utmärkt, eller... vad har vi glömt och vilka konsekvenser kan det få? Vi allokerar en array på heapen men gör sedan inte free() på detta utrymme. Resultatet blir en minnesläcka - varje gång vi anropar print_- fibs() så kommer vi att öka heapens storlek. I slutändan kommer minnet att ta slut. #include <stdlib.h> #include <stdio.h> #define MAX 46 int *some_fibs(int n) { if (n <= MAX) { int *buffer = malloc((n + 1) * sizeof(int)); buffer[0] = 0; buffer[1] = 1; for(int i = 2; i <= n; i++) { buffer[i] = buffer[i-1] + buffer[i-2]; return buffer; else { return NULL; void print_fibs() { int *fibs; int n = 46; fibs = some_fibs(n); for(int i = 0; i <= n; i++) { printf("fib(%d) = %d\n", i, fibs[i]); 3

1.4 varför malloc [2p] När man programmerar i C så måste man explicit allokera en del datastrukturer på heapen med hjälp av malloc. I språk som har s.k. automatisk minneshantering, som till exempel Java, Erlang och Python, så behöver man inte tänka på var någonstans datastrukturer allokeras. Hur fungerar dessa språk? Allokeras allt på stacken nns det ingen heap? Om det nns en heap måste man då inte ta bort datastrukturer som inte används? Förklara hur dessa språk hanterar minnet. Språk som Java, Erlang, Python med era använder en automatisk minnes hantering. Systemet allokerar datastrukturer på en heap som, när den börjar bli full, skräpsamlas (garbage collection). Skräpsamlingen identierar strukturer som inte längre behövs och återanvänder det utrymmet i den fortsatta exekveringen. 1.5 lika-lika [2p*] När man implementerar malloc/free är ett alternativ att bara dela ut block som är en jämn exponent av två. Man kanske har någon nedre gräns så man kanske delar ut block av storlek: 16 byte, 32 byte, 64 byte, 128 byte osv. Detta har vissa fördelar men även vissa nackdelar. Beskriv hur systemet skulle kunna implementeras och dess för och nackdelar. Vi kan länka de fria blocken i olika listor beroende på storlek vilket gör både allokering och återlämning eektiv. Om vi delar upp block allteftersom mindre block behövs så måste vi också lösa ihopslagning. Eftersom blocken är av jämna två-potenser, kan man med föredel använda Buddy-algoritmen. Detta ger inte optimal ihopslagning men går att implementera eektivt. En nackdel är att vi får ca 25 % intern fragmentering eftersom vi inte använder hela block. Beroende på hur vi implementerar systemet måste vi lösa era problem: vi måste veta hur stort ett block som returneras är, vi måste kunna avgöra om ett närliggande block är fritt och vi måste kunna länka in block i rätt frilista. Hur detta kan lösas bör framgå. 4

1.6 yield() eller futex_wait() [2p*] Om vi implementerar ett spin-lock så kan vi anropa sched_yield() eller futex_wait() som i exemplen nedan, om vi inte får låset på första försöket. Varför vill vi göra det och vilken skillnad nns mellan de båda lösningarna. int try ( int * lock ) { s y n c _ v a l _ c o m p a r e _ a n d _ s w a p ( lock, 0, 1); int futex_ wait ( volatile int * futexp ) { return syscall ( SYS_ futex, futexp, FUTEX_ WAIT, 1, NULL, NULL, 0); Så här: void lock ( volatile int * lock ) { while ( try ( lock )!= 0) { sched_yield (); eller så här: void lock ( volatile int * lock ) { while ( try ( lock )!= 0) { futex_ wait ( lock, 1); Om vi inte får låset på första försöket så ber vi operativsystemet om att avbryta vår exekvering så att någon annan tråd kan få köra. Detta för att förhindra att vi stål och spinner under hela vår tilldelade körtid. Om vi bara gör sched_yield() så kommer operativsystemet att åter plocka in oss för körning, oavsett om låset är fritt eller ej. Om vi istället använder oss av futex_wait() så kommer vi vara suspenderade till en process väcker oss (som görs av den process som släpper låset). När vi vaknar måste vi försöka ta låset igen. 5

2 Kommunikation 2.1 count [2p] Om vi exekverar programmet nedan så kommer vi skriva ut det slutgiltiga värdet på variabeln count. Vilka möjliga utskrifter kan vi få och varför? # include < stdio.h > # include < unistd.h > # include < sys / wait.h > # include < sys / types.h > int count = 0; int main () { int * status ; int pid = fork (); if ( pid == 0) { for ( int i = 0; i < 10; i ++) { count += 1; return 0; else { for ( int i = 0; i < 10; i ++) { count += 1; wait ( status ); printf ( " count = % d \ n ", count ); return 0; När vi skapar en ny process så kommer den att ha sin egen kopia av variabeln count. Utskriften blir därför count = 10. 6

2.2 pipes [2p] Vilket av följande påståenden, om något, är sant? En pipe är en dubbelriktad kanal för kommunikation mellan processer inom samma operativsystem. falskt När man läser från en pipe läser man ett meddelande åt gången. Man får alltid ett helt meddelande, aldrig ett halvt. falskt När man läser från eller skriver till en pipe så använder man de vanliga biblioteksrutinerna som används för ler. sant 2.3 typer av socket [2p*] När vi skapar en socket så anger vi vilken typ av socket vi vill ha; nedan är tre typer listade. Ange för varje typ vilka egenskaper som den socket som skapas har. Notera egenskaper såsom: byte- eller meddelandeorienterad, enkel- eller dubbelriktad, tillförlitlighet, ordnad och ödeskontroll. SOCK_DGRAM En enkelriktad, medelandeorienterad, icke tillförlitlig, oordnad kanal utan ödeskontroll. SOCK_STREAM En dubelriktad, byteorienterad, tillförlitlig, ordnad kanal med ödeskontroll. SOCK_SEQPACKET En dubelriktad, medelandeorienterad, tillförlitlig, ordnad kanal med ödeskontroll. 7

3 Schemaläggning 3.1 sämre omloppstid [2p] Visa med ett tidsdiagram hur vi kan få sämre omloppstid (turnaround time) om vi istället för att köra tre jobb på 30 ms var efter varandra, implementerar round-robin där varje jobb får en tidslucka på 10 ms. I exemplet nedan har vi en omloppstid på i medeltal 80 ms ((70+80+90)/3). Om vi körd de tre jobben efter varandra hade omploppstiden varit 60 ms ((30,60,90)/3). J1: J2: J3: 0 10 20 30 40 50 60 70 80 90 100 110 120 ms 8

3.2 MLFQ - WTF! [2p] Antag att vi implementerar en MLFQ för vår schemaläggning av jobb enligt reglerna nedan. Vad kommer problemet bli och hur skulle vi kunna lösa det? Regel 1: om Prioritet(A) > Prioritet(B) så schemalägg A. Regel 2: om Prioritet(A) = Prioritet(B) så schemalägg A och B i roundrobin. Regel 3: ett nytt jobb startar med högsta prioritet. Regel 4a: ett jobb som måste avbrytas (tidsluckan förbrukad) yttas till en lägre prioritet. Regel 4b: ett jobb som initiaserat en I/O-operation (eller yield) stannar kvar på sin nivå. Problemet är att icke-interaktiva processer kommer att få en lägre och lägre prioritet. Om vi har era interaktiva processer där någon hela tiden är redo att köra så kommer de icke-interaktiva processerna att svälta. Vi kan åtgärda problemet genom att periodvis lägga upp alla processer i kön med högst prioritet. Det icke-interaktiva processeran blir då garanterade en viss körtid. 3.3 en zombie [2p*] En process kan benna sig i ett s.k. zombie-tillstånd. Vad betyder detta, varför är processen i det tillståndet, när tas den därifrån och vad händer sedan med processen? En zombie-process är en process som terminerat men där moderprocessen ännu inte har hämtat upp resultatet. När/om moderprocessen plockar upp resultatet genom ett anrop till wait() så kan processen plockas bort från systemet. Om moderprocessen har terminerat så ärvs processen av init som kommer att plocka upp dess resultat. 9

4 Virtuellt minne 4.1 En sidad MMU med TLB [2p] Nedan är en schematisk bild av en MMU som använder sig av en TLB för att översätta en virtuell adress till en fysisk adress. Identiera följande enheter och adresser: virtuell adress, fysisk adress, register för basadress till sidtabell (PTBR), oset i sida, sidnummer (VPN), ramnummer (PFN), TLB, sidtabell, sidtabellspost (page table entry, PTE). virtual addr. // oset VPN TLB PFN + physical address VPN PTE + PTBR Page table in memory 10

4.2 den gömda koden [2p] Vid implementering av malloc/free så kan man göra ett litet trick och gömma information om ett block som man delar ut. Vilken information är det som man gömmer och hur göms den? Förklara varför det är nödvändigt, hur det görs och var i koden nedan det sker. void * malloc ( size_t size ) { if ( size == 0 ){ return NULL ; struct chunk * next = flist ; struct chunk * prev = NULL ; while ( next!= NULL ) { if ( next - > size >= size ) { if ( prev!= NULL ) { prev - > next = next - > next ; else { flist = next - > next ; return ( void *)( next + 1); else { prev = next ; next = next - > next ; void * memory = sbrk ( size + sizeof ( struct chunk )); if ( memory == ( void *) -1) { return NULL ; else { struct chunk * cnk = ( struct chunk *) memory ; cnk - > size = size ; return ( void *)( cnk + 1); När ett block returneras så måste vi veta hur stort det är. Detta kan vi skriva in på en position alldeles bakom den pekare som pekar ut den fria arean. I koden ovan så görs det dels då storleken skrivs in (cnk->size = size) och dels när vi hoppar fram ett steg i den pekare vi returnerar (void*)(next + 1) och (void*)(cnk + 1) 11

4.3 inverterad sidtabell [2p*] En inverterad sidtabell är en tabell som givet processidentierare och sidnummer returnerar vilken ram som sidan nns i (om den nns i minnet). Tabellen har ett element per ram i minnet och kan inte indexeras med hjälp av sidnummret, man måste på något sätt söka igenom tabellen för att hitta rätt ram. Vad är fördelen med att ha en inverterad sidtabell om uppslagningen kommer att ta längre tid? Förklara vilka fördelar vi får och när det är mest fördelaktigt att använda en inverterad tabell. En inverterad sidtabell kan delas av alla processer och är dess storlek är proportionell mot det fysiska minnet. Ett system som skall hantera väldigt många processer och/eller har ett litet fysiskt minne kan dra fördelar av detta. 12

5 Filsystem och lagring 5.1 ett enkelt lsystem [2p] Beskriv hur ett enkelt lsystem skulle kunna organiseras på en hårddisk som är uppdelat i segment om 4 Kbyte. Beskriv vilka datastrukturer som behövs och rita in hur dessa kan organiseras på hårddisken (vi tar en minimal disk som exempel). Vi representerar ler med hjälp av en inode med pekare till datablock med lens innehåll. Inoden innehåller även meta-data för len men kan representeras med t.ex 256 bytes. Det första segmentet innehåller information om lsystemet. Det andra och tredje segmentet har bitmappar som beskriver vilka inoder och datablock som är ledig. Om inoder är på 256 bytes så kan vi lagra 56 st i fyra segment vilket skulle räcka för detta lilla system. De resterande 56 segmenten används som datablock för ler. S i d 0 inodes 8 16 24 32 40 48 56 56 data blocks 13

5.2 innehållet i en map [2p] Antag att du har skrivit ditt eget program för att lista innehållet i en map enligt nedan. Du har testat ditt program på olika mappar och allt tycks fungera. Plötsligt får du ett segmenteringsfel, vad har gått fel? # include < stdio.h > # include < dirent.h > int main ( int argc, char * argv []) { if ( argc < 2 ) { perror ( " usage : myls <dir >\ n " ); return -1; char * path = argv [1]; DIR * dirp = opendir ( path ); struct dirent * entry ; while (( entry = readdir ( dirp ))!= NULL ) { printf ( " \ tinode : %8 lu ", entry - > d_ino ); printf ( " \ tname : % s \ n ", entry - > d_name ); return 0; Om man försöker öppna en mapp som man inte har rättigheter att öppna så kommer dirp vara en null-pekare. När man sen använder den i readdir() får man ett segementeringsfel. 14

5.3 loggbaserade fs [2p*] I ett log-baserat lsystem så har inoderna inte någon bestämd plats utan skrivs i segment tillsammans med datablocken. Problemet är då att hitta de inoder man söker efter: hur vet man var olika inoder ligger? Beskriv och rita in i guren nedan hur man hittar de inoder man söker efter. En inode-map (m i guren nedan) skrivs alltid sist i en skrivning och är en mappning från inode-id till block för respective inode. En strukture CR (Checkpoint Region) är på en fast position och håller en pekare till den sist skrivna inode-mapen. CR D D D D i9 D i7 m 15