8ea4dd14a9243638f16dec6ffefde2b753a1f6a1
[pintos-anon] / src / tests / threads / mlfqs-load-avg.c
1 /* Starts 60 threads numbered 0 through 59.  Thread #i sleeps for
2    (10+i) seconds, then spins in a loop for 60 seconds, then
3    sleeps until a total of 120 seconds have passed.  Every 2
4    seconds, starting 10 seconds in, the main thread prints the
5    load average.
6
7    The expected output is this (some margin of error is allowed):
8
9    After 0 seconds, load average=0.00.
10    After 2 seconds, load average=0.05.
11    After 4 seconds, load average=0.16.
12    After 6 seconds, load average=0.34.
13    After 8 seconds, load average=0.58.
14    After 10 seconds, load average=0.87.
15    After 12 seconds, load average=1.22.
16    After 14 seconds, load average=1.63.
17    After 16 seconds, load average=2.09.
18    After 18 seconds, load average=2.60.
19    After 20 seconds, load average=3.16.
20    After 22 seconds, load average=3.76.
21    After 24 seconds, load average=4.42.
22    After 26 seconds, load average=5.11.
23    After 28 seconds, load average=5.85.
24    After 30 seconds, load average=6.63.
25    After 32 seconds, load average=7.46.
26    After 34 seconds, load average=8.32.
27    After 36 seconds, load average=9.22.
28    After 38 seconds, load average=10.15.
29    After 40 seconds, load average=11.12.
30    After 42 seconds, load average=12.13.
31    After 44 seconds, load average=13.16.
32    After 46 seconds, load average=14.23.
33    After 48 seconds, load average=15.33.
34    After 50 seconds, load average=16.46.
35    After 52 seconds, load average=17.62.
36    After 54 seconds, load average=18.81.
37    After 56 seconds, load average=20.02.
38    After 58 seconds, load average=21.26.
39    After 60 seconds, load average=22.52.
40    After 62 seconds, load average=23.71.
41    After 64 seconds, load average=24.80.
42    After 66 seconds, load average=25.78.
43    After 68 seconds, load average=26.66.
44    After 70 seconds, load average=27.45.
45    After 72 seconds, load average=28.14.
46    After 74 seconds, load average=28.75.
47    After 76 seconds, load average=29.27.
48    After 78 seconds, load average=29.71.
49    After 80 seconds, load average=30.06.
50    After 82 seconds, load average=30.34.
51    After 84 seconds, load average=30.55.
52    After 86 seconds, load average=30.68.
53    After 88 seconds, load average=30.74.
54    After 90 seconds, load average=30.73.
55    After 92 seconds, load average=30.66.
56    After 94 seconds, load average=30.52.
57    After 96 seconds, load average=30.32.
58    After 98 seconds, load average=30.06.
59    After 100 seconds, load average=29.74.
60    After 102 seconds, load average=29.37.
61    After 104 seconds, load average=28.95.
62    After 106 seconds, load average=28.47.
63    After 108 seconds, load average=27.94.
64    After 110 seconds, load average=27.36.
65    After 112 seconds, load average=26.74.
66    After 114 seconds, load average=26.07.
67    After 116 seconds, load average=25.36.
68    After 118 seconds, load average=24.60.
69    After 120 seconds, load average=23.81.
70    After 122 seconds, load average=23.02.
71    After 124 seconds, load average=22.26.
72    After 126 seconds, load average=21.52.
73    After 128 seconds, load average=20.81.
74    After 130 seconds, load average=20.12.
75    After 132 seconds, load average=19.46.
76    After 134 seconds, load average=18.81.
77    After 136 seconds, load average=18.19.
78    After 138 seconds, load average=17.59.
79    After 140 seconds, load average=17.01.
80    After 142 seconds, load average=16.45.
81    After 144 seconds, load average=15.90.
82    After 146 seconds, load average=15.38.
83    After 148 seconds, load average=14.87.
84    After 150 seconds, load average=14.38.
85    After 152 seconds, load average=13.90.
86    After 154 seconds, load average=13.44.
87    After 156 seconds, load average=13.00.
88    After 158 seconds, load average=12.57.
89    After 160 seconds, load average=12.15.
90    After 162 seconds, load average=11.75.
91    After 164 seconds, load average=11.36.
92    After 166 seconds, load average=10.99.
93    After 168 seconds, load average=10.62.
94    After 170 seconds, load average=10.27.
95    After 172 seconds, load average=9.93.
96    After 174 seconds, load average=9.61.
97    After 176 seconds, load average=9.29.
98    After 178 seconds, load average=8.98.
99 */
100
101 #include <stdio.h>
102 #include "tests/threads/tests.h"
103 #include "threads/init.h"
104 #include "threads/malloc.h"
105 #include "threads/synch.h"
106 #include "threads/thread.h"
107 #include "devices/timer.h"
108
109 static int64_t start_time;
110
111 static void load_thread (void *seq_no);
112
113 #define THREAD_CNT 60
114
115 void
116 test_mlfqs_load_avg (void) 
117 {
118   int i;
119   
120   ASSERT (thread_mlfqs);
121
122   start_time = timer_ticks ();
123   msg ("Starting %d load threads...", THREAD_CNT);
124   for (i = 0; i < THREAD_CNT; i++) 
125     {
126       char name[16];
127       snprintf(name, sizeof name, "load %d", i);
128       thread_create (name, PRI_DEFAULT, load_thread, (void *) i);
129     }
130   msg ("Starting threads took %d seconds.",
131        timer_elapsed (start_time) / TIMER_FREQ);
132   thread_set_nice (-20);
133
134   for (i = 0; i < 90; i++) 
135     {
136       int64_t sleep_until = start_time + TIMER_FREQ * (2 * i + 10);
137       int load_avg;
138       timer_sleep (sleep_until - timer_ticks ());
139       load_avg = thread_get_load_avg ();
140       msg ("After %d seconds, load average=%d.%02d.",
141            i * 2, load_avg / 100, load_avg % 100);
142     }
143 }
144
145 static void
146 load_thread (void *seq_no_) 
147 {
148   int seq_no = (int) seq_no_;
149   int sleep_time = TIMER_FREQ * (10 + seq_no);
150   int spin_time = sleep_time + TIMER_FREQ * THREAD_CNT;
151   int exit_time = TIMER_FREQ * (THREAD_CNT * 2);
152
153   timer_sleep (sleep_time - timer_elapsed (start_time));
154   while (timer_elapsed (start_time) < spin_time)
155     continue;
156   timer_sleep (exit_time - timer_elapsed (start_time));
157 }