Örebro universitet
Institutionen för naturvetenskap och teknik
Thomas Padron-McCarthy (thomas.padron-mccarthy@oru.se)









Tentamen i

Operativsystem för civilingenjörer

onsdag 29 maj 2024

Gäller som tentamen för:
DT513G Operativsystem för civilingenjörer, provkod A001


Hjälpmedel: Ordbok för översättning.
Poängkrav: Maximal poäng är 30. För godkänt betyg krävs 18 poäng.
Resultat: Meddelas senast 15 arbetsdagar efter tentamensdatum.
Återlämning av tentor: Elektroniskt via webbportalen Studenttjänster.
Examinator och jourhavande: Thomas Padron-McCarthy, telefon 070 - 73 47 013.




LYCKA TILL!

Formelsamling

20 = 1 224 = 16777216
21 = 2 225 = 33554432
22 = 4 226 = 67108864
23 = 8 227 = 134217728
24 = 16 228 = 268435456
25 = 32 229 = 536870912
26 = 64 230 = 1073741824
27 = 128 231 = 2147483648
28 = 256 232 = 4294967296
29 = 512 233 = 8589934592
210 = 1024 234 = 17179869184
211 = 2048 235 = 34359738368
212 = 4096 236 = 68719476736
213 = 8192 237 = 137438953472
214 = 16384 238 = 274877906944
215 = 32768 239 = 549755813888
216 = 65536 240 = 1099511627776
217 = 131072 241 = 2199023255552
218 = 262144 242 = 4398046511104
219 = 524288 243 = 8796093022208
220 = 1048576 244 = 17592186044416
221 = 2097152 245 = 35184372088832
222 = 4194304 246 = 70368744177664
223 = 8388608 247 = 140737488355328

2x * 2y = 2x+y

Uppgift 1 (5 p)

En av operativsystemets uppgifter är att hålla reda på processer. En process kan befinna sig i olika tillstånd (på engelska "states"). Till exempel kan processen vara körande (på engelska "running"), vilket betyder att den faktiskt är igång och kör på processorn. Men det finns ett antal andra tillstånd som processen kan befinna sig i.

a) Rita ett diagram som visar de olika tillstånden och övergångarna mellan dem.

b) Operativsystemkärnan innehåller en del datastrukturer som är relaterade till processerna och deras tillstånd. Vilka datastrukturer är det?

Uppgift 2 (3 p)

Frågan ovan handlar om processer, men hur är det med trådar? Har trådar också dessa tillstånd? Och är det operativsystemet som håller reda på trådarna, på samma sätt som processerna? Förklara!

Uppgift 3 (4 p)

a) Vad menas med schemaläggning ("scheduling")?

b) Beskriv två olika algoritmer för schemaläggning, och jämför dem. Vilken av dem är bäst, och vad menar man egentligen med "bäst"?

Uppgift 4 (3 p)

En dator har minnesadresser på 16 bitar, både för virtuella och fysiska adresser. Både den virtuella och den fysiska adressrymden är alltså 216 = 65536 adresser.

Men är inte hela idén med virtuellt minne att man ska kunna använda mer minne än vad som finns fysiskt i datorn? Hur blir det då när adressrymderna är lika stora? Förklara!

Uppgift 5 (3 p)

I Unix finns en datastruktur som kallas i-nod (på engelska "i-node" eller "inode"). Vad används den till, och vad innehåller den?

Uppgift 6 (5 p)

Här är ett C-program för Linux:

#include <stdio.h>
#include <unistd.h>

int a = 0;

void f(int b) {
    b = b + 1;
    printf("a = %d, b = %d\n", a, b);
}

int main(void) {
    int c = 0;
    if (fork() == 0) {
        a = a + 1;
        c = c + 1;
        printf("child: a = %d, c = %d\n", a, c);
        f(5);
    }
    else {
        a = a + 2;
        c = c + 2;
        printf("parent: a = %d, c = %d\n", a, c);
        f(7);
    }
    fork();
    printf("finished: a = %d, c = %d\n", a, c);
}

a) Vad skrivs ut när programmet körs?

b) Kan det bli olika utskrifter från gång till gång? Vad kan i så fall bli olika, och vad beror det på?

Uppgift 7 (3 p)

Här är ett annat C-program för Linux. Man får mata in hur många trådar som ska startas. Varje tråd ökar variabeln g en miljon gånger.

#include <stdio.h>
#include <pthread.h>

volatile int g = 0;

void *thread_body(void *arg) {
    for (int i = 0; i < 1000000; ++i) {
        ++g;
    }
    return NULL;
}

int main(void) {
    printf("How many threads do you want? ");
    int nr_threads;
    scanf("%d", &nr_threads);
    printf("Starting %d threads...\n", nr_threads);
    pthread_t threads[nr_threads];
    for (int i = 0; i < nr_threads; ++i)
        pthread_create(&threads[i], NULL, thread_body, NULL);
    printf("%d threads have been started.\n", nr_threads);
    printf("Waiting for them to finish...\n");
    for (int i = 0; i < nr_threads; ++i)
        pthread_join(threads[i], NULL);
    printf("All %d threads have finished.\n", nr_threads);
    printf("The value of g is %d.\n", g);
}

Vi provkör programmet och matar in att vi vill köra 100 trådar. Provkörning:

How many threads do you want? 100
Starting 100 threads...
100 threads have been started.
Waiting for them to finish...
All 100 threads have finished.
The value of g is 2452039.

Vi provkör programmet en gång till, men nu vill vi bara köra en enda tråd. Provkörning:

How many threads do you want? 1
Starting 1 threads...
1 threads have been started.
Waiting for them to finish...
All 1 threads have finished.
The value of g is 1000000.

a) Kan man förvänta sig att den första provkörningen, med hundra trådar, alltid ger samma värde på variabeln g? Förklara!

b) Kan man förvänta sig att den andra provkörningen, med en tråd, alltid ger samma värde på variabeln g? Förklara!

Uppgift 8 (4 p)

Den dyraste processor som just nu (när jag skriver detta) finns i lager enligt prisjämförelsesajten prisjakt.nu är AMD Ryzen Threadripper PRO 7995WX. Den har 96 kärnor, och med AMD:s motsvarighet till hyperthreading kan den köra 192 parallella trådar. Klockfrekvensen är 2,6 GHz. Den kostar 137990 kronor.

När vi provkör trådprogrammet från uppgiften ovan med en enda tråd, som vi gjorde, visar det sig att det tar 0,001 sekunder på en dator med den processorn.

Vi provkör tråd-programmet en gång till på samma dator, men nu med 100 trådar. Ungefär hur lång tid kan man gissa att det kommer att ta? Förklara hur du tänkt, och vad som spelar in för körtiden.