Timer interrupts are essential for
time-sharing the CPU among runnable processes (that is, those in the
TASK_RUNNING
state). As we shall see in Chapter 11, each process is usually allowed a
quantum
of time of limited duration: if the process is not terminated when
its quantum expires, the schedule( )
function
selects the new process to run.
The counter
field of the process descriptor
specifies how many ticks of CPU time are left to the process. The
quantum is always a multiple of a tick — a multiple of about 10
ms. The value of counter
is updated at every tick
by update_process_times( )
, which is invoked by
either the PIT’s timer interrupt handler on
uniprocessor systems or the local timer interrupt handler in
multiprocessor systems. The code is equivalent to the following:
if (current->pid) { --current->counter; if (current->counter <= 0) { current->counter = 0; current->need_resched = 1; } }
The snippet of code starts by making sure the kernel is not handling
a process with PID 0 — the
swapper
process associated with the executing
CPU. It must not be time-shared because it is the process that runs
on the CPU when no other TASK_RUNNING
processes
exist (see Section 3.2.2).
When counter
becomes smaller than 0, the
need_resched
field of the process descriptor is
set to 1. In this case, the schedule( )
function
is invoked before resuming User Mode execution, and other
TASK_RUNNING
processes will have a chance to
resume execution on the CPU.
3.145.50.206