Linux Scheduler © DJ Foreman 3/8/2009
Objectives Response time Throughput for batch No starvation Accommodate high AND low priority © DJ Foreman 3/8/2009
General Process Classifications Two schemes for classifying: Traditional classes IO bound CPU bound Alternative classes Interactive Batch Real-time Video, robotics, sensor-based How to determine? © DJ Foreman 3/8/2009
Linux Scheduling Classes FIFO FIFO real-time process RR Round Robin real-time process Normal non-real-time process © DJ Foreman 3/8/2009
Real-time Details © DJ Foreman 3/8/2009
Real-time Rules Priority 0(highest) - 99(lowest) Program adjustable: sched_setparam() sched_setscheduler() FIFO - non-interruptible except Higher priority Blocked Yields RR Adds a time-slice to each thread Suspends at end of slice © DJ Foreman 3/8/2009
Non-real-time Scheduling (Conventional processes) © DJ Foreman 3/8/2009
Rules Every process has a “static” priority 100(highest) – 139 (lowest) Variable via nice() and setpriority() Base quantum (not a constant!) If sp<120 20*(140-static priority) If sp>=120 5*(140-static priority) Dynamic priority (also 100-139) Max(100, min(sp-bonus+5,139)) 0<=bonus<=10 © DJ Foreman 3/8/2009
Rules (continued) Bonus 0-5 is a penalty 6-10 is a prize Related to average sleep time OF THIS PROCESS (not of all Processes) Based on past history Some sample values: Average sleep time Bonus 0<=N<100ms 300<=N<400ms 3 600<=N<700 6 900<=N<1000 9 © DJ Foreman 3/8/2009
Priority Arrays Two arrays: struct prio_array { int nr_active; unsigned long bitmap[BITMAP_SIZE]; struct list_head queue[MAX_PRIO]; } With: 140 priority levels (max) wordsize=32 bits BITMAP_SIZE is 5 (last 20 bits ignored) © DJ Foreman 3/8/2009
The Bitmaps Active queues Time-slice-expired queues 1 bit/queue (140 queues) Based on the Intel “bsf/bsr” instruction Select least significant 1-bit © DJ Foreman 3/8/2009
Priority arrays – revisited Two arrays (active/expired): *listheads prio_array[2][140]; typedef struct listheads { // 2-way list of PDs @ this priority PD *next; PD *prev;} struct PD { PD *next; PD*prev; int PID; int prio; // etc } © DJ Foreman 3/8/2009
Scheduling Pick highest priority non-empty queue/list Tasks in queue/list scheduled © DJ Foreman 3/8/2009
References Lindsey, R., "What's New in the 2.6 Scheduler", Linux Journal, March 2004 Love, R., Linux Kernel Development, Indianapolis, IN, Sams Publishing, 2004 Understanding the Linux Kernel, Bovet & Cesati, O’Reilly Press, 2006 © DJ Foreman 3/8/2009