Operativsystem ID1200/06 Tentamen :00-18:00

Relevanta dokument
Operativsystem ID1200/06 Tentamen :00-18:00

Operativsystem ID2200/06 omtentamen :00-18:00

Operativsystem ID2200/06 omtentamen :00-12:00

Operativsystem (IS1350) :00-12:00

Operativsystem ID2200/06 omtentamen :00-12:00

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

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

Operativsystem ID2200/06 omtentamen :00-18:00

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

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

Operativsystem ID2200/06 omtentamen :00-12:00

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

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

Operativsystem ID2200/06 omtentamen :00-12:00

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

Operativsystem ID1200/06 och ID2200/06 Tentamen TENA 6 hp :00-18: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 (ID2200/06 6hp) Tentamen :00-18:00

Operativsystem ID2200/06 omtentamen :00-18:00

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

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

4 grundregler. Minneshantering. Problemet. Windows minkrav

Tentamen i ID2206, ID2200 samt IS1350 Operativsystem

Programmering II (ID1019) :00-11:00

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

Outline. Datorsystemtekni. Kravspecifikation. Kravspecifikation (forts.)

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

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

Realtidsstöd i Minix. En laborationrapport. Oktober 2012

Minneshantering segmentering och virtuellminne. Föreläsning 3

F5: Högnivåprogrammering

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

F5: Högnivåprogrammering

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

Realtidsprogrammering Ordinarie tentamen

Tentamen i Realtidsprogrammering för Au3, D3, E3

Programmeringsteknik med C och Matlab

Minnet från processorns sida Datorteknik

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

Tentamen i Digitala system - EITA15 15hp varav denna tentamen 4,5hp

Datorteknik ERIK LARSSON

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Inledning. Vad är ett datorprogram, egentligen? Olika språk. Problemlösning och algoritmer. 1DV433 Strukturerad programmering med C Mats Loock

Datorsystem. Tentamen

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

LEU240 Mikrodatorsystem

HI1024 Programmering, grundkurs TEN

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

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

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

Lösningsförslag till tentamen i IS1350 Operativsystem

Tommy Färnqvist, IDA, Linköpings universitet

Programmering II (ID1019) :00-12:00

Aktivitetsschemaläggning för flerkärninga processorer

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

Tentamen i Algoritmer & Datastrukturer i Java

printenv sort pager printenv grep args sort pager

Vad är viktigast? Sammanfattning. Processer och trådar. Processer och trådar. Flerprocessorsystem. Schemaläggning. Interprocesskommunikation.

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

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

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

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.

Programmering II (ID1019) :00-12:00

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Pekare och arrayer. Indexering och avreferering

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

Programmering II (ID1019) :00-17:00

Trådar och Multiprocessorer. Föreläsning 6

Föreläsning 6: Introduktion av listor

Att använda pekare i. C-kod

Operativsystem. Innehåll. Operativsystemets funktion. Vad är ett OS? Vart hittar men ett OS? OS hanterar processorns resurser

Lite om länkade strukturer

TDIU01 - Programmering i C++, grundkurs

CE_O5. Cacheminne. Hemlaboration 2.

Deluppgift 17 Processhantering: exec, sleep, exit, plist

Programsystemkonstruktion med C++: Övning 1. Karl Palmskog september 2010

TDDC77 Objektorienterad Programmering

Tentamen den 18 mars svar Datorteknik, EIT070

Tillämpad Programmering (ID1218) :00-13:00

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 den 12 januari 2017 Datorarkitektur med operativsystem, EDT621

TDDC76 - Programmering och Datastrukturer

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 II (ID1019) :00-12:00

Programmering II (ID1019) :00-11:00

Systemnära programmering Tentamen. Systemnära programmering, 7.5hp 5 november 2012

Generell säkerhet. Loggning - Hur mycket ska man logga? Inloggningsrutinerna i Unix. Loggning fortsättning

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

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

Generell säkerhet. Loggning - Hur mycket ska man logga? Inloggningsrutinerna i Unix. Loggning fortsättning

Det finns många flaggor till g++,

TDDC76 - Programmering och Datastrukturer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

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

32 Bitar Blir 64 Sammanfattning

Tentamen den 17 mars 2016 Datorteknik, EIT070

Lösningar till tentamen i EIT070 Datorteknik

Filsystem. Varför? Hur? För att kunna lagra data mer permanent än i RAM. Vettig organisation Vettiga namn

Transkript:

