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






Tentamen i

Operativsystem
för civilingenjörer

måndag 2 januari 2023

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 38. För godkänt betyg krävs 20 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
2x / 2y = 2x-y

Uppgift 1 (3 p)

På en tidigare tenta fanns en uppgift om ett C-program för Linux som öppnar filen foo.bin med systemanropet open, därefter skriver ganska mycket data med ett antal write-systemanrop, och till slut stänger filen med systemanropet close. Uppgiften handlade om att close-anropet ibland kunde ta mycket längre tid än alla write-anropen, trots att man kanske tycker att det är skrivningarna, med write, som borde ta längst tid, medan close bara är en enkel administrativ operation som markerar att filen inte längre är öppen. Det rätta svaret handlade om buffring, och att data kanske inte faktiskt skrevs förrän i close-anropet.

Nu skriver vi i stället ett C-program för Linux som öppnar filen foo.bin med systemanropet open, men nu för läsning och inte skrivning, och därefter läser vi ganska mycket data med ett antal read-systemanrop. Till slut stänger vi filen med systemanropet close. Kan det bli likadant nu, att close-anropet tar väldigt lång tid? Förklara!

Uppgift 2 (4 p)

Vad är de viktigaste skillnaderna mellan en process och en tråd?

När kan det vara lämpligt att använda en tråd, och när kan det vara lämpligt att använda en process?

Uppgift 3 (3 p)

Det här är ett C-program för Linux. Vad skrivs ut när vi kör programmet? Förklara också varför det blir så!

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

int main(void) {
    int forks = 0;
    fork();
    ++forks;
    fork();
    ++forks;
    fork();
    ++forks;
    printf("forks = %d\n", forks);
} // main

Uppgift 4 (9 p)

Det här är ett C-program för Linux. Det startar tusen trådar, som var och en tusen gånger ökar variabeln data med ett. Till slut innehåller variabeln en miljon.

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

#define NR_THREADS 1000
#define NR_ITERATIONS 1000

volatile long long int data = 0;
pthread_mutex_t lock;

static void *thread_body(void *arg) {
    for (int i = 0; i < NR_ITERATIONS; i++) {
        pthread_mutex_lock(&lock);
        ++data;
        pthread_mutex_unlock(&lock);
    }
    return NULL;
} // thread_body

int main(void) {
    pthread_t threads[NR_THREADS];
    pthread_mutex_init(&lock, NULL);

    for (int i = 0; i < NR_THREADS; ++i) {
        pthread_create(&threads[i], NULL, thread_body, NULL);
    }

    for (int i = 0; i < NR_THREADS; ++i) {
        pthread_join(threads[i], NULL);
    }

    printf("All threads have finished.\n");
    printf("Result: data = %lld\n", data);
} // main

a) Beskriv vad som händer om vi byter ut funktionen thread_body mot den här:

static void *thread_body(void *arg) {
    for (int i = 0; i < NR_ITERATIONS; i++) {
        ++data;
    }
    return NULL;
} // thread_body

b) Beskriv vad som händer om vi i stället byter ut thread_body mot den här:

static void *thread_body(void *arg) {
    pthread_mutex_lock(&lock);
    for (int i = 0; i < NR_ITERATIONS; i++) {
        ++data;
    }
    pthread_mutex_unlock(&lock);
    return NULL;
} // thread_body

c) Beskriv vad som händer om vi behåller den ursprungliga thread_body, men byter ut main-funktionen mot den här:

int main(void) {
    pthread_t threads[NR_THREADS];
    pthread_mutex_init(&lock, NULL);

    for (int i = 0; i < NR_THREADS; ++i) {
        pthread_create(&threads[i], NULL, thread_body, NULL);
        pthread_join(threads[i], NULL);
    }

    printf("All threads have finished.\n");
    printf("Result: data = %lld\n", data);
} // main

Uppgift 5 (5 p)

Vi har en byteadresserad dator som arbetar med virtuellt minne, där både virtuella och fysiska adresser består av 20 bitar, så man kan adressera som mest 1048576 byte. Det är också så mycket fysiskt minne som datorn har. I de virtuella adresserna utgörs 10 bitar av sidnummer och 10 bitar av offset inom sidan.

a) Om den virtuella adressrymden är lika stor som det fysiska minnet, vad är det då för mening med virtuellt minne och översättning av minnesadresser? Man skulle väl lika gärna kunna använda fysiska adresser direkt? Förklara!

b) Den virtuella minnessidan 0 är lagrad i frame 1, och den virtuella minnessidan 1 är lagrad i frame 0. Visa hur den virtuella adressen 4097 översätts till en fysisk minnesadress, och vad den fysiska adressen blir.

Uppgift 6 (5 p)

För schemaläggningen ("schedulering") av processer används flera olika köer där processerna placeras.

a) Förklara vilka det är, och vad man har varje kö till!

b) Var finns dessa köer?

Uppgift 7 (6 p)

a) Vad menas spinlock och busy-wait (även kallat spinning)?

b) Ge exempel på när det kan vara lämpligt för operativsystemkärnan att använda dessa.

c) Under vilka omständigheter bör operativsystemkärnan absolut inte använda dessa?

d) Varför är det normalt inte lämpligt att använda dem i vanliga program?

Uppgift 8 (3 p)

Vad går fortast av ett systemanrop och ett vanligt funktionsanrop?

Vad beror skillnaden på?