Linux Scheduler - dforeman.cs.bingh

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
How to determine?
– Video, robotics, sensor-based
© 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-time
Details
© 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:
Average sleep time
Bonus
0<=N<100ms
0
300<=N<400ms
3
600<=N<700
6
900<=N<1000
9
© DJ Foreman 3/8/2009
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 “bsf/bsr” 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