00001 /* Starts 60 threads numbered 0 through 59. Thread #i sleeps for 00002 (10+i) seconds, then spins in a loop for 60 seconds, then 00003 sleeps until a total of 120 seconds have passed. Every 2 00004 seconds, starting 10 seconds in, the main thread prints the 00005 load average. 00006 00007 The expected output is listed below. Some margin of error is 00008 allowed. 00009 00010 If your implementation fails this test but passes most other 00011 tests, then consider whether you are doing too much work in 00012 the timer interrupt. If the timer interrupt handler takes too 00013 long, then the test's main thread will not have enough time to 00014 do its own work (printing a message) and go back to sleep 00015 before the next tick arrives. Then the main thread will be 00016 ready, instead of sleeping, when the tick arrives, 00017 artificially driving up the load average. 00018 00019 After 0 seconds, load average=0.00. 00020 After 2 seconds, load average=0.05. 00021 After 4 seconds, load average=0.16. 00022 After 6 seconds, load average=0.34. 00023 After 8 seconds, load average=0.58. 00024 After 10 seconds, load average=0.87. 00025 After 12 seconds, load average=1.22. 00026 After 14 seconds, load average=1.63. 00027 After 16 seconds, load average=2.09. 00028 After 18 seconds, load average=2.60. 00029 After 20 seconds, load average=3.16. 00030 After 22 seconds, load average=3.76. 00031 After 24 seconds, load average=4.42. 00032 After 26 seconds, load average=5.11. 00033 After 28 seconds, load average=5.85. 00034 After 30 seconds, load average=6.63. 00035 After 32 seconds, load average=7.46. 00036 After 34 seconds, load average=8.32. 00037 After 36 seconds, load average=9.22. 00038 After 38 seconds, load average=10.15. 00039 After 40 seconds, load average=11.12. 00040 After 42 seconds, load average=12.13. 00041 After 44 seconds, load average=13.16. 00042 After 46 seconds, load average=14.23. 00043 After 48 seconds, load average=15.33. 00044 After 50 seconds, load average=16.46. 00045 After 52 seconds, load average=17.62. 00046 After 54 seconds, load average=18.81. 00047 After 56 seconds, load average=20.02. 00048 After 58 seconds, load average=21.26. 00049 After 60 seconds, load average=22.52. 00050 After 62 seconds, load average=23.71. 00051 After 64 seconds, load average=24.80. 00052 After 66 seconds, load average=25.78. 00053 After 68 seconds, load average=26.66. 00054 After 70 seconds, load average=27.45. 00055 After 72 seconds, load average=28.14. 00056 After 74 seconds, load average=28.75. 00057 After 76 seconds, load average=29.27. 00058 After 78 seconds, load average=29.71. 00059 After 80 seconds, load average=30.06. 00060 After 82 seconds, load average=30.34. 00061 After 84 seconds, load average=30.55. 00062 After 86 seconds, load average=30.68. 00063 After 88 seconds, load average=30.74. 00064 After 90 seconds, load average=30.73. 00065 After 92 seconds, load average=30.66. 00066 After 94 seconds, load average=30.52. 00067 After 96 seconds, load average=30.32. 00068 After 98 seconds, load average=30.06. 00069 After 100 seconds, load average=29.74. 00070 After 102 seconds, load average=29.37. 00071 After 104 seconds, load average=28.95. 00072 After 106 seconds, load average=28.47. 00073 After 108 seconds, load average=27.94. 00074 After 110 seconds, load average=27.36. 00075 After 112 seconds, load average=26.74. 00076 After 114 seconds, load average=26.07. 00077 After 116 seconds, load average=25.36. 00078 After 118 seconds, load average=24.60. 00079 After 120 seconds, load average=23.81. 00080 After 122 seconds, load average=23.02. 00081 After 124 seconds, load average=22.26. 00082 After 126 seconds, load average=21.52. 00083 After 128 seconds, load average=20.81. 00084 After 130 seconds, load average=20.12. 00085 After 132 seconds, load average=19.46. 00086 After 134 seconds, load average=18.81. 00087 After 136 seconds, load average=18.19. 00088 After 138 seconds, load average=17.59. 00089 After 140 seconds, load average=17.01. 00090 After 142 seconds, load average=16.45. 00091 After 144 seconds, load average=15.90. 00092 After 146 seconds, load average=15.38. 00093 After 148 seconds, load average=14.87. 00094 After 150 seconds, load average=14.38. 00095 After 152 seconds, load average=13.90. 00096 After 154 seconds, load average=13.44. 00097 After 156 seconds, load average=13.00. 00098 After 158 seconds, load average=12.57. 00099 After 160 seconds, load average=12.15. 00100 After 162 seconds, load average=11.75. 00101 After 164 seconds, load average=11.36. 00102 After 166 seconds, load average=10.99. 00103 After 168 seconds, load average=10.62. 00104 After 170 seconds, load average=10.27. 00105 After 172 seconds, load average=9.93. 00106 After 174 seconds, load average=9.61. 00107 After 176 seconds, load average=9.29. 00108 After 178 seconds, load average=8.98. 00109 */ 00110 00111 #include <stdio.h> 00112 #include "tests/threads/tests.h" 00113 #include "threads/init.h" 00114 #include "threads/malloc.h" 00115 #include "threads/synch.h" 00116 #include "threads/thread.h" 00117 #include "devices/timer.h" 00118 00119 static int64_t start_time; 00120 00121 static void load_thread (void *seq_no); 00122 00123 #define THREAD_CNT 60 00124 00125 void 00126 test_mlfqs_load_avg (void) 00127 { 00128 int i; 00129 00130 ASSERT (thread_mlfqs); 00131 00132 start_time = timer_ticks (); 00133 msg ("Starting %d load threads...", THREAD_CNT); 00134 for (i = 0; i < THREAD_CNT; i++) 00135 { 00136 char name[16]; 00137 snprintf(name, sizeof name, "load %d", i); 00138 thread_create (name, PRI_DEFAULT, load_thread, (void *) i); 00139 } 00140 msg ("Starting threads took %d seconds.", 00141 timer_elapsed (start_time) / TIMER_FREQ); 00142 thread_set_nice (-20); 00143 00144 for (i = 0; i < 90; i++) 00145 { 00146 int64_t sleep_until = start_time + TIMER_FREQ * (2 * i + 10); 00147 int load_avg; 00148 timer_sleep (sleep_until - timer_ticks ()); 00149 load_avg = thread_get_load_avg (); 00150 msg ("After %d seconds, load average=%d.%02d.", 00151 i * 2, load_avg / 100, load_avg % 100); 00152 } 00153 } 00154 00155 static void 00156 load_thread (void *seq_no_) 00157 { 00158 int seq_no = (int) seq_no_; 00159 int sleep_time = TIMER_FREQ * (10 + seq_no); 00160 int spin_time = sleep_time + TIMER_FREQ * THREAD_CNT; 00161 int exit_time = TIMER_FREQ * (THREAD_CNT * 2); 00162 00163 timer_sleep (sleep_time - timer_elapsed (start_time)); 00164 while (timer_elapsed (start_time) < spin_time) 00165 continue; 00166 timer_sleep (exit_time - timer_elapsed (start_time)); 00167 }