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. |
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
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?
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"?
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!
#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å?
#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!
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.