Tentamen i TDIU16 Process- och operativsystemprogrammering

Relevanta dokument
Mekanismer. (implementation)

Synkronisering - Semaforen. Om att vänta men inte i onödan

Summering av fält 1.1. Synkronisering - Semaforen. Summering av fält 1.3. Summering av fält 1.2. Summering av fält 2.3 (INTE GK)

Deadlocks. detektera och undvik

Deluppgift 10 Starta den första processen (3.5h förarbete, 30min kodning)

Försättsblad till skriftlig tentamen vid Linköpings Universitet Cover page for written exam at Linköping University

Synkronisering. Ordning och reda

Tentamen TEN1 HI

TDDC30 Programmering i Java, datastrukturer och algoritmer

Programmering C: Tentamen of 5 Prioritet och associativitet hos operatorerna i C De viktigaste operatorerna: Prioritet Kategori Operator

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen i Introduktion till programmering

Tentamen i Programmering grundkurs och Programmering C

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Deluppgift 17 Processhantering: exec, sleep, exit, plist

Tentamen i. för D1 m fl, även distanskursen. lördag 26 februari 2011

Tentamen i Realtidsprogrammering

HI1024 Programmering, grundkurs TEN

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Tentamen, Algoritmer och datastrukturer

Försättsblad till skriftlig tentamen vid Linköpings Universitet

TDDC30 Programmering i Java, datastrukturer och algoritmer

Tentamen TEN1 HI

Deadlock. Deadlock uppstår när två eller flera processer hamnar i ett cirkelberoende. Resurs 1. Processen vill ha resursen. Processen äger resursen

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Uppgift 1 ( Betyg 3 uppgift )

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Tentamen i. Programmering i språket C

Tentamen ID1004 Objektorienterad programmering May 29, 2012

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

TDIU01 / 725G

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

Tentamen i. för D1 m fl, även distanskursen. lördag 28 maj 2011

TDIU01 - Programmering i C++, grundkurs

TENTAMEN PROGRAMMERING I JAVA, 5P SOMMARUNIVERSITETET

DAI2 (TIDAL) + I2 (TKIEK)

Tentamen i Programmering

Summering av fält. Synkronisering. Summering av fält. Bounded Buffer. Bounded Buffer (get) Bounded Buffer (put)

Exam Concurrent and Real-Time Programming

Tentamen TEN1 HI

Linköpings Tekniska Högskola Institutionen för Datavetanskap (IDA), Software and Systems (SaS) (c) Klas Arvidsson

Omtentamen i Realtidsprogrammering för Au3, D3, E3

Realtidssystem. - Dödläge - EDAF85 - Realtidssystem (Helsingborg) Elin A. Topp. Föreläsning 5

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

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

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

TENTAMEN I DATAVETENSKAP

TENTAMEN: Objektorienterad programmering. Läs detta! Skriv din tentamenskod på varje blad (så att vi inte slarvar bort dem).

HI1024 Programmering, grundkurs TEN

Tentamen i Programmering grundkurs och Programmering C

Institutionen för elektro- och informationsteknologi, LTH

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

Föreläsning 2 Datastrukturer (DAT037)

Försättsblad till skriftlig tentamen vid Linköpings Universitet

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN1 - Teoretisk tentamen Tid: Torsdagen den 20 oktober 2011,

Tentamen Nätverksprogrammering Lösningsförslag

Tentamen i Realtidsprogrammering

TDDI14 Objektorienterad programmering

TDDC30 Programmering i Java, datastrukturer och algoritmer

Försättsblad till skriftlig tentamen vid Linköpings Universitet Cover page for written exam at Linköping University

Tentamen Datastrukturer D DAT 035/INN960 (med mycket kortfattade lösningsförslag)

Tentamen. Datorteknik och realtidssystem

Försättsblad till skriftlig tentamen vid Linköpings Universitet

Tentamen EDAF30 Programmering i C++

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Tentamen *:58/ID100V Programmering i C Exempel 3

Tentamen, EDAA10 Programmering i Java

Realtidsprogrammering Ordinarie tentamen

2D1339 Programkonstruktion för F1, ht 2003

1 Find the area of the triangle with vertices A = (0,0,1), B = (1,1,0) and C = (2,2,2). (6p)

TENTAMEN TDDB53. Programmering i Ada för MI (provkod TEN2) den 7 april 2010 kl Institutionen för datavetenskap, IDA Olle Willén mars 2010

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Försättsblad till skriftlig tentamen vid Linköpings Universitet Cover page for written exam at Linköping University

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

