-
Notifications
You must be signed in to change notification settings - Fork 0
/
fairness.c
78 lines (61 loc) · 2.01 KB
/
fairness.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "types.h"
#include "user.h"
////////////////{{ FAKE functions.
//extern int set_priority(int);
int set_priority(int prio){
setpriority(prio);
return 0;
}
////////////////////////////////// }}
static int iterations = 10*1000*1000;
static double x=0;
/*
fork several several processes, with different priorities, and let them run.
The pattern (in prio_keys[] ):
2 @ prio 1
then 2 @ prio 0
then 1 at prio 3
and for desert, prio 1 again
The expected pattern is
* high prio processes finish before lower gets cpu.
* round robin at prio 1,2,3
* fifo at prio 0 (i.e. process is run till completion)
*/
static int prio_keys[] = {1,1,0,0,2,3,1};
void check_proc_order(){
printf(1, "parent run at pid %d\n", getpid());
// I run at default prio 2
int num_children = sizeof(prio_keys)/sizeof(int);
for(int k = 0; k < num_children;k++) {
int pid = fork();
if (pid < 0) {
printf(1, "fork failed");
return;
}
if (pid == 0) {
// in child
//int new_pid = getpid();
int prio = prio_keys[k]; // index k inherited from parent
printf(1,"Child(%d) is setting prio: %d\n", getpid(), prio);
set_priority(prio);
// do something that takes cpu time
for(k=0;k< iterations;k++){
x += k; // x is global so the compiler cannot remove this loop
}
printf(1,"\nChild(%d) DONE\n", getpid());
exit();
} else{
// in parent
// simply keep looping and forking more processes
}
}
// all processes are on their way.
// Wait here until all of them finished.
for(int i = 0; i < num_children; i++) {
int waited, ran, slept, elapsed;
int pid = wait2(&waited, &ran, &slept, &elapsed);
printf(1,"process %d terminated. wait: %d,\t runtime: %d,\t sleep: %d, \t dtime: %d\n",
pid, waited, ran, slept, elapsed);
}
printf(1,"\nPARENT finished\n");
}