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