EXAMPLE FILE: ddLckAlg




Deadlock Detection:

If there is one instance of each resource type, check for a
cycle in the resource allocation or wait-for graph.

If there are multiple instances of resource types, the
following algorithm will detect deadlock:

1.  FOR rsrceT := 1 TO numRsrceTs DO
      couldBeAvInst[rsrceT] := 
          numAvailInst[rsrceT] ;

    FOR proc := 1 TO numProcs DO
      IF    FOR rsrceT := 1 TO numRsrceTs
              numAlloted[proc, rsrceT] = 0
      THEN   knowCanFinish[proc] := true
      ELSE   knowCanFinish[proc] := false ;
           
2.  Find a proc such that both
    a.  knowCanFinish[proc] = false
    b.  FOR rsrceT := 1 TO numRsrceTs
          request[proc, rsrceT] <= couldBeAvInst[rsrceT] ;

    IF    no such proc exists
    THEN  GOTO step 4.

3.  (* pretend that this process terminates after receiving its
       current request, without making any additional requests. *)

    FOR rsrceT := 1 TO numRsrceTs
      couldBeAvInst[rsrceT] :=
         couldBeAvInst[rsrceT] + numAlloted[proc, rsrceT] ;

    knowCanFinish[proc] := true ;

    GOTO step 2.

4.  IF    FOR proc := 1 TO numProcs
            knowCanFinish[proc] = true
    THEN  system is NOT in deadlock
    ELSE  system is deadlocked

    (furthermore, each proc for which knowCanFinish[proc] =
     false is deadlocked -- waiting for another process to
     release a resource that it will never release.  The system
     cannot possibly free up enough resources to satisfy ANY of
     the requests of ANY of the proc's with knowCanFinish[proc]
     = false -- even if all processes in the system are willing
     to make no further requests after receiving the allocation
     of their current request.)