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  // can't be deadlocked
      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.)