# Operating Systems

================ Start Lecture #7 ================

Let's see if we can tiptoe through the tulips and avoid deadlock states even though our system does permit all four of the necessary conditions for deadlock.

An optimistic resource manager is one that grants every request as soon as it can. To avoid deadlocks with all four conditions present, the manager must be smart not optimistic.

### 3.5.1 Resource Trajectories

We plot progress of each process along an axis. In the example we show, there are two processes, hence two axes, i.e., planar. This procedure assumes that we know the entire request and release pattern of the processes in advance so it is not a practical solution. I present it as it is some motivation for the practical solution that follows, the Banker's Algorithm.

• We have two processes H (horizontal) and V.
• The origin represents them both starting.
• Their combined state is a point on the graph.
• The parts where the printer and plotter are needed by each process are indicated.
• The dark green is where both processes have the plotter and hence execution cannot reach this point.
• Light green represents both having the printer; also impossible.
• Pink is both having both printer and plotter; impossible.
• Gold is possible (H has plotter, V has printer), but the system can't get there.
• The upper right corner is the goal; both processes have finished.
• The red dot is ... (cymbals) deadlock. We don't want to go there.
• The cyan is safe. From anywhere in the cyan we have horizontal and vertical moves to the finish point (the upper right corner) without hitting any impossible area.
• The magenta interior is very interesting. It is
• Possible: each processor has a different resource
• Not deadlocked: each processor can move within the magenta
• Deadly: deadlock is unavoidable. You will hit a magenta-green boundary and then will no choice but to turn and go to the red dot.
• The cyan-magenta border is the danger zone.
• The dashed line represents a possible execution pattern.
• With a uniprocessor no diagonals are possible. We either move to the right meaning H is executing or move up indicating V is executing.
• The trajectory shown represents.
1. H excuting a little.
2. V excuting a little.
3. H executes; requests the printer; gets it; executes some more.
4. V executes; requests the plotter.
• The crisis is at hand!
• If the resource manager gives V the plotter, the magenta has been entered and all is lost. “Abandon all hope ye who enter here” --Dante.
• The right thing to do is to deny the request, let H execute moving horizontally under the magenta and dark green. At the end of the dark green, no danger remains, both processes will complete successfully. Victory!
• This procedure is not practical for a general purpose OS since it requires knowing the programs in advance. That is, the resource manager, knows in advance what requests each process will make and in what order.

Homework: 10, 11, 12.

### 3.5.2: Safe States

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 starts, it announces its maximum usage. That is each process, before making any resource requests, tells the resource manager the maximum number of units of each resource the process can possible need. This is called the claim of the process.
• If the claim is greater than the total number of units in the system the resource manager kills the process when receiving the claim (or returns an error code so that the process can make a new claim).
• If during the run the process asks for more than its claim, the process is aborted (or an error code is returned and no resources are allocated).
• If a process 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.

Definition: A state is safe if there is an ordering of the processes such that: if the processes are run in this order, they will all terminate (assuming none exceeds its claim).

Recall the comparison made above between detecting deadlocks (with multi-unit resources) and the banker's algorithm

• The deadlock detection algorithm given makes the most optimistic assumption about a running process: it will return all its resources and terminate normally. If we still find processes that remain blocked, they are deadlocked.

• The banker's algorithm makes the most pessimistic assumption about a running process: it immediately asks for all the resources it can (details later on “can”). If, even with such demanding processes, the resource manager can assure that all process terminates, then we can assure that deadlock is avoided.

In the definition of a safe state no assumption is made about the running processes; that is, for a state to be safe termination must occur no matter what the processes do (providing the all terminate and to not exceed their claims). Making no assumption is the same as making the most pessimistic assumption.

Give an example of each of the four possibilities. A state that is

2. Safe and not deadlocked--trivial (e.g., no arcs).

4. Not safe and not deadlocked--interesting.

Is the figure on the right safe or not?

• You can NOT tell until I give you the claims of the process.

• Please do not make the unfortunately common exam mistake to give an example involving safe states without giving the claims.

