OS_UNIT_2_2020
OS_UNIT_2_2020
OS_UNIT_2_2020
CPU Scheduling
Basic Concepts
Scheduling Criteria
Scheduling Algorithms
Multiple-Processor Scheduling
Real-Time Scheduling
Basic Concepts
Maximum CPU utilization obtained with
multiprogramming
CPU–I/O Burst Cycle – Process
execution consists of a cycle of CPU
execution and I/O wait
CPU burst distribution
Alternating Sequence of CPU And I/O Bursts
CPU Scheduler
Selects from among the processes in memory
that are ready to execute, and allocates the CPU
to one of them
CPU scheduling decisions may take place when
a process:
1. Switches from running to waiting state
2. Switches from running to ready state
3. Switches from waiting to ready
4. Terminates
Scheduling under 1 and 4 is nonpreemptive
All other scheduling is preemptive
Dispatcher
Dispatcher module gives control of the
CPU to the process selected by the
short-term scheduler; this involves:
switching context
switching to user mode
jumping to the proper location in the user
program to restart that program
Dispatch latency – time it takes for the
dispatcher to stop one process and start
another running
Scheduling Criteria
CPU utilization – keep the CPU as busy as
possible
Throughput – # of processes that complete their
execution per time unit
Turnaround time – amount of time to execute a
particular process
Waiting time – amount of time a process has
been waiting in the ready queue
Response time – amount of time it takes from
when a request was submitted until the first
response is produced, not output (for time-
sharing environment)
Optimization Criteria
Max CPU utilization
Max throughput
Min turnaround time
Min waiting time
Min response time
First-Come, First-Served (FCFS) Scheduling
0 24 27 30
P2 P3 P1
0 3 6 30
P1 P3 P2 P4
0 3 7 8 12 16
0 2 4 5 7 11 16
P1 P2 P3 P4 P1 P3 P4 P1 P3 P3
register1 = count
register1 = register1 + 1
count = register1
count-- could be implemented as
register2 = count
register2 = register2 - 1
count = register2
Consider this execution interleaving with “count = 5” initially:
CRITICAL SECTION
flag[i] = FALSE;
REMAINDER SECTION
}
Synchronization Hardware
Many systems provide hardware
support for critical section code
Uniprocessors – could disable
interrupts
Currently running code would
execute without preemption
Generally too inefficient on
multiprocessor systems
Operating systems using this not
broadly scalable
Modern machines provide special
atomic hardware instructions
Atomic = non-interruptable
Either test memory word and set
value
Semaphore
Synchronization tool that does not require busy waiting
Semaphore S – integer variable
Two standard operations modify S: wait() and signal()
Originally called P() and V()
Less complicated
Can only be accessed via two indivisible (atomic) operations
wait (S) {
while S <= 0
; // no-op
S--;
}
signal (S) {
S++;
}
Semaphore as General Synchronization Tool
Counting semaphore – integer value can
range over an unrestricted domain
Binary semaphore – integer value can range
only between 0
and 1; can be simpler to implement
Also known as mutex locks
Can implement a counting semaphore S as a
binary semaphore
Provides mutual exclusion
Semaphore S; // initialized to 1
wait (S);
Critical Section
signal (S);
Semaphore Implementation
Must guarantee that no two
processes can execute wait () and
signal () on the same semaphore at
the same time
Thus, implementation becomes the
critical section problem where the
wait and signal code are placed in the
crtical section.
Could now have busy waiting in
critical section implementation
But implementation code is short
Little busy waiting if critical section rarely
occupied
Note that applications may spend lots
of time in critical sections and
Semaphore Implementation with no Busy waiting
Two operations:
block – place the process invoking the
operation on the appropriate
waiting queue.
wakeup – remove one of processes in
the waiting queue and place it in the
ready queue.
Semaphore Implementation with no Busy waiting (Cont.)
Implementation of wait:
wait (S){
value--;
if (value < 0) {
add this process to waiting queue
block(); }
}
Implementation of signal:
Signal (S){
value++;
if (value <= 0) {
remove a process P from the waiting
queue
wakeup(P); }
}
Deadlock and Starvation
Deadlock – two or more processes are
waiting indefinitely for an event that can be
caused by only one of the waiting processes
Let S and Q be two semaphores initialized to 1
P0 P1
wait (S); wait (Q);
wait (Q); wait (S);
. .
. .
. .
signal (S); signal (Q);
signal (Q); signal (S);
Starvation – indefinite blocking. A process
may never be removed from the semaphore
queue in which it is suspended.
Classical Problems of
Synchronization
Bounded-Buffer Problem
Readers and Writers Problem
Dining-Philosophers Problem
Bounded-Buffer Problem
N buffers, each can hold one item
Semaphore mutex initialized to the
value 1
Semaphore full initialized to the
value 0
Semaphore empty initialized to the
value N.
Bounded Buffer Problem
(Cont.)
The structure of the producer process
while (true) {
// produce an item
wait (empty);
wait (mutex);
signal (mutex);
signal (full);
}
Bounded Buffer Problem
(Cont.)
The structure of the consumer process
while (true) {
wait (full);
wait (mutex);
signal (mutex);
signal (empty);
}
Readers-Writers
Problem
A data set is shared among a number of
concurrent processes
Readers – only read the data set; they do not
perform any updates
Writers – can both read and write.
Shared Data
Data set
Semaphore mutex initialized to 1.
Semaphore wrt initialized to 1.
Readers-Writers Problem
(Cont.)
The structure of a writer process
while (true) {
wait (wrt) ;
// writing is performed
signal (wrt) ;
}
Readers-Writers Problem
(Cont.)
The structure of a reader process
while (true) {
wait (mutex) ;
readcount ++ ;
if (readcount == 1) wait (wrt) ;
signal (mutex)
// reading is performed
wait (mutex) ;
readcount - - ;
if (readcount == 0) signal (wrt) ;
signal (mutex) ;
}
Dining-Philosophers Problem
Shared data
Bowl of rice (data set)
Semaphore chopstick [5] initialized to 1
Dining-Philosophers Problem
(Cont.)
The structure of Philosopher i:
While (true) {
wait ( chopstick[i] );
wait ( chopStick[ (i + 1) % 5] );
// eat
signal ( chopstick[i] );
signal (chopstick[ (i + 1) % 5] );
// think
}
Problems with Semaphores
Incorrect use of semaphore
operations:
monitor monitor-name
{
// shared variable declarations
procedure P1 (…) { …. }
…