CH 8
CH 8
Operating System Concepts – 9th Edition Silberschatz, Galvin and Gagne ©2013
Chapter 8: Deadlocks
System Model
Deadlock Characterization
Methods for Handling Deadlocks
Deadlock Prevention
Deadlock Avoidance
Deadlock Detection
Recovery from Deadlock
To develop a description of deadlocks, which prevent
sets of concurrent processes from completing their
tasks
To present a number of different methods for
preventing or avoiding deadlocks in a computer
system
Two mutex locks are created in the following code
pthread_mutex_t first_mutex;
pthread_mutex_t second_mutex;
The two mutex locks are initialized in the following code
pthread_mutex_init (&first_mutex, NULL);
pthread_mutex\_init(&second_mutex, NULL);
Two threads thread_one and thread_two are created,
and both these threads have access to both mutex locks.
pthread_mutex_lock(&first_mutex);
pthread_mutex_lock(&second_mutex);
/** * Do some work */
pthread_mutex_unlock(&second_mutex);
pthread_mutex_unlock(&first_mutex);
pthread_exit(0);
}
/* thread two runs in this function */
void *do_work_two(void *param)
{
pthread_mutex_lock(&second_mutex);
pthread_mutex_lock(&first_mutex);
/** * Do some work */
pthread_mutex_unlock(&first_mutex);
pthread_mutex_unlock(&second_mutex);
pthread_exit(0);
}
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.
R = {R1, R2, …, Rm}, the set consisting of all resource
types in the system
request edge – directed edge Pi Rj
assignment edge – directed edge Rj Pi
Resource Type with 4 instances
Pi requests instance of Rj
Pi
Rj
Pi is holding an instance of Rj
Pi
Rj
If graph contains no cycles no deadlock
If graph contains a cycle
If only one instance per resource type, then
deadlock exist
If several instances per resource type, then
possibility of deadlock
Is there a deadlock?
Is there a deadlock?
Two bank transactions 1 and 2 execute concurrently.
Transaction 1 transfers $25 from account A to account B
Transaction 2 transfers $50 from account B to account A
Program
System is in safe state if there exists a sequence <P1, P2, …, Pn>
of ALL the processes in the systems such that for each Pi the
resources that Pi can still request can be satisfied by currently
available resources + resources held by all the Pj, with j < i
That is:
If Pi resource needs are not immediately available, then Pi can
wait until all processes Pj ( j < i ) have finished executing.
When they have finished executing they release all their
resources and then Pi can obtain the needed resources,
execute, return allocated resources, and terminate
When Pi terminates, Pi +1 can obtain its needed resources, and
so on
Single instance of a resource type
Each process must a priori claim maximum resource use
Use a variant of the resourceallocation graph with claim edges.
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
Resources must be claimed a priori in the system
A cycle in the graph implies that the system is in unsafe state
P1 is holding resource R1 and has a claim on R2
P2 is requesting R1 and has a claim on R2
No cycle. So system is in a safe state.
The graph of slide 7.23 with a claim edge from P2 to
R2 is changing to an assignment edge.
There is a cycle in the graph unsafe state.
Is there a deadlock?
Suppose that process Pi requests a resource Rj
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
Otherwise, the process must wait
Let n = number of processes, and m = number of resources types.
Available: Vector of length m.
If available [j] = k, then 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 at most k more instances of Rj to
complete its task.
Need [i,j] = Max[i,j] – Allocation [i,j]
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.
Otherwise, in an unsafe state.
The content of the matrix Need is defined to be Max – Allocation
The system is in a safe state since the sequence < P1, P3, P4, P2, P0>
satisfies safety criteria
Let Requesti [...] be the request vector for process Pi.
Requesti [j] = k. 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 – Requesti
Allocationi = Allocationi + Requesti
Needi = Needi – Requesti
If safe the resources are allocated to Pi
If unsafe Pi must wait, and the old resourceallocation state is
restored
5 processes P0 through P4;
3 resource types:
A (10 instances), B (5 instances), and C (7 instances)
Snapshot at time T0:
Allocation Max Available
A B C A B C A B C
P0 0 1 0 7 5 3 3 3 2
P1 2 0 0 3 2 2
P2 3 0 2 9 0 2
P3 2 1 1 2 2 2
P4 0 0 2 4 3 3
We have shown that the system is in a safe state
Check that Request Available (that is, (1,0,2) (3,3,2) true
State of system after resources allocated to P1
Allocation Need Available
A B C A B C A B C
P0 0 1 0 7 4 3 2 3 0
P1 3 0 2 0 2 0
P2 3 0 2 6 0 0
P3 2 1 1 0 1 1
P4 0 0 2 4 3 1
Executing safety algorithm shows that sequence < P1, P3, P4, P0, P2>
satisfies safety requirement
Given the above state can request for (3,3,0) by P4 be granted?
Given the above state can request for (0,2,0) by P0 be granted?
Allow system to enter deadlock state
Detection algorithm
Single instance of a resource type
Multiple instances of a resource type.
Recovery scheme
Maintain a waitfor graph
Nodes are processes
Pi Pj if Pi is waiting for Pj
Converting a resourceallocation graph to a waitfor graph.
ResourceAllocation Graph Corresponding waitfor graph
Maintain a waitfor graph
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
Let n = number of processes, and m = number of resources types.
Available: Vector of length m. If available [j] = k, then
there are k instances of resource type Rj available
Allocation: n x m matrix. If Allocation[i,j] = k, then Pi is
currently allocated k instances of Rj
Request: n x m matrix that indicates the current request
of each process. If Request[i,j] = k, then process Pi is
requesting k additional instances of resource type Rj .
Let Work and Finish be vectors of length m and n, respectively Initialize:
1. Initialization
(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
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
Sequence <P0, P2, P3, P1, P4> will result in Finish[i] = true for all i
P2 requests one additional instance of type C
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
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?
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
Operating System Concepts – 9th Edition Silberschatz, Galvin and Gagne ©2013