Operating System Concepts
Module3
PROCESS COORDINATION
(Synchronization, Deadlocks)
Faculty: Dr.GNANESWARI.G
Process Synchronization
Critical Section Problem
Consider system of n processes {p0, p1, … pn-1}
Each process has critical section segment of code
Process may be changing common variables, updating table, writing
file, etc
When one process in critical section, no other may be in its critical
section
Critical section problem is to design protocol to solve this
Each process must ask permission to enter critical section in entry
section, may follow critical section with exit section, then remainder
section
Critical section problem
Satisfies these criteria:
1. Mutual exclusion
If process Pi is executing in its critical section, then no other processes can be
executing in their critical sections
2. Progress – selection for critical section
If no process is executing in its critical section and there exist some processes that
wish to enter their critical section, then the selection of the processes that will enter
the critical section next cannot be postponed indefinitely.
3. Bounded-waiting
A bound must exist on the number of times that other processes are allowed to enter
their critical sections after a process has made a request to enter its critical section
and before that request is granted.
Critical Section
General structure of process pi is
Peterson’s Solution
Two process solution
The two processes share two variables:
int turn;
Boolean flag[2]
P0 sets flag(0) = true; p1 sets flag(1) = true;
The variable turn indicates whose turn it is to enter the critical section
The flag array is used to indicate if a process is ready to enter the critical
section.
flag[i] = true
implies that process Pi is ready!
Algorithm for Process Pi
do {
flag[i] = TRUE;
turn = j;
while (flag[j] && turn == j);
critical section
flag[i] = FALSE;
remainder section
} while (TRUE);
1. Provable that Mutual exclusion is preserved
2. Progress requirement is satisfied
3. Bounded-waiting requirement is met
Bounded-waiting Mutual Exclusion
do { with TestandSet()
waiting[i] = TRUE;
key = TRUE;
while (waiting[i] && key)
key = TestAndSet(&lock);
waiting[i] = FALSE;
// critical section
j = (i + 1) % n;
while ((j != i) && !waiting[j])
j = (j + 1) % n;
if (j == i)
lock = FALSE;
else
waiting[j] = FALSE;
// remainder section
} while (TRUE);
Video class
Semaphore
• Synchronization tool
• Semaphore S – integer variable
• Two standard operations modify S:
• wait() and signal()
• Originally called P() and V()
• Can only be accessed via two indivisible (atomic) operations. (cannot be interrupted)
• Initialize Semaphore s=1
wait (s) {
while s <= 0 // no-op
s = s -1
}
signal (s) {
s = s+1
}
Semaphore as General Synchronization Tool
• Binary semaphore – integer value can range only between 0
and 1; can be simpler to implement
• Also known as mutex locks
• Counting semaphore – integer value can range over an unrestricted domain
• It provides mutual exclusion.
• Eg.
Semaphore mutex; // initialized to 1
do {
wait (mutex);
// Critical Section
signal (mutex);
// remainder section
} while (TRUE);
Classical Problems of Synchronization
Classical problems used to test newly-proposed
synchronization schemes
Producer/Consumer Problem or Bounded-Buffer Problem
Readers and Writers Problem
Dining-Philosophers Problem
Producer Consumer Problem
N buffers, each can hold one item.
Semaphore mutex initialized to the value 1(mutex=1)
Semaphore full initialized to the value 0 (Full=0)
Semaphore empty initialized to the value N.(Empty=n)
buffer
prod cons
full = 4
empty = 6
Producer Consumer Problem
Producer process Consumer process
Full,empty,mutex: semophore;
nextp, nextc: item;
do {
wait (full);
Full = 0; empty = n; mutex = 1;
wait (mutex);
do { // remove an item from
// produce an item in nextp // buffer to nextc
wait (empty); signal (mutex);
wait (mutex); signal (empty);
// add the item to the buffer // consume the item in nextc
signal (mutex); } while (TRUE);
signal (full);
} while (TRUE);
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
Problem – allow multiple readers to read at the same time
Only one single writer can access the shared data at the same time
Several variations of how readers and writers are treated – all involve priorities
Shared Data
Data set
Semaphore mutex initialized to 1
Semaphore wrt initialized to 1
Integer readcount initialized to 0
Readers-Writers Problem
Reader process writer process
Semophore mutex =1;wrt =1 do {
int readcount=0 wait (wrt) ;
do { // writing is performed
wait (mutex) ; signal (wrt) ;
readcount ++ ; } while (TRUE);
if (readcount == 1) wait (wrt) ;
signal (mutex)
// reading is performed
wait (mutex) ;
readcount - - ;
if (readcount == 0) signal (wrt) ;
signal (mutex) ;
} while (TRUE);
Dining-Philosophers Problem
Philosophers spend their lives thinking and eating c0
P5 P1
Don’t interact with their neighbors, occasionally try to pick up 2
chopsticks (one at a time) to eat from bowl
Need both to eat, then release both when done
In the case of 5 philosophers
Shared data P4 P2
Bowl of rice (data set)
Semaphore chopstick [5] initialized to 1(free)
P3
Dining-Philosophers Problem
The structure of Philosopher i:
do {
wait ( chopstick[i] ); //left
wait ( chopStick[ (i + 1) % 5] ); // right
// eat
signal ( chopstick[i] );
signal (chopstick[ (i + 1) % 5] );
// think
} while (TRUE);
Monitors
A high-level abstraction that provides a convenient and effective mechanism for
process synchronization
Abstract data type, internal variables only accessible by code within the
procedure
Only one process may be active within the monitor at a time
But not powerful enough to model some synchronization schemes
monitor monitor-name
{
// shared variable declarations
procedure P1 (…) { …. }
procedure Pn (…) {……}
Initialization code (…) { … }
}
Video class
Schematic view of a Monitor
Deadlocks
System Model
Deadlock Characterization
Methods for Handling Deadlocks
Deadlock Prevention
Deadlock Avoidance
Deadlock Detection
Recovery from Deadlock
The Deadlock Problem
A set of processes is said to be in a deadlock when every process is
holding a resource and waiting to acquire a resource that is held by
another process.
Example
System has 2 disk drives (R1 and R2)
P1 and P2 each hold one disk drive and each needs another one
Traffic Signal Example
Deadlock can arise if four conditions hold simultaneously
Deadlock Characterization
Deadlock can arise if four conditions hold simultaneously.
Mutual exclusion: only one process at a time can use a resource
Hold and wait: a process holding at least one resource is waiting to acquire
additional resources held by other processes
No preemption: a resource can be released only voluntarily by the process
holding it, after that process has completed its task
Circular wait: there exists a set {P0, P1, …, Pn} of waiting processes such
that P0 is waiting for a resource that is held by P1, P1 is waiting for a
resource that is held by
P2, …, Pn–1 is waiting for a resource that is held by Pn, and Pn is waiting for a
resource that is held by P0.
System Model
Resource types R1, R2, . . ., Rm
CPU cycles, memory space, I/O devices
Each resource type Ri has Wi instances.
Each process utilizes a resource as follows:
request
use
release
Resource-Allocation Graph
A set of vertices V and a set of edges E
Vertices V is partitioned into two types:
P = {P1, P2, …, Pn}, the set consisting of all the
processes in the system
R = {R1, R2, …, Rm}, the set consisting of all
resource types in the system
Edges E:
Request edge – directed edge Pi Rj
Assignment edge – directed edge Rj Pi
Resource-Allocation Graph (Cont.)
Process
Resource Type with 4 instances
Pi requests instance of Rj Pi
Rj
Pi is holding an instance of Rj Pi
Rj
Example of a Resource Allocation Graph
Resource Allocation Graph With A Deadlock
Graph With A Cycle But No Deadlock
Methods for Handling Deadlocks
Deadlock Prevention: Ensure that the system will never
enter a deadlock state
Deadlock Avoidance
Deadlock detection and Recovery: Allow the system to
enter a deadlock state and then recover
Head in the sand approach: Ignore the problem and
pretend that deadlocks never occur in the system; used
by most operating systems, including UNIX
Deadlock Prevention
Restrain the ways request can be made
Mutual Exclusion – not required for sharable
resources; must hold for non sharable resources
Hold and Wait – must guarantee that whenever a
process requests a resource, it does not hold any
other resources
Require process to request and be allocated all its
resources before it begins execution, or allow process to
request resources only when the process has none.
Low resource utilization; starvation possible.
Deadlock Prevention (Cont.)
No Preemption –
If a process that is holding some resources, requests another resource
that cannot be immediately allocated to it, then all resources
currently being held are released.
Preempted resources are added to the list of resources for which the
process is waiting.
Process will be restarted only when it can regain its old resources, as
well as the new ones that it is requesting.
Circular Wait – impose a total ordering of all resource
types, and require that each process requests
resources in an increasing order of enumeration
F: Ri Pj Rj
Deadlock Avoidance
Requires that the system has some additional a priori information
available
Simplest and most useful model requires that each process
declare the maximum number of resources needed of each
type.
The deadlock-avoidance algorithm dynamically examines the
resource-allocation state to ensure that there can never be a
circular-wait condition
A state is safe if the system can allocate resources to each
process and avoid a deadlock. A deadlock state is an unsafe
state.
1. Resource-Allocation Graph Scheme
Claim edge Pi Rj indicated that process Pj may request resource Rj;
represented by a dashed line
Claim edge converts to request edge when a process requests a
resource
Request edge converted to an assignment edge when the resource is
allocated to the process
When a resource is released by a process, assignment edge reconverts
to a claim edge.
Resource-Allocation Graph
Safe State Unsafe State
The request can be granted only if converting the request
edge to an assignment edge does not result in the
formation of a cycle in the resource allocation graph.
2. Banker’s Algorithm
Multiple instances
Each process must a priori claim maximum use
When a process requests a resource it may have to wait
When a process gets all its resources it must return them
in a finite amount of time
Data Structures for the Banker’s Algorithm
Let n = number of processes, and m = number of resources types.
Available: Vector of length m. If available [j] = k, there are k
instances of resource type Rj available
Max: n x m matrix. If Max [i,j] = k, then process Pi may
request at most k instances of resource type Rj
Allocation: n x m matrix. If Allocation[i,j] = k then Pi is
currently allocated k instances of Rj
Need: n x m matrix. If Need[i,j] = k, then Pi may need k
more instances of Rj to complete its task
Need [i,j] = Max[i,j] – Allocation [i,j]
Resource-Request Algorithm for Process Pi
Request = request vector for process Pi. If Requesti [j] = k then
process Pi wants k instances of resource type Rj
1. If Requesti Needi go to step 2. Otherwise, raise error
condition, since process has exceeded its maximum claim
2. If Requesti Available, go to step 3. Otherwise Pi must wait,
since resources are not available
3. Pretend to allocate requested resources to Pi by modifying the
state as follows:
Available = Available – Request;
Allocationi = Allocationi + Requesti;
Needi = Needi – Requesti;
If safe the resources are allocated to Pi
If unsafe Pi must wait, and the old resource-allocation
state is restored
Safety Algorithm
1. Let Work and Finish be vectors of length m and n, respectively.
Initialize:
Work = Available
Finish [i] = false for i = 0, 1, …, n- 1
2. Find an i such that both:
(a) Finish [i] = false
(b) Needi Work
If no such i exists, go to step 4
3. Work = Work + Allocationi
Finish[i] = true
go to step 2
4. If Finish [i] == true for all i, then the system is in a safe state
Example
Example of Banker’s Algorithm
5 processes P0 through P4;
3 resource types:
A (10 instances), B (5instances), and C (7 instances)
Snapshot at time T0:
Allocation Max Available
ABC ABC ABC
P0 010 753 332
P1 200 322
P2 302 902
P3 211 222
P4 002 433
Example (Cont.)
The content of the matrix Need is defined to be Max – Allocation
Need
ABC
P0 743
P1 122
P2 600
P3 011
P4 431
The system is in a safe state since the sequence < P1, P3, P4, P2,
P0> satisfies safety criteria
Example: P1 Request (1,0,2)
Check that Request Available (that is, (1,0,2) (3,3,2) true
Allocation Need Available
ABC ABC ABC
P0 010 743 230
P1 302 020
P2 302 600
P3 211 011
P4 002 431
Executing safety algorithm shows that sequence < P1, P3, P4, P0, P2>
satisfies safety requirement
Can request for (3,3,0) by P4 be granted?
Can request for (0,2,0) by P0 be granted?
Deadlock Detection
Allow system to enter deadlock state
Detection algorithm
Recovery scheme
Single Instance of Each Resource Type
Maintain wait-for graph
Nodes are processes
Pi Pj if Pi is waiting for Pj
Periodically invoke an algorithm that searches for a cycle in the
graph. If there is a cycle, there exists a deadlock
An algorithm to detect a cycle in a graph requires an order of n2
operations, where n is the number of vertices in the graph.
Resource-Allocation Graph and
Wait-for Graph
Resource-Allocation Graph Corresponding wait-for graph
Several Instances of a Resource Type
Available: A vector of length m indicates the number of available resources
of each type.
Allocation: An n x m matrix defines the number of resources of each type
currently allocated to each process.
Request: An n x m matrix indicates the current request of each process. If
Request [i][j] = k, then process Pi is requesting k more instances of resource
type.Rj.
Detection Algorithm
1. Let Work and Finish be vectors of length m and n, respectively
Initialize:
(a) Work = Available
(b) For i = 1,2, …, n, if Allocationi 0, then
Finish[i] = false; otherwise, Finish[i] = true
2. Find an index i such that both:
(a) Finish[i] == false
(b) Requesti Work
If no such i exists, go to step 4
Detection Algorithm (Cont.)
3. Work = Work + Allocationi
Finish[i] = true
go to step 2
4. If Finish[i] == false, for some i, 1 i n, then the system is in
deadlock state. Moreover, if Finish[i] == false, then Pi is
deadlocked
Algorithm requires an order of O(m x n2) operations to detect
whether the system is in deadlocked state
Example of Detection Algorithm
Five processes P0 through P4; three resource types
A (7 instances), B (2 instances), and C (6 instances)
Snapshot at time T0:
Allocation Request Available
ABC ABC ABC
P0 010 000 000
P1 200 202
P2 303 000
P3 211 100
P4 002 002
Sequence <P0, P2, P3, P1, P4> will result in Finish[i] = true for all i
Example (Cont.)
P2 requests an additional instance of type C
Request
ABC
P0 000
P1 202
P2 001
P3 100
P4 002
State of system?
Can reclaim resources held by process P0, but insufficient resources to fulfill other
processes; requests
Deadlock exists, consisting of processes P1, P2, P3, and P4
Recovery from Deadlock:
Process Termination
Abort all deadlocked processes
Abort one process at a time until the deadlock cycle is eliminated
In which order should we choose to abort?
Priority of the process
How long process has computed, and how much longer to completion
Resources the process has used
Resources process needs to complete
How many processes will need to be terminated
Is process interactive or batch?
Recovery from Deadlock:
Resource Preemption
Selecting a victim – minimize cost
Rollback – return to some safe state, restart process for that state
Starvation – same process may always be picked as victim, include number
of rollback in cost factor