Avoiding deadlocks given some extra knowledge.

- Not surprisingly, the resource manager knows how many units of each resource it had to begin with.
- Also it knows how many units of each resource it has given to each process.
- It would be great to see all the programs in advance and thus know all future requests, but that is asking for too much.
- Instead, when each process when it starts, it gives its maximum usage.
That is each process at startup states, for each resource, the maximum
number of units it can possibly ask for.
This is called the
**claim**of the process.- If during the run the process asks for more than its claim, abort it.
- If it claims more than it needs, the result is that the resource manager will be more conservative than need be and there will be more waiting.

Give an example of all four possibilities. A state that is

- Safe and deadlocked--not possible
- Safe and not deadlocked
- Not safe and deadlocked
- Not safe and not deadlocked--interesting

A manager can determine if a state is safe.

- Since the manager know all the claims, it can determine the maximum amount of additional resources each process can request.
- The manager knows how many units of each resource it has left.

The manager then follows the following procedure, which is part of
**Banker's Algorithms** discovered by Dijkstra, to
determine if the state is safe.

- If there are no processes remaining, the state is
**safe**.

- Seek a process P whose max additional requests is less than
what remains (for each resource type).
- If no such process can be found, then the state is
**not safe**. - The banker (manager) knows that if it refuses all requests
excepts those from P, then it will be able to satisfy all
of P's requests. Why?

Ans: Look at how P was chosen.

- If no such process can be found, then the state is
- The banker now pretends that P has terminated (since the banker
knows that it can guarantee this will happen). Hence the banker
pretends that all of P's currently held resources are returned. This
makes the banker richer and hence perhaps a process that was not
eligible to be chosen as P previously, can now be chosen.

- Repeat these steps.

process | claim | current | max need |
---|---|---|---|

X | 3 | 1 | 2 |

Y | 11 | 5 | 6 |

Z | 19 | 10 | 9 |

Total | 16 | ||

Available | 6 |

- One resource type R with 22 unit
- Three processes X, Y, and Z with claims 3, 11, and 19 respectively.
- Currently the processes have 1, 5, and 10 units respectively.
- Hence the manager currently has 6 units left.
- Also note that the max additional needs for processes are 2, 6, 9
- So the manager cannot assure (with its
**current**remaining supply of 6 units) that Z can terminate. But that is**not**the question. - This state is safe
- Use 2 units to satisfy X; now the manager has 7 units.
- Use 6 units to satisfy Y; now the manager has 12 units.
- Use 9 units to satisfy Z; done!

process | claim | current | max need |
---|---|---|---|

X | 3 | 1 | 2 |

Y | 11 | 5 | 6 |

Z | 19 | 12 | 7 |

Total | 18 | ||

Available | 4 |

Start with example 1 and assume that Z now requests 2 units and we grant them.

- Currently the processes have 1, 5, and 12 units respectively.
- The manager has 4 units.
- The max additional needs are 2, 6, and 7.
- This state is unsafe
- Use 2 unit to satisfy X; now the manager has 5 units.
- Y needs 6 and Z needs 7 so we can't guarantee satisfying either

- Note that we were able to find a process that can terminate (X) but then we were stuck. So it is not enough to find one process. Must find a sequence of all the processes.

The algorithm is simple: Stay in safe states. Initially, we assume all the processes are present before execution begins and that all claims are given before execution begins. We will relax these assumptions very soon.

- Before execution begins, check that the system is safe. That is, check that no process claims more than the manager has). If not, then the offending process is trying to claim more than the system has so cannot be guaranteed to complete even if run by itself. You might say that it can become deadlocked all by itself.
- When the manager receives a request, it pretends to grant it and checks if the resulting state is safe. If it is safe the request is granted, if not the process is blocked.
- When a resource is returned, the manager (politely thanks the process and then) checks to see if any of the pending requests can be granted (i.e., if the result would now be safe). If so the request is granted and the manager checks to see if another pending request can be granted, etc..

**Homework:** 13.

At a high level the algorithm is identical: Stay in safe states.

- What is a safe state?
- The same definition (if processes are run in a certain order they will all terminate).
- Checking for safety is the same idea as above. The difference is
that to tell if there enough free resources for a processes to
terminate, the manager must check that for
**all**resources, the number of free units is at least equal to the max additional need of the process.

- Often users don't know the maximum requests a process will make. They can estimate conservatively (i.e., use big numbers for the claim) but then the manager becomes very conservative.
- New processes arriving cause a problem (but not so bad as
Tanenbaum suggests).
- The process's claim must be less than the total number of units of the resource in the system. If not, the process is not accepted by the manager.
- Since the state without the new process is safe, so is the state with the new process! Just use the order you had originally and put the new process at the end.
- Insuring fairness (starvation freedom) needs a little more work, but isn't too hard either (once an hour stop taking new processes until all current processes finish).

- A resource becoming unavailable (e.g., a tape drive breaking), can result in an unsafe state.

**Homework:** 21, 27, and 20. There is an interesting
typo in 20 (2nd edition of book): A has claimed 3 units of resource 5,
but there are only 2 units in the entire system. Change A's claim to 2.

This is covered (MUCH better) in a database text. We will skip it.

You can get deadlock from semaphores as well as resources. This is trivial. Semaphores can be considered resources. P(S) is request S and V(S) is release S. The manager is the module implementing P and V. When the manager returns from P(S), it has granted the resource S.

As usual FCFS is a good cure. Often this is done by priority aging and picking the highest priority process to get the resource. Also can periodically stop accepting new processes until all old ones get their resources.

Skipped.

Read.