Operativsystem ID1200/06 Tentamen 2018-01-12 14:00-18:00 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, poäng*, 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 vad är problemet? [2 poäng] Koden nedan kanske fungerar att kompilera men vi gör ett allvarligt misstag. Vilket fel gör vi och vad skulle kunna hända? #include <stdlib.h> #define SOME 42 // should be 2..47 int *some_fibs() { int buffer[some]; buffer[0] = 0; buffer[1] = 1; for(int i = 2; i < SOME; i++) { buffer[i] = buffer[i-1] + buffer[i-2]; // buffer contains SOME Fibonacci numbers return buffer; Svar: Arrayen buffer är allokerad på stacken och kommer troligtvis att blir överskriven redan vid nästa proceduranrop. 2

1.2 minnesmappning [2 poäng] Nedan följer en, något förkortad, utskrift av en minnesmappning av en körande process. Beskriv kortfattat vad varje segment markerat med??? fyller för roll. > cat /proc/13896/maps 00400000-00401000 r-xp 00000000 08:01 1723260.../gurka??? 00600000-00601000 r--p 00000000 08:01 1723260.../gurka??? 00601000-00602000 rw-p 00001000 08:01 1723260.../gurka??? 022fa000-0231b000 rw-p 00000000 00:00 0 [???] 7f6683423000-7f66835e2000 r-xp 00000000 08:01 3149003.../libc-2.23.so??? : 7ffd60600000-7ffd60621000 rw-p 00000000 00:00 0 [???] 7ffd60648000-7ffd6064a000 r--p 00000000 00:00 0 7ffd6064a000-7ffd6064c000 r-xp 00000000 00:00 0 ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vvar] [vdso] [vsyscall] Svar: De första tre segmenten är: kod, read-only data och global data för processen gurka. Efter det har vi ett segment för processens heap. Segmentet markerat med libc-2.23.so är ett delat bibliotek. I den övre regionen hittar vi processens stack. 3

1.3 Arghhh! [2 poäng] Antag att vi har ett program boba som skriver Don't get in my way på stdout. Vad kommer resultatet bli om vi kör programmet nedan och varför blir det så? (proceduren dprintf() tar en ldescriptor som argument) i n t main ( ) { i n t fd = open (" quotes. txt ", O_RDWR O_CREAT, S_IRUSR S_IWUSR) ; i n t pid = f o r k ( ) ; i f ( pid == 0) { dup2 ( fd, 1 ) ; c l o s e ( fd ) ; e x e c l (" boba ", "boba ", NULL) ; e l s e { d p r i n t f ( fd, "Arghhh! " ) ; c l o s e ( fd ) ; return 0 ; Svar: I dup2(fd,1) sätter vi om stdout till den öppnade len. Boba kommer då att skriva sin rad till len quotes.txt. Samtidigt kommer moderprocessen att skriva Arghhh! på samma l. De två processerna kommer dock att dela på samma representation av den öppnade len, dela position och samsas om att skriva. Vi kommer därför se en blandning av de båda texterna i len quotes.txt i.e. den ena texten kommer inte skriva över den andra. 4

1.4 lista med friblock [2 poäng] Om vi vid implementering av malloc() och free() väljer att spara de fria blocken i en länkad lista som är ordnad i adressordning, så har vi en viss fördel. När vi gör free() på ett block och lägger in det i listan så kan vi utföra en operation som minskar den externa fragmenteringen. Vad är det vi kan göra och varför är det en fördel att ha listan ordnad i adressordning? Visa med en ritning vilken information som används och hur operationen skulle utföras. Svar: Vi kan omedelbart avgöra om de närmaste blocken är i direkt andslutning till det nya blocket och i så fall slå ihop blocken till ett större block. Utan ordningen skulle vi var tvungna att söka igenom alla fria block. Det nns två, icke uteslutande, fall som vi måste hålla reda på 1/ adressen på ett block i listan plus dess storlek är lika ned de friade blockets storlek 2/ det friade blockets storlek plus dess storlek är lika med nästa blocks adress. 5

1.5 intern paging [2 poäng*] När vi implementerar minneshantering internt för en process (till exempel med malloc()) så använder vi en form av segmentering. Det är därför vi kan få problem med extern fragmentering. Om det är bättre med så kallad paging, varför använder vi inte paging då vi implementerar intern minneshantering? Svar: Vi skulle behöva implementera en adressöversättare som i varje referens delade upp en adress i sida och oset. Adressen till sidan skulle sen behöva omvandlas till en ram-adress med hjälp av en omvandlingtabell. Vi skulle med all säkerhet behöva arbete med väldigt små sidor för att inte få för stor intern fragmentering. Detta skulle ge en stor omvandlingtabell som skulle vara svår att hantera. Att göra detta i mjukvara utan stöd från hårdvara i processorn är alldeles för kostsamt. Ett alternativ skulle vara att bara dela ut block av en mycket liten storlek, säg 16 byte (stor nog för två pekare), och låta processen representera alla objekt med hjälp av dess. Inte omöjligt och det är nästan så en del listbaserad programmeringsspråk hanterar sitt minne. 6

