There might also be more questions than you have time to answer, but do as many as you can.
Sections of the the manual pages:
b) Vilket eller vilka problem är det man vill lösa med det systemanropet?
a) De vanligaste flaggorna är O_RDONLY, O_WRONLY, O_RDWR, O_CREAT och O_TRUNC. Vad innebär de?
b) När behövs det tredje argumentet, med filskyddskoden?
#include <unistd.h> #include <fcntl.h> #define KILO 1024 #define MEGA (KILO*KILO) // 1048576 #define GIGA (KILO*KILO*KILO) // 1073741824 char data[GIGA]; int main(void) { int fd = open("data.bin", O_RDONLY); for (int i = 0; i < KILO; ++i) { read(fd, &data[i * MEGA], MEGA); } close(fd); } |
I en annan version av samma program, kallat "program 2", byter vi ut for-loopen mot den här:
for (int i = 0; i < MEGA; ++i) { read(fd, &data[i * KILO], KILO); } |
(Skillnaden är alltså att vi bytt plats på "MEGA" och "KILO".)
Programmen gör samma sak, och de fungerar korrekt, men man kan förvänta sig att ett av programmen går betydligt snabbare än det andra.
a) Vilket program är snabbast?
b) Vad beror skillnaden på?
c) Nu gör vi ännu en version av programmet, kallat "program 3", där for-loopen ser ut så här:
for (int i = 0; i < GIGA; ++i) { read(fd, &data[i], 1); } |
Om program 2 tog en sekund att köra, hur lång tid kan man gissa att program 3 tar?
#include <stdio.h> #include <unistd.h> int x = 1; int main(void) { int y = 1; fork(); x = x + 1; y = y + 1; printf("Hej! x = %d, y = %d!\n", x, y); fork(); x = x + 1; y = y + 1; printf("Hopp! x = %d, y = %d!\n", x, y); } |
Är det inte väldigt ineffektivt att först skapar fork en kopia av hela processen, med minnesinnehåll och det körande programmets körbara kod och allt, och direkt därefter kastar execve bort allt innehållet i processen och ersätter det med ett nystartat program?