Operativsystem för civilingenjörer
onsdag 5 januari 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 28. För godkänt betyg krävs 15 poäng. |
Resultat: | Meddelas senast torsdag 27 januari 2022. |
Å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 |
b) Vad menas med operativsystemkärnan? Hur är den relaterad till kärnorna i en flerkärnig CPU?
c) Datorvirus är skadliga program som sprider sig genom att lägga en kopia av sig själva inuti andra program, så att när det programmet körs kan viruset spridas ytterligare. Är datorvirus systemprogram eller applikationsprogram? Diskutera!
b) Moderna processorer brukar ha åtminstone två "exekveringsmoder" eller "körningslägen" ("execution modes" på engelska) ibland kallade "ringar": en "user mode" med lägre rättigheter som är avsedd för att köra användarprogram, och en "supervisor mode" med mer rättigheter. För virtualisering och virtuella maskiner vill man ha åtminstone tre. Varför? Förklara!
#include <stdio.h> #include <stdlib.h> #include <pthread.h> #define NR_THREADS 2 int total_printouts = 0; static void *thread_body(void *arg) { int thread_number = (int)arg + 1; printf("In thread %d: Started!\n", thread_number); for (int i = 0; i < 3; i++) { for (int j = 0; j < 1000000000; j++) ; printf("In thread %d, printout number %d: Running!\n", thread_number, i + 1); ++total_printouts; } printf("In thread %d: Finishing...\n", thread_number); return NULL; } // thread_body int main(void) { pthread_t threads[NR_THREADS]; printf("In main: Will be starting %d thread(s)...\n", NR_THREADS); for (int i = 0; i < NR_THREADS; ++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("In main: Waiting for %d thread(s) to finish...\n", NR_THREADS); for (int i = 0; i < NR_THREADS; ++i) { if (pthread_join(threads[i], NULL) != 0) { printf("Error: Couldn't join thread %d.\n", i); exit(EXIT_FAILURE); } } printf("In main: All %d thread(s) have finished.\n", NR_THREADS); printf("Total printouts: %d\n", total_printouts); return EXIT_SUCCESS; } // main |
Den dyraste processor som just nu (när jag skriver detta) finns i lager enligt prisjämförelsesajten Prisjakt är Intel Xeon Platinum 8280. Den kostar 129526 kronor inklusive moms. Den kan använda en terabyte (1024 gigabyte) minne och den klockas i 2,7 GHz, men den har också ett turboläge där den klarar ända upp till 4 GHz. Den har 28 kärnor, och med hyperthreading kan den köra 56 trådar parallellt.
Vi har en dator med den processorn, och Linux eller något annat modernt och bra operativsystem. Vi kör programmet på den datorn. Utmatningen från programmet kan variera lite beroende på hur trådarna råkar schemaläggas, men vid en provkörning ser det ut så här:
In main: Will be starting 2 thread(s)... In main: Waiting for 2 thread(s) to finish... In thread 1: Started! In thread 2: Started! In thread 1, printout number 1: Running! In thread 2, printout number 1: Running! In thread 1, printout number 2: Running! In thread 2, printout number 2: Running! In thread 1, printout number 3: Running! In thread 1: Finishing... In thread 2, printout number 3: Running! In thread 2: Finishing... In main: All 2 thread(s) have finished. Total printouts: 6 |
Körningen tog 4,0 sekunder.
Nu ändrar vi definitionen av NR_THREADS i programmet till den här:
#define NR_THREADS 1000 |
Vad kommer nu att hända? Hur kommer utmatningen att se ut? Hur lång tid tar körningen? Förklara hur du resonerat och räknat.
a) Hur stor (dvs hur många byte) är en minnessida ("page")?
b) Hur många minnessidor är den virtuella minnesrymden indelad i?
c) Hur många olika ramar ("frames") finns det i det fysiska minnet?
d) Ge ett exempel på vad den virtuella minnesadressen 3 skulle kunna översättas till.
e) Hur stor (i byte räknat) blir varje process sidtabell ("page table")? Redovisa hur du räknat!
f) Förklara, med den beskrivna datorn som exempel, hur paging fungerar. Hur är det möjligt att en process kan ha mer minne än vad som finns? Och hur är det möjligt att flera processer var och en kan ha mer minne än vad som finns?