1.6 context [2 poäng*] Med hjälp av bibliotektsanropet getcontext() kan en process spara undan sitt eget så kallade context. Vi skulle kunna bygga upp ett bibliotek som lät oss skapa nya exekverande trådar och växla mellan dessa manuellt genom att en exekverande tråd anropade en schemaläggare. Varför skulle vi vilja bygga upp ett liknande bibliotek, nns det några fördelar? Vad skulle nackdelarna vara? Svar: Vi skulle får ett trådbibliotek där trådarna hanterades av processen själv. Ett byte mellan två trådar skulle ta mindre tid än det skulle ta om vi lät operativsystemet växla mellan trådarna (som sker i pthread-bibioteket). Vi skulle kunna undvika många synkroniseringsproblem eftersom vi skulle veta att bara en tråd exekverade åt gången. En nackdel skulle vara att vi inte skulle kunna utnyttja en processor med era kärnor. Vi skulle också bli helt blockerade om en av våra trådar gjorden en I/O-operation. 7

2 Kommunikation 2.1 count [2 poäng] Vad kommer skrivas ut om vi exekverar proceduren hello() nedan samtidigt i två trådar? Motivera svaret. i n t loop = 1 0 ; void h e l l o ( ) { i n t count = 0 ; f o r ( i n t i = 0 ; i < loop ; i++) { count++; p r i n t f (" the count i s %d\n", count ) ; Svar: Varje tråd har sin version av count och de två trådarna kommer alltså inte att störa varandra. Varje tråd kommer därför att skriva ut the count is 10". 8

2.2 pipes [2 poäng] Om vi har två processer, en producent och en konsument, som kommunicerar via en s.k. pipe. Hur kan vi då förhindra att producenten skickar mer information än vad konsumenten kan ta emot och därmed får systemet att krascha? Svar: Pipes har en inbyggd ödesontroll. Om konsumenten inte väljer att läsa kommer producenten att bli suspenderad när den försöker skriva. 9

2.3 namnrymd [2 poäng*] Nedan är kod där vi öppnar en socket och använder namnrymden AF_INET. Vi kan då adressera en server med hjälp av portnummer och IP-adress. Det nns en annan namnrymd som vi kan använda när vi arbetar med socket. Nämn en och beskriv vilka för och nackdelar den kan ha. s t r u c t sockaddr_in s e r v e r ; s e r v e r. sin_family = AF_INET; s e r v e r. sin_port = htons (SERVER_PORT) ; s e r v e r. sin_addr. s_addr = inet_addr (SERVER_IP) ; Svar: Vi kan använda lnamn (AF_UNIX) som namnrymd. Detta har nackdelen att vi inte kan nås från andra noder i ett nätverk utan är begränsade till den nod vi kör på. Det kan naturligtvis också vara en fördel då vi slipper exponera oss för omvärden. Implementeringen kan också vara mer eektiv eftersom vi inte behöver använda oss av t.ex. TCP. 10

3 Schemaläggning 3.1 tillståndsdiagram [2 poäng] Här följer ett tillståndsdiagram för processer vid schemaläggning. Fyll i de markerad delarna så att man förstår vad tillstånden betyder och när en process förs mellan olika tillstånd. Svar: scheduled terminate start ready running exit I/O complete timout blocked I/O request 3.2 reaktionstiden [2 poäng] När vi vill minska reaktionstiden så kan vill vi helst kunna avbryta jobba även om de inte är klara. Om vi gör detta så har vi en parameter som vi kan välja, genom att anpassa denna så kan vi förbättra reaktionstiden. Vad är det för parameter som vi kan sätta? Hur skall vi förändra den och vilka oönskade konsekvenser kan det få? Svar: Vi kan minska på den tid som varje jobb tillåts köra innan vi byter till nästa jobb. Detta medför att jobb som är klara att köra mycket snabbt blir schemalagda. Nackdelen är att vi förlänger den genomsnittliga omloppstiden och i värsta fall spenderar en stor del av tiden på att växla mellan processer. 11

3.3 rate monotonic scheduling [2 poäng*] En realtidsschemaläggare som baserar sig på Rate Monotonic Scheduling (fast prioritet där prioriteten bestäms av periodiciteten) är en relativt enkel schemaläggare. Om vi antar att deadline är lika med fulla perioden hur kan vi då beskriva ett systems belastning? Har vi några garantier för att schemaläggningen kommer att fungera dvs att inga deadlines kommer att missas? Svar: Ett systems belastning är summan av e i /p i. Där e i är ett jobbs exekveringstid och p i dess periodicitet. Schemaläggaren kommer garnterat att fungera om lasten är under n (2 1/n 1) där n är antalet processer (ca: 69% belastning för stor n). Den kan fungera vid högre last men vi har inga garantier. 12

4 Virtuellt minne 4.1 segmentering [2 poäng] När man använder segmentering för att hantera fysiskt minne så kan man få problem med extern fragmentering. Detta undviks om man istället använder s.k. paging. Varför kan vi undvika extern fragmentering med hjälp av paging? Är det något vi riskerar? Svar: Eftersom alla ramar är lika stora och en process kan tilldelas vilken ram som helst så kan en ram alltid användas. Det nns med andra ord inga luckor som är för små för att användas. Om sidstorleken är för stor och begärda segement är små riskerar vi att öka intern fragmentering. 13

4.2 nästan rätt [2 poäng] Nedan är ett utsnitt från ett program som implementerar Least Recently Used (LRU). Koden visar på varför LRU är dyr att implementera och att man kanske istället väljer att approximera denna strategi. Hur skulle vi kunna aproximera algoritmen och vad skulle det ha för konsekvenser? Kan delar av algoritmen implementeras i hårdvara? : i f ( entry >p r esent == 1) { i f ( entry >next!= NULL) { i f ( f i r s t == entry ) { f i r s t = entry >next ; e l s e { entry >prev >next = entry >next ; entry >next >prev = entry >prev ; entry >prev = l a s t ; entry >next = NULL; l a s t >next = entry ; l a s t = entry ; e l s e { : Svar: Koden länkar ut ett entry och lägger det sist i en länkad lista som skall vara uppdaterad med de minst använda sidorna först. Operationen måste göras varje gång en sida refereras. Om vi nöjer oss med att enbart registrera om en sida har använts eller inte sedan vi senast kontrollerade så kan detta hanteras med en bit i ett sidtabellspost (page table entry). Detta kan skötas, och sköts, i hårdvara. När det är dags att välja en sida som kan plockas bort går man igenom en cirkulär struktur och letar efter en sida vars värde är noll. Sidtabellsvärden som är satt till ett, sätts till noll. Detta kommer ge sidorna en ändra chans". 14

4.3 x86_64 adressering [2 poäng*] I en x86-processor i 64-bitarsmode så innehåller ett PTE en ramadress på 40 bitar. Denna kombineras med den virtuella adressens oset på 12 bitar till en fysisk adress. Detta blir 52 bitar men en process har endast 48-bitars virtuellt minne. Vilken fördel får vi genom att ha en 52-bitars fysisk adress? Svar: En enskild process kan visserligen inte adressera mer än 48-bitars adressrymd men vi kan ha era processer i minnet samtidigt. Om vi var begränsade till 48-bitars fysiskt minne skulle vi inte kunna ha mer än 64 Gibyte i RAM. 15

5 Filsystem och lagring 5.1 lista innehållet i en map [2 poäng] Om vi vill lista innehållet i en map så kan vi använda oss av biblioteksrutinen opendir(). Vilken information kan vi direkt få ut av strukturen som pekas ut av entry i koden nedan? Beskriv tre viktiga egenskaper. Vilka egenskaper av en l kan vi inte hitta direkt från strukturen och var kan vi hitta dessa? i n t main ( i n t argc, char argv [ ] ) { char path = argv [ 1 ] ; DIR dirp = opendir ( path ) ; s t r u c t d i r e n t entry ; while ( ( entry = r e a d d i r ( dirp ) )!= NULL) { // what information do we have? Svar: Det vi kan hitta direkt är: namn, typ och inod-nummer. Typen kan vara: l, map, mjuk länk mm. Alla egenskaper (storlek, skapad, ändrad, ägare etc) för en l måste vi hämta in lens inod. 5.2 ta bort en l [2 poäng] Om vi använder kommandot rm så tar vi inte bort en l utan bara en hård länk till en l. När försvinner själva len? Hur hanteras detta? Svar: Varje inode inhehåller information om hur många hårda länkar som nns till len. När vi tar bort den sista länken så kommer len att att tas bort (dess data kommer ligga kvar på disk men är inte åtkomligt via lsystemet). 16

5.3 loggbaserade fs [2 poäng*] I ett loggbaserar lsystem skriver vi alla förändringar i en kontinuerlig logg utan att göra förandringar i de redan existerande block som en l har. Vad är poängen med att hela tiden skriva nya modierade kopior av datablock istället för att gå in och göra de små förändringar som vi vill göra? Om det är bättre, är det något som blir sämre? Svar: Genom att hela tiden skriva i slutet på loggen behöver vi inte röra skrivhuvudet. Om vi skall skriva på alla enskilda block så måste vi föra skrivhuvudet fram och tillbaks vilket kommer vara en stor nackdel. Vi betalar priset när vi skall läsa en l som i värsta fall nu är utspridd över hela disken. 17