queue. If the highest-priority queue contains multiple threads, then
they run in ``round robin'' order.
+Multiple facets of the scheduler require data to be updated after a
+certain number of timer ticks. In every case, these updates should
+occur before any ordinary kernel thread has a chance to run, so that
+there is no chance that a kernel thread could see a newly increased
+@func{timer_ticks} value but old scheduler data values.
+
@menu
* Thread Niceness::
* Calculating Priority::
@section Niceness
Thread priority is dynamically determined by the scheduler using a
-formula given below. However, each thread also has a relatively static
-@dfn{nice} value between -20 and 20 that determines how ``nice'' the
-thread should be to other threads. A @var{nice} of zero does not affect
-thread priority. A positive @var{nice} increases the numeric priority
-of a thread, decreasing its effective priority, and causes it to give up
-some CPU time it would otherwise receive. On the other hand, a negative
-@var{nice} tends to take away CPU time from other threads.
+formula given below. However, each thread also has an integer
+@dfn{nice} value that determines how ``nice'' the thread should be to
+other threads. A @var{nice} of zero does not affect thread priority. A
+positive @var{nice}, to the maximum of 20, increases the numeric
+priority of a thread, decreasing its effective priority, and causes it
+to give up some CPU time it would otherwise receive. On the other hand,
+a negative @var{nice}, to the minimum of -20, tends to take away CPU
+time from other threads.
The initial thread starts with a @var{nice} value of zero. Other
threads start with a @var{nice} value inherited from their parent
@tab @code{n * f}
@item Convert @code{x} to integer (rounding down):
-@tab @code{x * f}
+@tab @code{x / f}
@item Convert @code{x} to integer (rounding to nearest):
@tab @code{(x + f / 2) / f}