- The Linux scheduler is a pre-emptive, priority-based algorithm with two separate priority ranges: 
- a real-time range from 0 to 99 
- and a nice value ranging from 100 to 140.
 
- These two ranges map into a global priority scheme whereby numerically lower values indicate higher priorities.
- Linux assigns higher-priority tasks longer time quanta and lower-priority tasks shorter time quanta. The relationship between priorities and time-slice length is shown in Fig. 12.
Figure 12:
The relationship between priorities and time-slice length.
|  |  
 
 
- A runnable task is considered eligible for execution on the CPU as long as it has time remaining in its time slice. When a task has exhausted its time slice, it is considered expired and is not eligible for execution again until all other tasks have also exhausted their time quanta. 
- The kernel maintains a list of all runnable tasks in a runqueue data structure. Because of its support for SMP, each processor maintains its own runqueue and schedules itself independently. 
- Each runqueue contains two priority arrays -active and expired.
- The active array contains all tasks with time remaining in their time slices, 
- and the expired array contains all expired tasks. 
 
Figure 13:
List of tasks indexed according to priority.
|  |  
 
 
- Each of these priority arrays contains a list of tasks indexed according to priority (see Fig. 13).
- The scheduler chooses the task with the highest priority from the active array for execution on the CPU. On multiprocessor machines, this means that each processor is scheduling the highest-priority task from its own runqueue structure. 
- When all tasks have exhausted their time slices (that is, the active array is empty), the two priority arrays are exchanged; the expired array becomes the active array, and vice versa.
 
Cem Ozdogan
2010-03-23