Ö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 30 maj 2022

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 16 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 (7 p)

a) Vad är det för skillnad på operativsystemkärnan och ett systemprogram? Ange några olika saker som skiljer dem åt!

b) Vad är det för skillnad på operativsystemkärnan och en hypervisor?

c) Vad är det för skillnad på en process och en tråd? Ange de viktigaste skillnaderna!

d) En mikrokärna är förstås mindre än andra typer av kärnor. Vad är det man har tagit bort, och var har man gjort av det?

Uppgift 2 (3 p)

Min skrivbordsdator har en 8-kärnig processor, med hyperthreading. Den kan köra flera program samtidigt, till exempel både webbläsaren och en snygg klocka som visar tiden och piper varje timme.

Min första egna dator hade bara en enkärnig processor, och ingen hyperthreading, men den kunde fortfarande köra flera program samtidigt. (Även om klockan hade färre pixlar och inte var lika snygg.) Förklara hur operativsystemet kan åstadkomma det på en enkärnig processor!

Uppgift 3 (5 p)

Här är ett C-program:

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

int x = 1;

int main(void) {
    int y = 1;
    if (fork() == 0) {
        x = x + 1;
        y = y + 1;
        printf("Ett! x = %d, y = %d!\n", x, y);
    }
    else {
        x = x + 1;
        y = y + 1;
        printf("Två! x = %d, y = %d!\n", x, y);
    }
    fork();
    x = x + 1;
    y = y + 1;
    printf("Tre! x = %d, y = %d!\n", x, y);
}

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

b) Om man kör programmet flera gånger kan utskrifterna bli olika mellan gångerna. Förklara varför!

Uppgift 4 (5 p)

Här är ett C-program. Det startar 1000 trådar. Varje tråd ökar variabeln data en miljon gånger.

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

volatile int data = 0;
pthread_mutex_t lock;

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

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

    printf("Starting the threads...\n");

    for (int i = 0; i < 1000; ++i) {
        if (pthread_create(&threads[i], NULL, thread_body, (void*)i) != 0) {
            printf("Error: Couldn't create thread %d.\n", i);
            exit(EXIT_FAILURE);
        }
    }

    printf("Waiting for the threads to finish...\n");

    for (int i = 0; i < 1000; ++i) {
        if (pthread_join(threads[i], NULL) != 0) {
            printf("Error: Couldn't join thread %d.\n", i);
            exit(EXIT_FAILURE);
        }
    }

    printf("All threads have finished.\n");
    printf("Result: data = %d\n", data);

    return EXIT_SUCCESS;
} // main

Utskrifter från när vi kör programmet:

Starting the threads...
Waiting for the threads to finish...
All threads have finished.
Result: data = 1000000000

a) Kan vi få deadlock i programmet?

b) Vi tar bort anropen till pthread_mutex_lock och pthread_mutex_unlock. Vad händer nu när vi kör programmet? Blir utskriften annorlunda?

c) Kan vi få deadlock när vi tagit bort pthread_mutex_lock och pthread_mutex_unlock?

d) Min dator har en 8-kärnig processor med hyperthreading, så den kan köra 16 trådar parallellt. Men här kör vi 1000 trådar samtidigt! Hur är det möjligt? Förklara!

Uppgift 5 (7 p)

Vi har en byteadresserad dator som arbetar med minnesadresser på 14 bitar, både för virtuella och fysiska adresser. Av de 14 bitarna används 10 för offset inom minnessidan.

a) Hur stor är den virtuella adressrymden?

b) Hur stor (dvs hur många byte) är en minnessida ("page")?

c) Hur många minnessidor är den virtuella minnesrymden indelad i?

d) Hur mycket fysiskt minne kan man ha i datorn?

e) Hur många frames (dvs platser för minnessidor) kan man ha i datorn?

f) Vi tittar i sidtabellen ("page table") för en process, och ser att virtuell minnessida 2 är lagrad i fysisk frame 1. (Båda numreras med början på noll.) Vilken fysisk adress är den virtuella minnesadressen 2050 lagrad på? Visa hur översättningen görs.

Uppgift 6 (3 p)

När man installerar applikationsprogram ("appar") på en mobiltelefon, brukar man kunna ange för varje sådant program vad det får och inte får göra, till exempel om det får göra uppkopplingar via Internet.

På en vanlig Linux-dator (en server, eller en stationär eller bärbar dator) kan man normalt inte göra det, utan alla applikationsprogram som man installerar får alla rättigheter som den användare som kör dem har, och det går inte (särskilt lätt) att begränsa detta.

Varför är det gjort så?