TER3. Försättsblad till skriftlig tentamen vid Linköpings universitet G28 TEN1 Webprogrammering och databaser Tentamen IDA 1 (7)

Försättsblad till skriftlig tentamen vid Linköpings universitet

Kompilatorer och interpretatorer

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Tentamen Datastrukturer (DAT036)

HI1024 Programmering, grundkurs TEN

2D1339 Programkonstruktion för F1, ht 2003

6. a) Visa att följande vektorer är egenvektorer till matrisen A = , och ange motsvarande

TENTAMEN: Algoritmer och datastrukturer. Läs detta!

Tentamen i. TDDC67 Funktionell programmering och Lisp

TDDI22 (exempel) TDDI22 Tentaregler

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

Kursmaterial för laborationer i

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 29 augusti 2015, kl 8 12

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

KOMPLETTERANDE HEMTENTAMEN TDDB53

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

Tentamen i Grundläggande Programvaruutveckling, TDA548

Transkript:

Linköpings universitet Institutionen för datavetenskap 2017-06-03 Tentamen i TDIU16 Process- och operativsystemprogrammering Datum 2017-06-03 Tid 14-18 Institution IDA Kurskod TDIU16 Provkod TEN1 Examinator Klas Arvidsson (klas.arvidsson@liu.se) Administratör Madeleine Häger Dahlqvist Jourhavande lärare Klas Arvidsson (013-28 21 46) Tillåtna hjälpmedel Inga hjälpmedel. Instruktioner Fyll i tentamensomslaget och läs dess instruktioner innan du börjar. Läs instruktionerna och alla uppgifter innan du börjar. Ange din tolkning av frågan och alla antaganden du gör. Skriv tydligt. Oläsliga svar bedöms som noll poäng. Var precis i dina påståenden. Bevisa ditt resonemang när möjligt. Svävande eller tvetydiga formuleringar leder till poängavdrag. Motivera tydligt och djupgående alla påståenden och resonemang. Förklara uträkningar och lösningsmetoder. Tentamen har 7 uppgifter på 7 sidor (inklusive denna sida). Tentamen är på 30 poäng och betygsätts U, 3, 4, 5 (prel. gränser: 16.0p, 22.0p, 26.0p). Poäng ges för motiveringar, förklaringar och resonemang. Enbart rätt svar ger inte (full) poäng. Lycka till!

TDIU16 Sida 2 av 7 2017-06-03 1. (a) Tabell 1 visar den totala mängden av fyra olika resurser som finns i ett system. I detta system körs för närvarande fyra olika processer. Tabell 2 visar den maximala resursanvändningen för dessa fyra processer och tabell 3 visar hur många resurser av varje typ processerna använder just nu. Process P 2 begär ytterligare en resurs av typ A. Beräkna med hjälp av Banker s algorithm om begäran ska tillåtas. Systemet är i ett säkert läge, du behöver inte börja med att visa det. A B C D 7 4 7 7 Tabell 1: Totalt antal resurser A B C D P1 3 1 1 1 P2 7 3 3 4 P3 2 2 2 3 P4 0 1 1 5 Tabell 2: Maximalt resursbehov A B C D P1 0 0 1 0 P2 5 2 2 1 P3 0 1 2 1 P4 0 0 1 0 Tabell 3: Nuvarande resursanvändning Vad innebär det att ett system är i ett osäkert läge när Bankers Algorithm tillämpats? Välj ett av följande alternativ och motivera varför det stämmer: Systemet hamnar i deadlock efter allokeringen. Systemet kommer hamna i deadlock efter kommande allokeringar. Systemet kanske hamnar i deadlock efter kommande allokeringar.

