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. |
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
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!
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?
#include <stdio.h> #include <unistd.h> int main(void) { int forks = 0; fork(); ++forks; fork(); ++forks; fork(); ++forks; printf("forks = %d\n", forks); } // main |
#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 |
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.
a) Förklara vilka det är, och vad man har varje kö till!
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?
Vad beror skillnaden på?