Add hints about not doing too much work in timer interrupt.
authorBen Pfaff <blp@cs.stanford.edu>
Thu, 5 Oct 2006 03:05:40 +0000 (03:05 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Thu, 5 Oct 2006 03:05:40 +0000 (03:05 +0000)
doc/threads.texi
src/tests/threads/mlfqs-load-avg.c

index ac28ba86830da78c8431fd400edd164c5d959b94..1231168e34224ab3aca2ee50479087ceb0abdf46 100644 (file)
@@ -791,4 +791,32 @@ scheduler at the same time.
 
 Yes.  In general, your implementation may differ from the description,
 as long as its behavior is the same.
+
+@item Some scheduler tests fail and I don't understand why.  Help!
+
+If your implementation mysteriously fails some of the advanced
+scheduler tests, try the following:
+
+@itemize
+@item
+Read the source files for the tests that you're failing, to make sure
+that you understand what's going on.  Each one has a comment at the
+top that explains its purpose and expected results.
+
+@item
+Double-check your fixed-point arithmetic routines and your use of them
+in the scheduler routines.
+
+@item
+Consider how much work your implementation does in the timer
+interrupt.  If the timer interrupt handler takes too long, then it
+will take away most of a timer tick from the thread that the timer
+interrupt preempted.  When it returns control to that thread, it
+therefore won't get to do much work before the next timer interrupt
+arrives.  That thread will therefore get blamed for a lot more CPU
+time than it actually got a chance to use.  This raises the
+interrupted thread's recent CPU count, thereby lowering its priority.
+It can cause scheduling decisions to change.  It also raises the load
+average.
+@end itemize
 @end table
index 8ea4dd14a9243638f16dec6ffefde2b753a1f6a1..50e83e276406714b03ab8d199a16259ee574ffbf 100644 (file)
@@ -4,7 +4,17 @@
    seconds, starting 10 seconds in, the main thread prints the
    load average.
 
-   The expected output is this (some margin of error is allowed):
+   The expected output is listed below.  Some margin of error is
+   allowed.
+
+   If your implementation fails this test but passes most other
+   tests, then consider whether you are doing too much work in
+   the timer interrupt.  If the timer interrupt handler takes too
+   long, then the test's main thread will not have enough time to
+   do its own work (printing a message) and go back to sleep
+   before the next tick arrives.  Then the main thread will be
+   ready, instead of sleeping, when the tick arrives,
+   artificially driving up the load average.
 
    After 0 seconds, load average=0.00.
    After 2 seconds, load average=0.05.