00001 /* Starts 60 threads that each sleep for 10 seconds, then spin in 00002 a tight loop for 60 seconds, and sleep for another 60 seconds. 00003 Every 2 seconds after the initial sleep, the main thread 00004 prints the load average. 00005 00006 The expected output is this (some margin of error is allowed): 00007 00008 After 0 seconds, load average=1.00. 00009 After 2 seconds, load average=2.95. 00010 After 4 seconds, load average=4.84. 00011 After 6 seconds, load average=6.66. 00012 After 8 seconds, load average=8.42. 00013 After 10 seconds, load average=10.13. 00014 After 12 seconds, load average=11.78. 00015 After 14 seconds, load average=13.37. 00016 After 16 seconds, load average=14.91. 00017 After 18 seconds, load average=16.40. 00018 After 20 seconds, load average=17.84. 00019 After 22 seconds, load average=19.24. 00020 After 24 seconds, load average=20.58. 00021 After 26 seconds, load average=21.89. 00022 After 28 seconds, load average=23.15. 00023 After 30 seconds, load average=24.37. 00024 After 32 seconds, load average=25.54. 00025 After 34 seconds, load average=26.68. 00026 After 36 seconds, load average=27.78. 00027 After 38 seconds, load average=28.85. 00028 After 40 seconds, load average=29.88. 00029 After 42 seconds, load average=30.87. 00030 After 44 seconds, load average=31.84. 00031 After 46 seconds, load average=32.77. 00032 After 48 seconds, load average=33.67. 00033 After 50 seconds, load average=34.54. 00034 After 52 seconds, load average=35.38. 00035 After 54 seconds, load average=36.19. 00036 After 56 seconds, load average=36.98. 00037 After 58 seconds, load average=37.74. 00038 After 60 seconds, load average=37.48. 00039 After 62 seconds, load average=36.24. 00040 After 64 seconds, load average=35.04. 00041 After 66 seconds, load average=33.88. 00042 After 68 seconds, load average=32.76. 00043 After 70 seconds, load average=31.68. 00044 After 72 seconds, load average=30.63. 00045 After 74 seconds, load average=29.62. 00046 After 76 seconds, load average=28.64. 00047 After 78 seconds, load average=27.69. 00048 After 80 seconds, load average=26.78. 00049 After 82 seconds, load average=25.89. 00050 After 84 seconds, load average=25.04. 00051 After 86 seconds, load average=24.21. 00052 After 88 seconds, load average=23.41. 00053 After 90 seconds, load average=22.64. 00054 After 92 seconds, load average=21.89. 00055 After 94 seconds, load average=21.16. 00056 After 96 seconds, load average=20.46. 00057 After 98 seconds, load average=19.79. 00058 After 100 seconds, load average=19.13. 00059 After 102 seconds, load average=18.50. 00060 After 104 seconds, load average=17.89. 00061 After 106 seconds, load average=17.30. 00062 After 108 seconds, load average=16.73. 00063 After 110 seconds, load average=16.17. 00064 After 112 seconds, load average=15.64. 00065 After 114 seconds, load average=15.12. 00066 After 116 seconds, load average=14.62. 00067 After 118 seconds, load average=14.14. 00068 After 120 seconds, load average=13.67. 00069 After 122 seconds, load average=13.22. 00070 After 124 seconds, load average=12.78. 00071 After 126 seconds, load average=12.36. 00072 After 128 seconds, load average=11.95. 00073 After 130 seconds, load average=11.56. 00074 After 132 seconds, load average=11.17. 00075 After 134 seconds, load average=10.80. 00076 After 136 seconds, load average=10.45. 00077 After 138 seconds, load average=10.10. 00078 After 140 seconds, load average=9.77. 00079 After 142 seconds, load average=9.45. 00080 After 144 seconds, load average=9.13. 00081 After 146 seconds, load average=8.83. 00082 After 148 seconds, load average=8.54. 00083 After 150 seconds, load average=8.26. 00084 After 152 seconds, load average=7.98. 00085 After 154 seconds, load average=7.72. 00086 After 156 seconds, load average=7.47. 00087 After 158 seconds, load average=7.22. 00088 After 160 seconds, load average=6.98. 00089 After 162 seconds, load average=6.75. 00090 After 164 seconds, load average=6.53. 00091 After 166 seconds, load average=6.31. 00092 After 168 seconds, load average=6.10. 00093 After 170 seconds, load average=5.90. 00094 After 172 seconds, load average=5.70. 00095 After 174 seconds, load average=5.52. 00096 After 176 seconds, load average=5.33. 00097 After 178 seconds, load average=5.16. 00098 */ 00099 00100 #include <stdio.h> 00101 #include "tests/threads/tests.h" 00102 #include "threads/init.h" 00103 #include "threads/malloc.h" 00104 #include "threads/synch.h" 00105 #include "threads/thread.h" 00106 #include "devices/timer.h" 00107 00108 static int64_t start_time; 00109 00110 static void load_thread (void *aux); 00111 00112 #define THREAD_CNT 60 00113 00114 void 00115 test_mlfqs_load_60 (void) 00116 { 00117 int i; 00118 00119 ASSERT (thread_mlfqs); 00120 00121 start_time = timer_ticks (); 00122 msg ("Starting %d niced load threads...", THREAD_CNT); 00123 for (i = 0; i < THREAD_CNT; i++) 00124 { 00125 char name[16]; 00126 snprintf(name, sizeof name, "load %d", i); 00127 thread_create (name, PRI_DEFAULT, load_thread, NULL); 00128 } 00129 msg ("Starting threads took %d seconds.", 00130 timer_elapsed (start_time) / TIMER_FREQ); 00131 00132 for (i = 0; i < 90; i++) 00133 { 00134 int64_t sleep_until = start_time + TIMER_FREQ * (2 * i + 10); 00135 int load_avg; 00136 timer_sleep (sleep_until - timer_ticks ()); 00137 load_avg = thread_get_load_avg (); 00138 msg ("After %d seconds, load average=%d.%02d.", 00139 i * 2, load_avg / 100, load_avg % 100); 00140 } 00141 } 00142 00143 static void 00144 load_thread (void *aux UNUSED) 00145 { 00146 int64_t sleep_time = 10 * TIMER_FREQ; 00147 int64_t spin_time = sleep_time + 60 * TIMER_FREQ; 00148 int64_t exit_time = spin_time + 60 * TIMER_FREQ; 00149 00150 thread_set_nice (20); 00151 timer_sleep (sleep_time - timer_elapsed (start_time)); 00152 while (timer_elapsed (start_time) < spin_time) 00153 continue; 00154 timer_sleep (exit_time - timer_elapsed (start_time)); 00155 }