Deadlock 10 Example Process 1 Process 2 Resource












![Dining Philosophers Revisited philosopher(int i){ while (TRUE) { // Think // Eat P(fork[i]); /* Dining Philosophers Revisited philosopher(int i){ while (TRUE) { // Think // Eat P(fork[i]); /*](https://slidetodoc.com/presentation_image/b66bb07fe4374f13b86d129e0664548b/image-13.jpg)











![Banker’s Algorithm • Let maxc[i, j] be the maximum claim for Rj by pi Banker’s Algorithm • Let maxc[i, j] be the maximum claim for Rj by pi](https://slidetodoc.com/presentation_image/b66bb07fe4374f13b86d129e0664548b/image-25.jpg)
![Banker’s Algorithm • Copy the alloc[i, j] table to alloc’[i, j] • Given C, Banker’s Algorithm • Copy the alloc[i, j] table to alloc’[i, j] • Given C,](https://slidetodoc.com/presentation_image/b66bb07fe4374f13b86d129e0664548b/image-26.jpg)




- Slides: 30


Deadlock 10

Example Process 1 Process 2 Resource 1 Resource 2 Process holds the resource Process requests the resource

Three Deadlocked Processes Process 1 Process 2 Process 3 Resource 1 Resource 2 Resource 3 Process holds the resource Process requests the resource

A Model • • P = {p 1, p 2, …, pn} be a set of processes R = {R 1, R 2, …, Rm} be a set of resources cj = number of units of Rj in the system S = {S 0, S 1, …} be a set of states representing the assignment of Rj to pi – State changes when processes take action – This allows us to identify a deadlock situation in the operating system

State Transitions • The system changes state because of the action of some process, pi • There are three pertinent actions: – Request (“ri”): request one or more units of a resource – Allocation (“ai”): All outstanding requests from a process for a given resource are satisfied – Deallocation (“di”): The process releases units of a resource Sj xi Sk

Properties of States • Want to define deadlock in terms of patterns of transitions • Define: pi is blocked in Sj if pi cannot cause a transition out of Sj a 1 Sj r 3 r 1 p 2 is blocked in Sj

Properties of States (cont) • If pi is blocked in Sj, and will also be blocked in every Sk reachable from Sj, then pi is deadlocked • Sj is called a deadlock state

A Simple Process-Resource Model Instance P 1 P 2 P 3 R 1 R 2 R 3 Process holds resource Process requests resource

Example • One process, two units of one resource • Can request one unit at a time d S 0 r S 1 d a S 2 r S 3 a S 4

Extension of Example d d S 00 r 1 S 01 a 1 S 02 r 1 r 0 d 1 r 0 0 S 10 a 0 S 20 r 1 d 0 S 11 a 0 d 1 a 1 d 0 S a 0 r 1 d 0 r 1 12 r 0 S a 0 S 03 13 a 1 d 1 r 0 S S 04 14 S 21 a 1 S 22 S 23 r 0 d 1 r 0 0 S 30 a 0 S 40 r 1 d 0 r 1 S 31 a 0 d 1 a 1 S 32 r 1 r 0 S 33 S 41

Figure 10‑ 10: A Model of a State with a Circular Wait R Ri P P holds R Pi P R P requests R
![Dining Philosophers Revisited philosopherint i while TRUE Think Eat Pforki Dining Philosophers Revisited philosopher(int i){ while (TRUE) { // Think // Eat P(fork[i]); /*](https://slidetodoc.com/presentation_image/b66bb07fe4374f13b86d129e0664548b/image-13.jpg)
Dining Philosophers Revisited philosopher(int i){ while (TRUE) { // Think // Eat P(fork[i]); /* Pick up left fork */ P(fork[(i+1) mod 5]); /* Pick up right fork */ eat(); V(fork[(i+1) mod 5]); V(fork[i]); } } philosopher 4(){ while (TRUE) { // Think // Eat P(fork[0]); /* Pick up right fork */ P(fork[4]); /* Pick up left fork */ eat(); V(fork[4]); semaphore fork[5]; V(fork[0]); fork[0] = fork[1] = fork[2] = fork[3] = fork[4] = 1; } fork(philosopher, 1, 0); } fork(philosopher, 1, 1); fork(philosopher, 1, 2); fork(philosopher, 1, 3); fork(philosopher 4, 0);

Addressing Deadlock • Prevention: Design the system so that deadlock is impossible • Avoidance: Construct a model of system states, then choose a strategy that will not allow the system to go to a deadlock state • Detection & Recovery: Check for deadlock (periodically or sporadically), then recover • Manual intervention: Have the operator reboot the machine if it seems too slow

Prevention • Necessary conditions for deadlock – Mutual exclusion – Hold and wait – Circular waiting – No preemption • Ensure that at least one of the necessary conditions is false at all times – Mutual exclusion must hold at all times

Hold and Wait • Need to be sure a process does not hold one resource while requesting another • Approach 1: Force a process to request all resources it needs at one time • Approach 2: If a process needs to acquire a new resource, it must first release all resources it holds, then reacquire all it needs • What does this say about state transition diagrams?

Circular Wait • Have a situation in which there are K processes holding units of K resources R Ri P P holds R Pi P R P requests R

Circular Wait (cont) • There is a cycle in the graph of processes and resources • Choose a resource request strategy by which no cycle will be introduced • Total order on all resources, then can only ask for Rj if Ri < Rj for all Ri the process is currently holding

Circular Wait (cont) • There is a cycle in the graph of processes and resources • Choose a resource request strategy by which no cycle will be introduced • Total order on all resources, then can only ask for Rj if Ri < Rj for all Ri the process is currently holding • This is how we noticed the easy solution for the dining philosophers

Allowing Preemption • Allow a process to time-out on a blocked request -- withdrawing the request if it fails ru Si dv wu Sk Sj ru

Avoidance • Define a model of system states, then choose a strategy that will guarantee that the system will not go to a deadlock state • Requires extra information, e. g. , the maximum claim for each process • Allows resource manager to see the worst case that could happen, then to allow transitions based on that knowledge

Safe vs Unsafe States • Safe state: one in which the system can assure that any sequence of subsequent transitions leads back to the initial state – Even if all exercise their maximum claim, there is an allocation strategy by which all claims can be met • Unsafe state: one in which the system cannot guarantee that the system will transition back to the initial state – Unsafe state can lead to a deadlock state if too many processes exercise their maximum claim at once

More on Safe & Unsafe States Likely to be in a safe state Normal Execution Request No Max Claim Yes Execute, then release Probability of being in unsafe state increases

More on Safe & Unsafe States I Disallow Safe States Unsafe States Deadlock States
![Bankers Algorithm Let maxci j be the maximum claim for Rj by pi Banker’s Algorithm • Let maxc[i, j] be the maximum claim for Rj by pi](https://slidetodoc.com/presentation_image/b66bb07fe4374f13b86d129e0664548b/image-25.jpg)
Banker’s Algorithm • Let maxc[i, j] be the maximum claim for Rj by pi • Let alloc[i, j] be the number of units of Rj held by pi • Can always compute – avail[j] = cj - S 0 i< nalloc[i, j] – Then number of available units of Rj • Should be able to determine if the state is safe or not using this info
![Bankers Algorithm Copy the alloci j table to alloci j Given C Banker’s Algorithm • Copy the alloc[i, j] table to alloc’[i, j] • Given C,](https://slidetodoc.com/presentation_image/b66bb07fe4374f13b86d129e0664548b/image-26.jpg)
Banker’s Algorithm • Copy the alloc[i, j] table to alloc’[i, j] • Given C, maxc and alloc’, compute avail vector • Find pi: maxc[i, j] - alloc’[i, j] avail[j] for 0 j < m and 0 i < n. – If no such pi exists, the state is unsafe – If alloc’[i, j] is 0 for all i and j, the state is safe • Set alloc’[i, j] to 0; deallocate all resources held by pi; go to Step 2

Example Maximum Claim Process p 0 p 1 p 2 p 3 p 4 R 0 3 0 5 1 3 R 1 2 2 1 5 0 R 2 1 5 0 3 3 R 3 4 2 5 0 3 Allocated Resources Process p 0 p 1 p 2 p 3 p 4 Sum R 0 2 0 0 0 1 3 R 1 0 2 0 3 R 2 1 2 0 1 3 7 R 3 1 1 0 0 0 2 C = <8, 5, 9, 7> • Compute total allocated • Determine available units avail = <8 -7, 5 -3, 9 -7, 7 -5> = <5, 2, 2, 5> • Can anyone’s maxc be met? maxc[4, 0]-alloc’[4, 0] = 5 -1 = 4 5 = avail[0] maxc[4, 1]-alloc’[4, 1] = 0 -0 = 0 2 = avail[1] maxc[4, 2]-alloc’[4, 2] = 3 -3 = 0 2 = avail[2] maxc[4, 3]-alloc’[4, 3] = 3 -0 = 3 5 = avail[3] • P 4 can exercise max claim avail[0] = avail[0]+alloc’[4, 0] = 5+1 = 6 avail[1] = avail[1]+alloc’[4, 1] = 2+0 = 2 avail[2] = avail[2]+alloc’[4, 2] = 2+3 = 5 avail[3] = avail[3]+alloc’[4, 3] = 5+0 = 5

Example Maximum Claim Process p 0 p 1 p 2 p 3 p 4 R 0 3 0 5 1 3 R 1 2 2 1 5 0 R 2 1 5 0 3 3 R 3 4 2 5 0 3 R 2 1 2 0 1 0 4 R 3 1 1 0 0 0 2 Allocated Resources Process p 0 p 1 p 2 p 3 p 4 Sum R 0 2 0 0 2 R 1 0 2 0 1 C = <8, 5, 9, 7> • Compute total allocated • Determine available units avail = <8 -7, 5 -3, 9 -7, 7 -5> = <6, 2, 5, 5> • Can anyone’s maxc be met? (Yes, any of them can)

Detection & Recovery • Check for deadlock (periodically or sporadically), then recover • Can be far more aggressive with allocation • No maximum claim, no safe/unsafe states • Differentiate between – Serially reusable resources: A unit must be allocated before being released – Consumable resources: Never release acquired resources; resource count is number currently available

Recovery • No magic here – Choose a blocked resource – Preempt it (releasing its resources) – Run the detection algorithm – Iterate if until the state is not a deadlock state