CPU Scheduling
Download
Report
Transcript CPU Scheduling
Operating System Examples Scheduling
References
http://www.oreilly.com/catalog/linuxkernel/chapt
er/ch10.html
http://linuxbangalore.org/blug/meetings/200401/scheduler2.6.pdf
http://josh.trancesoftware.com/linux/linux_cpu_s
cheduler.pdf
http://www.linuxinsight.com/files/sched-designCFS.txt
Windows Operating System Internals Curriculum
Development Kit, developed by Solomon,
Russinovich and Polze
Solaris
Solaris uses
priority-based
thread scheduling
Each thread
belongs to one of
six classes
Time sharing
Interactive
Real time
System
File share
Fixed priority
Default class: time
sharing
Within each class
there are
different priorities
Each class uses
different
scheduling
algorithms
Solaris
Time sharing scheduling algorithm
Dynamically alters priorities of processes
Uses a multilevel feedback queue
The higher the priority the smaller the time
slice
The lower the priority the larger the time slice
Interactive processes typically have higher
priority (good response time)
CPU-bound processes have lower priority (good
throughput)
Solaris
Time sharing scheduling algorithm
If a thread has used its entire time quantum
without blocking its priority is changed
The priority of a thread that is returning from
sleeping (e.g. waiting for I/O) has its priority
increased
Interactive scheduling algorithm
Similar to time sharing but give window
managers (e.g., KDE, GNOME) a higher priority
Solaris Dispatch Table
Solaris
Real-time class
Highest priority
A thread in this class will before a process in
any other class
Few processes belong in this class
System class
Kernel threads are assigned to this class e.g.,
scheduler and paging daemons
Solaris
Fixed-priority
Relatively new
Same number of priorities as time sharing but
no dynamic adjustment of priorities
Fair-share
Uses CPU shares instead of priorities
A share is an indicator of entitlement
Solaris
Each scheduling class includes a set of
priorities
However, the scheduler converts the classspecific priorities into global priorities
The thread with the highest global priority
is chosen to run
Solaris Scheduling
Windows XP
The scheduler is called a dispatcher
32-level priority scheme
Priorities are divided into two classes:
Variable class: priorities 1 to 15
Real-time class: priorities 16 to 31
There is a queue for each priority
The dispatcher traverses the set of
queues from highest to lowest until it finds
a thread that is ready to run
If there are no processes ready to run the
dispatcher executes the idle thread
Windows XP Scheduling
Processes are given a priority class upon
creation:
REALTIME_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
IDLE_PRIORITY_CLASS
Priorities in all classes except the
REALTIME_PRIORITY class can change
Windows XP Scheduling
A thread within a given priority class has a
relative priority within the class:
TIME_CRITICAL
HIGHEST
ABOVE_NORMAL
NORMAL
BELOW_NORMAL
LOWEST
IDLE
Windows XP
Each thread has a base priority
representing a value in the priority range
for the class that the thread belongs
The priority of each thread is based on
both the priority class it belongs to and its
relative priority within that class
As with Solaris the classes and the
priorities in the classes are mapped to a
global priority
Windows XP Priorities
Windows XP
Priority changes for threads in the variable
class
Time quantum expires: Priority is lowered but
not below the base priority
Thread switches from blocked to running:
Priority is increased
• The amount depends on what the thread was doing
• Keyboard I/O gets a large increase while disk I/O
gets a moderate increase
Windows XP
Windows XP distinguishes between the
foreground process that is currently
selected on the screen and the background
processes that are not currently selected
The strategy tends to give good response
times to interactive threads that are using
the mouse and windows
The I/O devices are kept busy
Linux Scheduling
The Linux kernel internally represents
processes and threads as tasks via the
task_struct
Linux uses task_struct (process control
block)to represent any execution context
A single-threaded process will be represented
with one task structure
A multithreaded process will have one task
structure for each of the user-level threads
Linux Scheduling
Constant order O(1) scheduling time
Two priority ranges: time-sharing and real-
time
Real-time range from 0 to 99 and nice
value from 100 to 140
Linux (unlike Solaris) assigns higher
priority tasks longer time quanta and lower
priority tasks shorter time quanta
Linux Scheduling
Priorities and Time-slice length
Linux Scheduling
A runnable task is considered 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 all exhausted their time slice
Linux Scheduling
The kernel maintains a list of all runnable
tasks in a runqueue data structure
In a multi-core machine there is a runqueue
for each processor
Each runqueue consists of two priority
arrays:
Active: Contains all tasks with time remaining in
their time slices
Expired: Contains all expired tasks
The active, expired queues are indexed
according to priority
Linux Scheduling
List of Tasks Indexed According to Priorities
Linux Scheduling
The scheduler chooses the task with the
highest priority from the active array for
execution
When there are no more tasks in the
active array, the expired array becomes
the active array and the active array
becomes the expired array.
Linux Scheduling
The scheduler chooses the task with the
highest priority from the active array for
execution
A task’s dynamic priority is recalculated
when the task has exhausted its time
quantum and is to be moved to the expired
array
Linux Scheduling
Linux tries to give a higher
priority to
interactive tasks
The scheduler somehow needs to measure
the interactivity of a process
Interactive processes sleep more than
others
Linux Scheduling
The scheduler keeps track of the average
amount of time a task sleeps vs average
amount of time task uses CPU
Use the sleep_avg variable
When a process wakes the time spent
sleeping is added to its sleep_avg;
The run time is subtracted from sleep_avg
The higher the value of sleep_avg the more
I/O bound it is
Question
Can Linux processes starve?
Case Study Discussion
Basic idea for schedule user processes is the same
for all systems:
Lower priority for CPU bound process
Increase priority for I/O bound process
The scheduling in Solaris / Linux is more
concerned about fairness.
More popular as the OSes for servers.
The scheduling in Window XP is more concerned
about user perceived performance.
More popular as the OS for personal computers.
Summary
We have examined scheduling in several
contemporary operating systems