TDIU16 Sida 3 av 7 2017-06-03 2. Kim har implementerat start, exit och wait enligt koden i kodlistning 1. Dessa ska fungera liknande hur exit respektive wait fungerar i Pintos: vi antar att wait endast anropas en gång för varje process, och endast för processer man får köra wait på. 1 s t r u c t proc_exit { 2 i n t e x i t _ s t a t u s ; 3 s t r u c t semaphore sema ; 4 } ; 5 s t r u c t proc_exit p r o c _ l i s t [ 1 0 0 ] ; 6 s t r u c t l o c k e x i t _ l o c k ; 7 8 // Anropas p r e c i s innan en p r o c e s s s t a r t a r. Processen har id proc_id. 9 void s t a r t ( i n t proc_id ) { 10 s t r u c t proc_exit * c h i l d ; 11 12 lock_acquire (& e x i t _ l o c k ) ; 13 c h i l d = &p r o c _ l i s t [ proc_id ] ; 14 sema_init(& c h i l d >sema, 0) ; 15 c h i l d >e x i t _ s t a t u s = 1; 16 l o c k _ r e l e a s e (& e x i t _ l o c k ) ; 17 } 18 // Anropas när p r o c e s s e n med id proc_id a v s l u t a s. s t a t u s är 19 // statuskoden. 20 void e x i t ( i n t proc_id, i n t s t a t u s ) { 21 s t r u c t proc_exit * c h i l d ; 22 23 lock_acquire (& e x i t _ l o c k ) ; 24 c h i l d = &p r o c _ l i s t [ proc_id ] ; 25 sema_up(& c h i l d >sema ) ; 26 c h i l d >e x i t _ s t a t u s = s t a t u s ; 27 l o c k _ r e l e a s e (& e x i t _ l o c k ) ; 28 } 29 // Anropas när en p r o c e s s v i l l vänta på a t t p r o c e s s e n med id child_id 30 // ska a v s l u t a s. wait ska a l l t s å vänta på a t t p r o c e s s e n a v s l u t a s och 31 // r e t u r n e r a den statuskod som s k i c k a d e s t i l l e x i t f ö r den p r o c e s s e n. 32 i n t wait ( i n t child_id ) { 33 s t r u c t proc_exit * c h i l d = NULL; 34 i n t s t a t u s = 1; 35 36 lock_acquire (& e x i t _ l o c k ) ; 37 c h i l d = &p r o c _ l i s t [ child_id ] ; 38 l o c k _ r e l e a s e (& e x i t _ l o c k ) ; 39 sema_down(& c h i l d >sema ) ; 40 s t a t u s = c h i l d >e x i t _ s t a t u s ; 41 42 return s t a t u s ; 43 } Listing 1: Implementation av start, exit och wait (a) (c) Finns det risk för deadlock? I så fall, var och varför? Tänk igenom de fyra kraven för deadlock för att göra din motivering. Vilken resurs hanterar semaforen sema som finns i proc_exit för varje process? Finns det några synkroniseringfel? I så fall, var och varför? Tips: Ägna särskild uppmärksamhet åt ordningen som operationer sker i.

TDIU16 Sida 4 av 7 2017-06-03 3. Kirsten sitter och implementerar låsfria datastrukturer med hjälp av atomiska operationer. Tyvärr har Kirsten bara tillgång till compare_and_swap och atomic_swap men behöver test_and_set. Kodlistning 2 visar hur funktionerna ska fungera. Implementationerna ska fortfarande vara atomiska, det går alltså att använda funktionerna för att modifiera samma data ifrån olika trådar. 1 i n t compare_and_swap ( i n t * val, i n t compare, i n t swap ) { 2 atomic { 3 i n t tmp = * val ; 4 i f (* val == compare ) 5 * val = swap ; 6 return tmp ; 7 } 8 } 9 10 void atomic_swap ( i n t *a, i n t *b ) { 11 atomic { 12 i n t tmp = *a ; 13 *a = *b ; 14 *b = tmp ; 15 } 16 } 17 18 i n t test_and_set ( i n t * val ) { 19 atomic { 20 i n t old = * val ; 21 * val = 1 ; 22 return old ; 23 } 24 } Listing 2: Implementation av atomiska operationer (a) Implementera test_and_set med hjälp av compare_and_swap. Implementera test_and_set med hjälp av atomic_swap.

TDIU16 Sida 5 av 7 2017-06-03 4. (a) Figur 1 visar en resursallokeringsgraf för ett system med tre resurstyper, R1, R2 och R3, samt fyra processer, P1, P2, P3 och P4. Det finns inga andra processer eller resurser i detta system. Är systemet i deadlock? Motivera ditt svar. Använd gärna villkoren för deadlock i din motivering. P2 P3 R2. R1 R3 P1 P4 Figur 1: Resursallokeringsgraf Antag att ytterligare en resurs av typ R3 finns i systemet i fig. 1. Är systemet fortfarande i deadlock? Motivera ditt svar. Tips: Tänk på att det inte finns några ytterligare processer eller resurser i systemet. Bakgrund till uppgift 5-7 På sidan 6-7 finns given kod för att implementera ett system för användarstudier. Det kan som mest vara 20 användare inloggade samtidigt. Systemet klarar bara att lagra svar från 100 användare utan att startas om. Varje användare representeras av en tråd som kör funktionen do_survey. Ett godtyckligt antal sådana trådar startas under systemets körning. Vid inloggning kontrollerar systemet om fler än 100 svar redan har lämnats, och nekar i så fall tillgång till systemet. 5. Kan ett olägligt trådbyte göra att fler än 20 användare loggas in i systemet? [3p] 6. (a) Förklara begreppet busy-wait. Var i den givna koden förekommer busy-wait? Hur kan man eliminera dessa? Det är självklart tillåtet att lägga till godtyckliga funktioner och variabler var som helst i koden. Du får använda de primitiver som är givna nedan om du vill. 7. Återanvänd gärna din kod från uppgift 6 när du svarar på följande frågor. (a) (c) Förklara vilka kritiska sektioner som finns i koden och använd lås för att synkronisera dessa. För mycket eller för lite omotiverad låsning kan ge poängavdrag. Använd atomiska operationer för att leta upp en ledig plats, se hur dessa fungerar i Kodlistning 2. Du har tillgång till atomic_swap, test_and_set, och compare_and_swap. Många användare mot slutet av varje körning hör av sig om att deras svar inte kunde sparas (se utskriften på rad 38 i Kodlistning 4). Vad beror detta på? Hur kan man lösa det? [3p] [4p]

