(Latest Revision: Oct 11, 2007)  
 EXAMPLE FILE:  bankersAlg 
Deadlock Avoidance
Information Sheet on the Banker's Algorithm
===========================================================================
GLOSSARY:
n		        numProcs
m		        numRsrceTs
Available[j]		numAvailInst[rsrceT]
Max[i,j]		maxRequest[proc, rsrceT]
Allocation[i,j]		numAlloted[proc, rsrceT]
Need[i,j]		psbleFurthNeed[proc, rsrceT]
Work[j]		        willBeNumAvailInst[rsrceT]
Finish[i]		knowSureToFinish[proc]
Need[i,j] == Max[i,j] - Allocation[i,j],
i.e. psbleFurthNeed[proc, rsrceT]
  == maxRequest[proc, rsrceT] - numAlloted[proc, rsrceT]
===========================================================================
SAFETY ALGORITHM:
1.  FOR rsrceT = 1 TO numRsrceTs DO
      willBeNumAvailInst[rsrceT] = 
          numAvailInst[rsrceT] ;
    FOR proc = 1 TO numProcs DO 
      knowSureToFinish[proc] = false ;
           
2.  Find a proc such that both the following are true:
    a.  knowSureToFinish[proc] == false ;
    b.  FOR rsrceT = 1 TO numRsrceTs
              psbleFurthNeed[proc, rsrceT] <= 
                 willBeNumAvailInst[rsrceT]
        
    IF no such proc exists, THEN go to step 4.
3.  FOR rsrceT = 1 TO numRsrceTs DO
      willBeNumAvailInst[rsrceT] =
           willBeNumAvailInst[rsrceT] + 
               numAlloted[proc, rsrceT] ;
    knowSureToFinish[proc] = true ;
    GO TO step 2
    
4.  IF    FOR proc = 1 TO numProcs,  
                  knowSureToFinish[proc] == true ,
    THEN  the system is safe,
    ELSE  it is not safe.
===========================================================================
THE BANKER'S ALGORITHM:
request[proc, rsrceT] = number of instances of resource type rsrceT 
currently requested by process proc.
1.  IF    FOR rsrceT = 1 TO numRsrceTs 
            request[proc, rsrceT] <= psbleFurthNeed[proc, rsrceT]
    THEN  GOTO step 2
    ELSE  raise error: "exceeded max claim"
2.  IF    FOR rsrceT = 1 TO numRsrceTs 
                        request[proc, rsrceT] <= numAvailInst[rsrceT]
    THEN  GOTO step 3
    ELSE  Block(proc) until request can be granted
3.  FOR rsrceT = 1 TO numRsrceTs DO
    BEGIN
      tmpNumAvailInst[rsrceT] = 
        numAvailInst[rsrceT] - request[proc, rsrceT] ;
      tmpNumAlloted[proc, rsrceT] =
        numAlloted[proc, rsrceT] + request[proc, rsrceT] ;
      tmpPsbleFurthNeed[proc, rsrceT] =
        psbleFurthNeed[proc, rsrceT] - request[proc, rsrceT] ;
    END
4. Now run the safety algorithm with numAvailInst =
   tmpNumAvailInst, with numAlloted = tmpNumAlloted, and with
   psbleFurthNeed = tmpPsbleFurthNeed 
   IF    "YES" is the result of running the safety algorithm
   THEN  the current request can be granted
   ELSE  the process making the current request must wait