• For the figure on the right, if the claims are:
P: 1 unit of R and 2 units of S (written (1,2))
Q: 2 units of R and 1 units of S (written (2,1))
the state is NOT safe.

• But if the claims are instead:
P: 2 units of R and 1 units of S (written (2,1))
Q: 1 unit of R and 2 units of S (written (1,2))
the state IS safe.

• Explain why this is so.

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.

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

2. 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.

3. 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.

4. Repeat these steps.

#### Example 1

A safe state with 22 units of one resource
processclaimcurrentmax need
X312
Y1156
Z19109
Total16
Available6
• 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 the processes are 2, 6, 9 respectively.
• 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
1. Use 2 units to satisfy X; now the manager has 7 units.
2. Use 6 units to satisfy Y; now the manager has 12 units.
3. Use 9 units to satisfy Z; done!

#### Example 2

 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
1. Use 2 unit to satisfy X; now the manager has 5 units.
2. 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. We must find a sequence of all the processes.
Remark: An unsafe state is not necessarily a deadlocked state. Indeed, if one gets lucky all processes may terminate successfully. A safe state means that the manager can guarantee that no deadlock will occur.

### 3.5.3: The Banker's Algorithm (Dijkstra) for a Single Resource

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 of some resource than exist in the system has and hence 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 “the first” pending requests can be granted (i.e., if the result would now be safe). If so the request is granted. The manager checks to see if the next pending request can be granted, etc..

Homework: 13.

### 3.5.4: The Banker's Algorithm for Multiple Resources

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.

#### Limitations of the banker's algorithm

• 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 can become unavailable (e.g., a tape drive might break). This can result in an unsafe state.

Homework: 21, 27, and 20. There is an interesting typo in 20: A has claimed 3 units of resource 5, but there are only 2 units in the entire system. Change the problem by having B both claim and be allocated 1 unit of resource 5.

## 3.7: Other Issues

### 3.7.1: Two-phase locking

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.

### 3.7.3: Starvation

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.

# Chapter 4: Memory Management

Also called storage management or space management.

Memory management must deal with the storage hierarchy present in modern machines.

• Registers, cache, central memory, disk, tape (backup)
• Move data from level to level of the hierarchy.
• How should we decide when to move data up to a higher level?
• Fetch on demand (e.g. demand paging, which is dominant now).
• Prefetch
• Large cache lines and pages.
• Extreme example. Entire job present whenever running.

We will see in the next few weeks that there are three independent decision:

1. Segmentation (or no segmentation)
2. Paging (or no paging)
3. Fetch on demand (or no fetching on demand)

• Also called logical to real address translation.
• A physical address is the address understood by the computer hardware.
• The translation from virtual to physical addresses is performed by the Memory Management Unit or (MMU).
• The translation might be trivial (e.g., the identity) but not in a modern general purpose OS.
• The translation might be difficult (i.e., slow).
• Often includes memory references.
• VERY serious.
• Solution is to cache translations in a Translation Lookaside Buffer (TLB). Sometimes called a translation buffer (TB).

Homework: 6.

#### When is address translation performed?

1. At compile time
• Requires knowledge of where the compilation unit will be loaded.
• Primitive.
• Rarely used (MSDOS .COM files).

• Compiler
• Generates relative (a.k.a. relocatable) addresses for each compilation unit.
• Converts the relocatable addr to absolute.
• Resolves external references.
• Misnamed ld by unix.
• Must also converts virtual to physical addresses by knowing where the linked program will be loaded. Linker lab “does” this, but it is trivial since we assume the linked program will be loaded at 0.
• Hardware requirements are small.
• A program can be loaded only where specified and cannot move once loaded.
• Not used much any more.

• Similar to at link-edit time, but do not fix the starting address.
• Program can be loaded anywhere.
• Program can move but cannot be split.
• Need modest hardware: base/limit registers.
• Loader sets the base/limit registers.
• No longer common.

4. At execution time
• Addresses translated dynamically during execution.
• Hardware needed to perform the virtual to physical address translation quickly.
• Currently dominates.

#### Extensions

• When executing a call, check if module is loaded.
• Slows down calls (indirection) unless you rewrite code dynamically.
• Not used much.