TDIU16 Sida 6 av 7 2017-06-03 Tillgängliga synkroniseringsprimitiver 1 s t r u c t semaphore ; 2 void sema_init ( s t r u c t semaphore *, i n t ) ; 3 void sema_down( s t r u c t semaphore *) ; 4 void sema_up ( s t r u c t semaphore *) ; 5 6 s t r u c t l o c k ; 7 void l o c k _ i n i t ( s t r u c t l o c k *) ; 8 void lock_acquire ( s t r u c t l o c k *) ; 9 void l o c k _ r e l e a s e ( s t r u c t l o c k *) ; 10 11 s t r u c t c o n d i t i o n ; 12 void cond_init ( s t r u c t c o n d i t i o n *) ; 13 void cond_wait ( s t r u c t c o n d i t i o n *, s t r u c t l o c k *) ; 14 void cond_signal ( s t r u c t c o n d i t i o n *, s t r u c t l o c k *) ; Listing 3: Tillgängliga synkroniseringsprimitiver Kod till uppgift 5-7 1 s t r u c t account { 2 bool in_use ; 3 } ; 4 5 s t r u c t answer { 6 // Dessa v a r i a b l e r i n n e h å l l e r svaren v i v i l l spara. 7 bool a1, a2, a3 ; 8 } ; 9 10 s t r u c t account accounts [ 2 0 ] ; 11 s t r u c t answer answers [ 1 0 0 ] ; 12 i n t num_answers ; 13 14 // Anropas en gång innan några trådar har s t a r t a t. 15 void i n i t ( ) { 16 num_answers = 0 ; 17 f o r ( i n t i = 0 ; i < 2 0 ; i++) { 18 accounts [ i ]. in_use = f a l s e ; 19 } 20 } 21 22 // Be användaren svara på några f r å g o r. Returnerar svaren. 23 // Denna funktion är t r å d s ä k e r. 24 s t r u c t answer get_answer ( ) ; 25

TDIU16 Sida 7 av 7 2017-06-03 26 // Godtyckligt a n t a l trådar kör denna funktionen vid o l i k a tidpunkter. 27 i n t do_survey ( ) { 28 i n t account = l o g i n ( ) ; 29 i f ( account == 1) { 30 p r i n t f ( Sorry, you were too l a t e : ( \ n ) ; 31 return 1; 32 } 33 34 s t r u c t answer answer = get_answer ( ) ; 35 b o o l saved = save_answer(& answer ) ; 36 37 i f (! saved ) 38 p r i n t f ( Your answers could not be saved. Contact an admin. \ n ) ; 39 40 logout ( account ) ; 41 } 42 43 bool answers_full ( ) { 44 return num_answers >= 100; 45 } 46 47 // Hitta e t t l e d i g t användarkonto och logga in på det. 48 i n t l o g i n ( ) { 49 i f ( a nswers_full ( ) ) 50 return 1; 51 52 i n t i = 0 ; 53 54 while ( accounts [ i ]. in_use ) { 55 i = ( i + 1) % 2 0 ; 56 } 57 58 accounts [ i ]. in_use = true ; 59 return i ; 60 } 61 62 void logout ( i n t account ) { 63 accounts [ account ]. in_use = f a l s e ; 64 } 65 66 // Spara svaren om det f i n n s p l a t s. 67 bool save_answer ( s t r u c t answer * answer ) { 68 i f ( a nswers_full ( ) ) 69 return f a l s e ; 70 71 answers [ num_answers ] = * answer ; 72 num_answers++; 73 return true ; 74 } Listing 4: Kod till uppgift 5-7