Ordinarie tentamen med lösningar

Pre. Lösningsförslag till Tentamen i ID2206, ID2200 samt
IS1350 Operativsystem 
Måndagen 2014-01-13 kl 1400-1800
Examinator: ID2206, ID2200 Robert Rönngren, IS1350 Jim Dowling
Hjälpmedel: Inga
Tentamensfrågorna behöver inte återlämnas efter avslutad tentamen.
Ange vilken kurs du tenterar och vilken termin du registrerades ffg. på kursen.
Varje inlämnat blad skall förses med följande information:
• Namn och personnummer
• Nummer för behandlade uppgifter
• Sidnummer
Rättning:
• Alla svar, även på delfrågor, måste ha åtminstone en kortfattad motivering för att ge poäng
• För ID2200 besvaras inte frågor märkta med *
• För IS1350 besvaras inte frågor märkta med ¤L
Betygsgränser:
• Godkänt (E) garanteras från 50% av den maximala poängen på respektive kurs
Frågor:
1) Du har blivit övningsassistent i OS kursen. En student har lämnat in en labb med kodraden nedan. 
a) Vad gör koden (översiktligt)?
b) Beskriv mer i detalj vad som sker på användarnivå och i kärnan när rad 2 utförs?
char buf[20];
int ret = read(0,buf,12);
(1p)
(2p)
// LINE 1
// LINE 2
a) Koden läser 12 tecken från stdin och lagrar dessa i vektorn buf, antalet lästa tecken fram till filslut (EOF) eller
ev. felkodlagras i variabeln ret
b) read(2) är en biblioteksfunktion i libc som anropas för att utföra systemanropet. I den läggs parametrar till read
och koden för systemanropet read på rätt ställen för att kärnan skall kunna komma åt dem, normalt i register.
Sedan utförs en TRAP-instruktion till kärnan. Kärnan kontrollerar att det är ett systemanrop. Via fildeskriptorn för
stdin (0) så kan kärnan identifiera vilken drivrutin som skall användas (i UNIX/LINUX pekas en i-nod ut som
innehåller ett major device id) och read funktionen i den drivrutinen anropas. När läsningen är avslutad genereras
normalt ett avbrott som talar om för kärnan att läsningen är klar. Då returneras till biblioteksfunktionen som i sin
tur returnerar till anropet med värdet som indikerar status för operationen (hur det gick) som lagras i ret.
Kommentar: read() och write() hör till de vanligare systemanropen och vi har gått igenom dem på övningar
eller labbar. I a-delen tror många att read läser av vektorn buf, varför man skulle behöva systemanrop för
att läsa av en vektor i ett program är svårt att förstå. Lika svårt är att förstå de som hävdar att man lagrar
de 12 första teknnen från buf i integren ret. b-delen fokuserar på en annan viktig aspekt av hur man
kommunicerar med/använder OS:et hur systemanrop går till. Båda är grundläggande kunskaper.
2) Interaktiva operativsystem har oftast preemptiv schemaläggning.
Förklara de vanligaste orsakerna till att en process preemptas (avbryts i förtid)!
(1.5p)
Att en process avbryts i förtid orsakas normalt sett av en av tre orsaker:
i) Processen genomför ett systemanrop som blockerar
ii) Om man har prioritetsbaserad schemaläggning, vilket de flesta system har, kan en process med högre prioritet
avbryta en process med lägre prioritet då den högre prioriterade processen blir körklar (läggs i READY kön)
iii) Normalt sett får en process inte exekvera hur länge som helst utan att låta andra processer köra, dvs. de flesta
system har en begränsad längd på en process time-slice. Så när en process time-slice tar slut pre-emptas den.
iv) Context switch sker också vid avbrott
Kommentar: Grunder för avbrytande schemaläggning. Många missar att jag frågat efter flera orsaker.
3) Kalle vill förbättra schemaläggningen i sitt OS. Han vill införa att en process som inte fått exekvera under det
senaste tidsintervallet (~1s) automatiskt skall få prioriteten höjd permanent. Är detta en bra ide? Förklara? (1p)
Sida 1
Generellt sett är detta en dålig idé. om processerna får permanent höjd prioritet skulle det leda till att alla
långvariga processer till slut får maximal prioritet och idén med prioriteter faller. Om prioritetshöjningen hade varit
temporär så hade det kunnat vara en bra idé för att undvika svältning/få mer rättvis fördelning av processortiden
Kommentar: Svältning är en risk som uppstår så fort man inför prioriteter. Många missar att
prioritetshöjningen är permanent. Andra går på villsopår och börjar diskutera realtidsfrågor. Förvånansvärt
många missar kopplingen till fråga 14
4) I sidindelat virtuellminne delas en virtuell adress upp i två delar - sidnummer och offset. 
Förklara hur dessa används!(1p)
De ansvänds vid adressöversättning från logisk/virtuell adress till fysisk. Sidnumret används för att slå upp, i TLB
och sidtabell, i vilken fysisk ram sidan finns när den ligger i primärminnet. Vid adressöversättningen för en sida
som finns i primärminnet ersätts sidnumret med ramnummer i när man går från logisk/virtuell adress till fysisk
adress. Offset används för att indexera/adressera sig inom sidan/ramen och förändras inte vid
adressöversättningen.
Kommentar: helt grundläggande för sidindelat virtuellminne vilket är en av de viktigare delarna i kursen
5) Antag att minnessaccesstiden i ett system är m tidsenheter för att accessa minnet direkt. Att systemet är
sidindelat och använder en TLB där access/söktiden för TLBn är t tidsenheter och att det tar d tidsenheter att
överföra en sida från disk till minnet och att sidtabellen är en två-nivåers sidatabell.
a) Ange en formel för den minsta minnsesaccesstid vi kan förvänta oss vid en TLB miss.
(1p)
b) Ange en formel för den genomsnittsliga tiden för att ladda en variabel från en sida som ligger i swaparean
till register om vi har 95% träffsannolikhet i TLBn och 90% sannolikhet att det finns en ledig ram.
(1p)
a) Den kortaste accesstiden får man i detta fall då sidan finns i primärminnet och den inkluderar: tid att söka (och
inte hitta informationen i TLBn) + tid att indexera i sidtabellens två nivåer + tid att hämta datat från minnet dvs.:
t+2m+m = t+3m
b) Största svårigheten här är att man måste inse att man måste göra följande antagande: Antag att sannolikheten
för att det finns en ren ram att tillgå i de fall då det inte finns en ledig ram är P. Då blir formeln: Sökning i TLBn
(som misslyckas) + uppslagning i sidtabellen + sannolikhet för att det finns en ledig ram* tid att läsa in sidan + (P*
tid att läsa in den efterfrågade a) sidan + (1-P) (tid att skriva en modifierad sida från en ram till disk + tid att läsa in
den efterfrågade sidan)) + tid att accessa minnet för att läsa variabeln dvs: t+2m+P*d+(1-P)2d = 
t+2m+(2-P)d
(Obs! att vi i uppgiften bortsett från den tid det tar att uppdatera TLB, sidtabell och initiera diskoperationerna)
Kommentar: frågan är designad för att visa om man förstått hur adressöversättningen går till i de fall man
har sidindelat virtuellminne. Många glömmer att man slår upp i sidtabellen vid en TLB-miss. En del missar
att sidan mycket väl kan finnas i minnet även om adressöversättningen inte finns i TLBn på a-delen. På bdelen är det ganska många som inte svarat med lösningar där dimensionen på svaret är tid utan t.ex tid i
kvadrat (ex. t*m eller t*t). Många verkar tro att man söker flera gånger i TLB och/eller sidtabell.
6) Förklara vad man vinner och/eller förlorar på att gå från:
a) en en-nivås sidtabell till en två nivåers sidtabell
b) en vanlig inverterad sidtabell till en hashad inverterad sidtabell
(1p)
(1p)
a) I en en-nivås sidtabell finns en post för varje potentiell sida en process kan utnyttja i den virtuella
adressrymden. Eftersom en process oftast bara utnyttjar en del av den virtuella adressrymden i större
adressrymder kan det här leda till slöseri med minne. En två-nivåers sidtabell håller alltid en yttre sidtabell och
bara inre sidtabeller för de delar av den virtuella dressrymden som procesen utnyttjar. Den kan alltså minska
minnesåtgången för sidtabellen i de fall då processen utnyttjar bara en del av den virtuella adressrymden, men
detta sker på bekostnad av att det krävs två indexeringar/minnesaccesser för att göra en uppslagning i tvånivåers varianten mot bara en indexering/minnesaccess i en-nivås dito.
b) En inverterad sidtabell håller reda vilka sidor som finns lagrade i primärminnet. i en naiv implementation har
man alltså en tabell (vektor) med en post per ram. Detta medför två nackdelar: När man vill söka efter en sida för
att se om den finns i en ram och i så fall vilken ram innebär det en sökning i en ostrukturerad datamängd vilket är
tidkrävande; Samt om man vill implementera delat minne så kan man inte enkelt låta två olika processers sidor
mappa till samma ram. Implementerar man istället den inverterade sidtabellen mha en hashtabell vinner man två
fördelar: Sökningen ersätts med en (mindre kostsam) beräkning av en hashfunktion. Man kan enklare låta flera
processer mappa sidor mot samma ramar vilket gör det enklare att implementera delat minne.
Kommentar: a-delen var för många svårare än b-delen!? Många verkar tyvärr tro att en uppslagning i en ennivås eller två-nivås sidtabell sker som en sökning O(n) där det sker med en eller två indexeringar
Sida 2
(minnesaccesser). Vanligt är också att man inte motiverar sitt svar. Man påstår helt enkelt t.ex. att
accesstiden blir kortare eller längre utan att förklara varför.
7) Hur många sidfel får man om man har 4 ramar, ren demand paging och följande referenssträng:
3 4 2 3 4 7 1 0 4 6 3 2 1 5 7 4
För algoritmerna OPT, LRU och FIFO.
(1.5p)
Räkningarna måste redovisas! OPT: 10, LRU: 13, FIFO: 14
Kommentar: antagligen den enklaste uppgiften på tentan. Tyvärr är det få som lyckas koppla algoritmerna
LRU och OPT till nästa uppgift. Tyvärr pekar det på att man nog kan lära sig räkna på detta utan att ha
förstått grunderna.
8) I system med sidindelat minne försöker man ibland uppskatta något som kallas för Working Set för processer/
trådar.
a) Vad är Working Set?
(1p)
b) Hur kan man använda en uppskattning av Working Set?
(1p)
c) Ge minst två konkreta exempel på hur olika sidutbytesalgoritmer försöker uppskatta Working Set!
(2p)
a) WS är den mängd (engelskans set) sidor en process accessar/arbetar med under något tidsintervall (då man
observerar den)
b) Om en process eller grupp av processer inte kan hålla sitt/sina Working Set kommer de att generera många
sidfel. Sidutbytesalgoritmer bör alltså sträva efter att uppskatta och hålla processernas working sets i minnet.
c) Här finns många algoritmer att exemplifiera med och förklara hur de försöker uppskatta och hålla WS i minnet
som: LRU, NRU, Clock, Second-chance, aging-mekanismer...
Kommentar: WS-begreppet är grundläggande att förstå då lokaliteten är det som gör att virtuellminne går
att implementera praktiskt. Många tror också att FIFO uppskattar WS - vilket den inte gör .
9) De moderna filsystemen från Microsoft har implementerat intressanta egenskaper hos datatypen för filer för
att bättre stödja multi-media applikationer. Vad är det för egenskaper och hur stödjer de multi-media?
(1p)
En multi-media tillämpning består oftast av flera dataströmmar. En video består till exempel oftast av bild
information, ljud på ett eller flera språk och kanske textningsinformation. Datatypen för en fil i moderna MS
filsystem tillåter att en fil består av flera dataströmmar.
Kommentar: Genererade ganska många olika typer av svar...
10) Kalle skall implementera ett självjusterande filsystem för en video-on-demand tjänst där utbudet av film
uppdateras relativt sällan (1 gång per dygn). Målet är att få bästa möjliga prestanda ur systemet. Han utgår
från ett open-source filsystem liknande UFS. Filsystemet lagras på en vanlig magnetisk hårddisk (dvs med
roterande skivor). Vilka är de viktigaste sakerna han bör implementera? Varför?
(3p)
Eftersom vi inte vet något om applikationen bör man utgå från att man inte skall förändra datatypen för en fil (jfr
uppgift 9) och heller inte systemanropen. De åtgärder Kalle bör vidta är:
1) att man i drivrutinen för filsystemet loggar vilka filer som accessas mest frekvent (och ev. att man också loggar
om flera filer accessas samtidigt t.ex. om en video består av flera filer för bild, ljud och annan information.)
2) De mest frekvent accessade filerna och deras inoder bör placeras på spår så nära diskens mitt som möjligt och
mindre frekvent accessade filer bör placeras längre ut åt kanterna (dvs. mot centrum eller ytterkanten) av disken
för att minska diskarmsrörelserna.
3) Filernas block bör placeras så att de kommer i sekvens efter varandra för att minska diskarmsrörelser och
underlätta read-ahead.
(PS: att applikationen är en video-on-demand applikation har ganska liten betydelse - dvs. uppgiften kan lösas
utan kunskap om multi-media och hur den implementeras))
Kommentar: De flesta svar handlade om att implementera sådant som antingen redan finns i många
filsystem inkluderat UFS som accesskontroller eller om sådant som inte är filsystemsimplementation i sig
som att köpa andra typer av hårddiskar eller vilka kommunikationsprotokoll applikationerna som läser
filerna/filmerna använder.
11) Förklara vad ett sk. Segmentation-error/fault är och hur det relaterar till TLB-miss och sidfel!
(2p)
Sida 3
Segmentation fault kan vara orsakat av att: 1) man försöker accessa en sida som inte är inmappad i den virtuella
dressrymden som man alltså inte får accessa; eller 2) att man accessar en sida på ett sätt som man inte har
rättigheter till, som t.ex att man försöker skriva i en sida man inte får skriva till eller exekvera instruktioner från en
sidan man inte får exekvera från.
För fall 1 vet man att en TLB-miss kommer att genereras eftersom sidan inte finns. Däremot leder inte fall1 till ett
sidfel i den meningen att en sida skall läsas in från backing-store/swaparean.
För fall två finns ingen direkt koppling till varken TLB-missar eller sidfel. Finns adrssöversättningen för sidan i
TLBn kontrolleras acessrättigheterna vid TLB uppslagningenannrs kontrolleras de då man gör uppslagningen i
sidtabellen.
Kommentar: De flesta identifierar fall 1. Många beskriver tyvärr TLB-missar och sidfel i generella termer
utan att försöka koppla dem till seg-fault. Att man kontrollerar rättigheter och eller om sidan finns är
centralt i säkerheten i virtuellminnessystem.
12) Vilka egenskaper har SCAN-algoritmen för diskaccesser som är att föredra framför FCFS?
(1p)
SCAN ordnar diskaccesserna så att man hela tiden betjänar accesser som ligger i den riktning diskarmen rör sig.
om man exempelvis rör armen från ytterkanten av disken mot centrum så betjänas bara accesser på samma spår
eller på spår närmare centrum så länge armen rör sig åt det hållet. När inga accesser finns i den riktningen
vänder man rörelseriktning på diskarmen och rör den ut mot ytterkanten och betjänar accesser på de spår man
passerar. Jämfört med FirstComeFirstServe som betjänar accesserna efter den tidsordning de kommer in minskar
SCAN diskarmsrörelserna.
Kommentar: tyvärr en fråga där ganska många chansar och svarar i generella ordalag om snabbare, bättre
etc. utan att förklara varför.
13) Ett av Coffmans villkor för deadlock är i de flesta fall enklare att bryta mot än de övriga när man gör en
design för att undvika deadlock i parallella system.
a) Vilket är villkoret? och varför är det oftast det enklaste att attackera?
(1p)
b) Antag att vi har ett system med ett antal olika resurstyper och att varje resurstyp har mer än en enhet av
resurstypen. Hur designar man ett system för allokering av dessa resurser som tillåter bra parallellitet men
som bryter mot villkoret från a-uppgiften?
(1p)
a) Det villkor som oftast är enklast att bryta mot är villkoret om cirkulär väntan kan man bryta det villkoret, vilket
man enkelt kan göra om alla resurser/resut´rstyper måste allokeras i en viss ordning, så kan man tillåta exklusivt
ägda resurser, slippa från pre-emption samt tillåta att man håller samtidigt kan begära fler resurser (dvs man
behöver inte bryta övriga villkor).
b) Man numrerar alla resurstyper (resurser). Man får bara allokera resurser i strikt ökande ordning. Dvs om man
håller en resurs med ordningsnummer N får man bara allokera ytterligare resurser om dessa har ordningsnummer
M > N. Det bryter villkoret då en process bara kan tvingas vänta på en annan process om den andra processen
håller resurser med högre ordningsnummer och aldrig kan tvingas vänta på en process som håller en resurs med
samma eller lägre ordningsnummer som den resurs med högsta ordningsnummer processen själv håller.
Kommentar: Kanske 50% identifierar cirkulär väntan (circular wait) som det villkor som generellt sett är
enklast att bryta. Att konfiskera resurser från de som använder dem eller att helt avskaffa ömesisdig
utselutning är vårare eller rent omöjligt. Tyvärr blandar en hel del ihop begreppen och tycker att man skall
bryta cirkulär väntan mha av preemption eller att bryta andra villkor.
14) I schemaläggning baserad på prioriteter kan i vissa fall svältning uppstå. Beskriv den vanligaste mekanismen
man implementerar för att undvika problemet!
(1p)
Normalt löser man detta genom ageing. Ageing kan implementeras så att en process som inte fått en rättvis del
av processortiden, dvs som inte fått exekvera tillräckligt mycket, kan få en temporärt höjd prioritet. Alternativt så
kan processer som fått exekvera mycket få temporärt sänkt prioritet.
Kommentar: tyvärr missar allt för många att göra kopplingen till fråga 3 och att förändringar av prioriteten
(höjningar/sänkningar) för att motverka svältning bör/måste vara temporära.
15) Kalle har kompilerat och lagt följande program i sin AFS-hemkatalog där namnet på den exekverbara filen är
fs. Han ber en systemadministratör hjälpa honom att sätta accessrättigheter på en katalog som inte ligger i
hans hemkatalog men som han länkat till.
a) Vad kallas den här typen av program?och vad försöker det här programmet göra?
(1p)
b) Har det någon betydelse om systemadministratören är inloggad som root när han hjälper Kalle?
(0.5p)
Sida 4
c) Har det någon betydelse om systemadminstratören har . först i sin PATH?
d) Vad hade hänt om Kalle använt execvp() istället för execv()?
(0.5p)
(0.5p)
int main(int argc, char **argv){
system("fs sa /afs/cell kalle a");
execv("/usr/bin/fs", argv);}
a) Det är en trojan, dvs. ett program som gör någon form av "Malware" funktion förutom det det utger sig för att
göra. I det här fallet försöker Kalle få administrationsrättigheter i den AFS-cell hans hemkatalog ligger i.
b) Det enda som har betydelse är om systemadministratören är autenticerad (~inloggad) i AFS systemet så att
han/hon har administratörsrättigheter i den lokala cellen. Detta kan, men behöver inte, vara kopplat till om man är
inloggad i som root i operativsystemet på den lokala datorn.
c) Ja, om inte systemadministratören har . (punkt - ansluten katalog) med i sin PATH före katalogen där det riktiga
fs-kommandot ligger kommer han/hon aldrig att köra Kalles trojan av misstag.
d) I det här fallet anger Kalle en absolut sökväg från roten på filträdet när han försöker exekvera den riktiga fs så
det har ingen betydelse. (Om han däremot skrivit execvp("fs",argv) hade han åstadkommit en oändlig rekursion
om trojanen startats på grund av att någon haft . (punkt) med i sin PATH)
(fs bör man känna till eftersom det är kommandot för att sätta, läsa av mm. rättigheter i AFS där man i kursen
skall lägga in labbar i kataloger som kan läsas enbart av medlemmarna i labbgruppen och av assistenter/lärare på
kursen)
Kommentar: AFS är det distribuerade filsystem KTH använder på sina system för studenter. För de som
läst ID2200 eller ID2206 så ska man ha lämnat in sina labbar i bland annat en katalog som man själv
skapat och satt rättigheter på i AFS. Oavsett om man känner till AFS och fs-kommandot bör man kunna
identifiera programmet som en trojan. I b-delen har bara några få identifierat att man måste skilja på om
man är inloggad som root på operativsystemet eller om man har accessrättigheter i AFS till kalatogen afs/
cell. I c-delen inser relativt få att det antagligen är omöjligt att få systemadministratören att köra Kalles
trojan av misstag om han/hon inte har . (punkt - ansluten katalog) med först i sin PATH.
16) ¤ En drivrutin består ofta av två delar - i UNIX/LINUX terminologi kallas dessa top-half resp. bottom-half
device driver. Beskriv dessa kortfattat!
(1p)
Drivrutinen implementerar normalt sett systemanrop på någon typ av enhet (fysisk eller virtuell). Top-half är den
del som innehåller koden för att starta upp systemanrop när en användare gjort ett systemanrop, typiskt open(),
read(), write() etc. om resultatet av operationen inte blir klart/tillgängligt direkt signalerar drivrutinen till OS-kärnan
när resultate är klart via ett avbrott. När avbrottet kommer hanteras det genom att en avbrottsrutin i drivrutinen
anropas - det som kallas bottom-half device driver.
Kommentar: Förvånansvärt svår fråga. Logiskt så är drivrutiner i princip alltid organiserade på detta vis
oavsett OS. I IS1350 så har man dessutom labbat på både implementation av anropsgränssnittet (read,
write mfl.) och på stackade avbrottsrutiner.
17) ¤ Många OS implementerar "stackade" avbrotts- och drivrutiner.
a) Vad betyder detta?
(0.5p)
b) Hur implementeras det i avbrotts- eller drivrutinen, vad händer då de anropas?
(1p)
c) Kan det ha någon påverkan på säkerheten i systemet om man har stackade rutiner? Exemplifiera gärna! (1p)
a) att avbrotts- eller drivrutinen (bottom resp. top-half-device driver funktionerna) inte är monolitiska utan att de
består av en kedja med funktioner som anropas till dess att resultatet/operationen är klar. Det betyder att man
enkelare kan återanvända kod och också installera kod för att t.ex övervaka hur avbrotts- och drivrutiner används.
b) För varje funktion i t.ex en drivrutin som open(), read() mfl. finns en lista med pekare till funktioner. Dessa
anropas en efter en till dess att sista funktionen i listan anropats eller till dess att en av funktionerna returnerat att
hela uppgiften är klar/utförd eller att man råkat ut för ett fel.
c) Tekniken med stackade rutiner gör det enklare att lägga till och/eller modifiera funktionaliteten hos rutinerna.
Det kan naturligtvis utnyttjas för olika former av intrång. Normalt måste man dock vara inloggad som root för att få
lägga till funktioner i funktionskedjorna/stackarna. Som exempel på vad man kan göra är att man t.ex. kan lägga
till en funktion som körs först när ett tangentbordsavbrott sker. Funktionen kan kontrollera och föra informationen
vidare om vilken tangent som tryckts. och på så sätt logga alla tangenttryckningar som sker. Om mna sedan
returnerar att avbrottet inte är färdigbehandlat anropas nästa funktion i kedjan, dvs de ordinarie. man kan också
tänka sig att om man skulle lyckas modifiera en vanligt förekommande funktion som används vid flera avbrott/
drivrutinsanrop så kan man infiltrera flera avbrotts/drivrutiner på en gång.
Sida 5
Kommentar: De som läst IS1350 har labbat på detta och själva lagt till funktioner i stacken av funktioner
som anropas vi avbrott. För de som läste ID2200/ID2206 har vi bara pratat om detta...
18) Förklara varför ett modernt OS är mindre sårbart för öppningar för buffer-overflow attacker än ett OS
liknande MS-DOS.
(1p)
Det viktigaste skälet är att man inte hade skydd (RWX) på olika delar av minnet utan man fick skriva var som helst
i minnet och man kunde exekvera instruktioner placerade var som helst i minnet. Det gjorde att man via en bufferoverflow attack i princip kunde skriva in och exekvera vilken typ av kod som helst. I moderna OS skyddas de olika
dataareorna så att man inte får exekvera saker från data-, bss-, heap- eller stack-areorna och man får heller inte
skriva i text-arean. På äldre system skilde man inte på olika användare utan det fanns bara en användare som
hade alla rättigheter att göra vad man vill på datorn (motsv. root). Idag skiljer man ofta på olika användare och ett
program under exekvering (dvs. en process) körs normalt med den användaridentitet och de rättigheter som den
användare har som startade programmet/processen.
Kommentar: Om man förstår hur program exekveras borde frågan varit relativt enkel. Man kan notera att
et är svårt att skriva över OS:et i en buffer-overflow attack eftersom man normalt skriver mot högre
adresser vid en inmatning och OS:et var placerat på lägre adresser än användarens program då det
exekverades. Många tycks tro att moderna OS kontrollerar längden på en inmatning. Det gör många
moderna programmeringsspråk som JAVA. OS:et kontrollerar däremot bara om man har rätt att skriva i en
sida. gets(3C) finns också på de flesta moderna system som en del av C-standarden. Att man i system med
stora virtuella adressrymder kan slumpa ut var man lägger dataareeor som stack och heap påverkar
möjligheterna till buffer-overflow i mindre utsträckning. Framförallt handlar det om att det i dessa fall blir
svårare att beräkna adresser för aktiveringsposter etc.
19) ¤Du skall bygga ett styrsystem för att styra ett hårt realtidssystem. Det består av flera periodiska jobb. Du
skall välja processor att bygga systemet kring och kan välja på en flerkärnig processor eller en en-kärnig
processor med likvärdiga prestanda och pris. Diskutera vilken av dem du normalt bör välja och varför? (1p)
Detta är en fråga som det inte finns ett entydigt rätt eller fel svar på. Det är resonemanget som kommer att
bedömas.
Det som talar för att man bör välja en processor med en kärna är att vi vet att det kan vara svårare att hitta en
schemaläggning på flera kärnor som är optimal, t.ex. har vi i kursen visat att EDF inte är optimal på flera
kärnor.Det kan också vara svårare att kunna utnyttja alla processorcykler på en flerkärnig processor. Genom att
kapaciteten delas upp på flera kärnor får man något som skulle kunna liknas vid en fragmentering av
beräkningsresursen som gör att man inte kan utnyttja alla cykler på alla kärnor. Till de flerkärniga processorernas
fördelar talar att man kan ha olika specialanpassade processorer som grafik- eller digital signalbehandlingsprocessorer i tillägg till vanliga generella processorer. Man kan också tänka sig att man enklare kan hantera olika
sensorer- och styrdon som t.ex kommunicerar med avbrott om dessa kan behandlas separat av olika processorer.
(Trenden just nu är att man allt mer går mot fler-kärniga processorer och virtualisering även inom hårda
realtidssystem)
20) Vad används heap, data respektive bss sektionerna som man hittar i den virtuella adressrymden 
för en process till? Varför har man normalt alla tre?
(1.5p)
heap - används för att lagra data som allokeras under körningen men som inte skall lagras på stacken. Dvs för
data som t.ex skall vara globalt tillgängligt eller ha en livslängd utöver ett funktionsanrop
data - används för att lagra initierad global data och konstanter
bss - används för att lagra global data och konstanter som skall initialiseras till noll vid start av processen.
Komentar: Riktigt grundläggande begrepp kopplade till hur man organiserar processer...
data och bss arean är statiska dataareor som är kända vid programstart medan heapen används dynamiskt varför
bägge delar är logiska att ha. Att man har både data och bss beror på att man för data-arean måste lagra
information om alla initialvärden i den exekverbara filen medan man för bss bara behöver lagra information om
hur stor arean skall vara (den initieras sedan vid behov till 0 vid start av processen)
21) På 90-talet släpptes BSD UNIX som open-source. BSD var vid den här tiden ett betydligt bättre och mer
moget OS än LINUX. Ändå fick LINUX snabbt fler användare. Förklara varför!
(1p)
Sida 6
Det har sin orsak i att när BSD släpptes fritt så drev AT-T en legal tvist mot University of California (där Berkely
universitet är ett av Kaliforniens statliga universitet) Det gjorde att få vågade använda BSD av risk att i sin tur
hamna i tvist med AT-T.
Kommentar: Ganska många har svarat att LINUX var bättre, hade väsentligt andra licensvillkor eller att
man marknadsförde det bättre. Inget av detta är sant.


"Alla såg äpplen falla men det var bara Newton som frågade sig varför"
B. M. Baruch
Sida 7