linux scheduler © dj foreman 3/8/20091. objectives response time throughput for batch no starvation...
TRANSCRIPT
Linux Scheduler
© DJ Foreman 3/8/2009 1
Objectives• Response time
• Throughput for batch
• No starvation
• Accommodate high AND low priority
© DJ Foreman 3/8/2009 2
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 3
Linux Scheduling Classes• FIFO FIFO real-time process
• RR Round Robin real-time process
• Normal non-real-time process
© DJ Foreman 3/8/2009 4
Real-timeDetails
© DJ Foreman 3/8/2009 5
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 6
Non-real-time Scheduling(Conventional processes)
© DJ Foreman 3/8/2009 7
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 8
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:
© DJ Foreman 3/8/2009 9
Average sleep time Bonus
0<=N<100ms 0
300<=N<400ms 3
600<=N<700 6
900<=N<1000 9
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 10
The Bitmaps• Active queues
• Time-slice-expired queues
• 1 bit/queue (140 queues)
• Based on the Intel “bsfl” instruction– Select least significant 1-bit
© DJ Foreman 3/8/2009 11
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 12
Scheduling• Pick highest priority non-empty queue/list
• Tasks in queue/list scheduled
© DJ Foreman 3/8/2009 13
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 14