deadlock n : a situation in which no progress can be made or no advancement is possible; "reached an impasse on the negotiations" [syn: dead end, impasse, stalemate, standstill]
- Spanish: estancamiento
- to cause or to come to a deadlock
A deadlock is a situation wherein two or more competing actions are waiting for the other to finish, and thus neither ever does. It is often seen in a paradox like 'the chicken or the egg'.
“When two trains approach each other at a crossing, both shall come to a full stop and neither shall start up again until the other has gone.”
In computer science, deadlock refers to a specific condition when two or more processes are each waiting for another to release a resource, or more than two processes are waiting for resources in a circular chain (see Necessary conditions). Deadlock is a common problem in multiprocessing where many processes share a specific type of mutually exclusive resource known as a software, or soft, lock. Computers intended for the time-sharing and/or real-time markets are often equipped with a hardware lock (or hard lock) which guarantees exclusive access to processes, forcing serialization. Deadlocks are particularly troubling because there is no general solution to avoid (soft) deadlocks.
This situation may be likened to two people who are drawing diagrams, with only one pencil and one ruler between them. If one person takes the pencil and the other takes the ruler, a deadlock occurs when the person with the pencil needs the ruler and the person with the ruler needs the pencil, before he can give up the ruler. Both requests can't be satisfied, so a deadlock occurs.
The telecommunications description of deadlock is a little stronger: deadlock occurs when none of the processes meet the condition to move to another state (as described in the process's finite state machine) and all the communication channels are empty. The second condition is often left out on other systems but is important in the telecommunication context.
There are four necessary conditions for a deadlock to occur, known as the Coffman conditions from their first description in a 1971 article by E. G. Coffman.
- Mutual exclusion condition: a resource that cannot be shared by more than one process
- Hold and wait condition: processes already holding resources may request new resources
- No preemption condition: only a process holding a resource may release it
- Circular wait condition: two or more processes form a circular chain where each process waits for a resource that the next process in the chain holds
Deadlock can only occur in systems where all 4 conditions hold true.
Circular wait preventionCircular wait prevention consists of allowing processes to wait for resources, but ensure that the waiting can't be circular. One approach might be to assign a precedence to each resource and force processes to request resources in order of increasing precedence. That is to say that if a process holds some resources, and the highest precedence of these resources is m, then this process cannot request any resource with precedence smaller than m. This forces resource allocation to follow a particular and non-circular ordering, so circular wait cannot occur. Another approach is to allow holding only one resource per process; if a process requests another resource, it must first free the one it's currently holding (or hold-and-wait).
An example of a deadlock which may occur in database products is the following. Client applications using the database may require exclusive access to a table, and in order to gain exclusive access they ask for a lock. If one client application holds a lock on a table and attempts to obtain the lock on a second table that is already held by a second client application, this may lead to deadlock if the second application then attempts to obtain the lock that is held by the first application. (But this particular type of deadlock is easily prevented, e.g., by using an all-or-none resource allocation algorithm.)
Another example might be a text formatting program that accepts text sent to it to be processed and then returns the results, but does so only after receiving "enough" text to work on (e.g. 1KB). A text editor program is written that sends the formatter with some text and then waits for the results. In this case a deadlock may occur on the last block of text. Since the formatter may not have sufficient text for processing, it will suspend itself while waiting for the additional text, which will never arrive since the text editor has sent it all of the text it has. Meanwhile, the text editor is itself suspended waiting for the last output from the formatter. This type of deadlock is sometimes referred to as a deadly embrace (properly used only when only two applications are involved) or starvation. However, this situation, too, is easily prevented by having the text editor send a forcing message (eg. EOF) with its last (partial) block of text, which will force the formatter to return the last (partial) block after formatting, and not wait for additional text.
Nevertheless, since there is no general solution for deadlock prevention, each type of deadlock must be anticipated and specially prevented. But general algorithms can be implemented within the operating system so that if one or more applications becomes blocked, it will usually be terminated after (and, in the meantime, is allowed no other resources and may need to surrender those it already has, rolled back to a state prior to being obtained by the application).
Deadlock can be avoided if certain information about processes is available in advance of resource allocation. For every resource request, the system sees if granting the request will mean that the system will enter an unsafe state, meaning a state that could result in deadlock. The system then only grants requests that will lead to safe states. In order for the system to be able to figure out whether the next state will be safe or unsafe, it must know in advance at any time the number and type of all resources in existence, available, and requested. One known algorithm that is used for deadlock avoidance is the Banker's algorithm, which requires resource usage limit to be known in advance. However, for many systems it is impossible to know in advance what every process will request. This means that deadlock avoidance is often impossible.
Two other algorithms are Wait/Die and Wound/Wait, each of which uses a symmetry-breaking technique. In both these algorithms there exists an older process (O) and a younger process (Y). Process age can be determined by a time stamp at process creation time. Smaller time stamps are older processes, while larger timestamps represent younger processes.
It is important to note that a process may be in unsafe state but would not result in a deadlock. The notion of safe/unsafe state only refers to the ability of the system to enter a deadlock state or not. For example, if a process requests A which would result in an unsafe state, but releases B which would prevent circular wait, then the state is unsafe but the system is not in deadlock
PreventionDeadlocks can be prevented by ensuring that at least one of the following four conditions occur:
- Removing the mutual exclusion condition means that no process may have exclusive access to a resource. This proves impossible for resources that cannot be spooled, and even with spooled resources deadlock could still occur. Algorithms that avoid mutual exclusion are called non-blocking synchronization algorithms.
- The "hold and wait" conditions may be removed by requiring processes to request all the resources they will need before starting up (or before embarking upon a particular set of operations); this advance knowledge is frequently difficult to satisfy and, in any case, is an inefficient use of resources. Another way is to require processes to release all their resources before requesting all the resources they will need. This too is often impractical. (Such algorithms, such as serializing tokens, are known as the all-or-none algorithms.)
- A "no preemption" (lockout) condition may also be difficult or impossible to avoid as a process has to be able to have a resource for a certain amount of time, or the processing outcome may be inconsistent or thrashing may occur. However, inability to enforce preemption may interfere with a priority algorithm. (Note: Preemption of a "locked out" resource generally implies a rollback, and is to be avoided, since it is very costly in overhead.) Algorithms that allow preemption include lock-free and wait-free algorithms and optimistic concurrency control.
- The circular wait condition: Algorithms that avoid circular waits include "disable interrupts during critical sections" , and "use a hierarchy to determine a partial ordering of resources" (where no obvious hierarchy exists, even the memory address of resources has been used to determine ordering) and Dijkstra's solution.
DetectionOften neither deadlock avoidance nor deadlock prevention may be used. Instead deadlock detection and process restart are used by employing an algorithm that tracks resource allocation and process states, and rolls back and restarts one or more of the processes in order to remove the deadlock. Detecting a deadlock that has already occurred is easily possible since the resources that each process has locked and/or currently requested are known to the resource scheduler or OS.
Detecting the possibility of a deadlock before it occurs is much more difficult and is, in fact, generally undecidable, because the halting problem can be rephrased as a deadlock scenario. However, in specific environments, using specific means of locking resources, deadlock detection may be decidable. In the general case, it is not possible to distinguish between algorithms that are merely waiting for a very unlikely set of circumstances to occur and algorithms that will never finish because of deadlock.
Distributed deadlocks can occur in distributed systems when distributed transactions or concurrency control is being used. Distributed deadlocks can be detected either by constructing a global wait-for graph, from local wait-for graphs at a deadlock detector or by a distributed algorithm like edge chasing.
Phantom deadlocks are deadlocks that are detected in a distributed system.
LivelockA livelock is similar to a deadlock, except that the states of the processes involved in the livelock constantly change with regard to one another, none progressing. http://citeseer.ist.psu.edu/326777.html Livelock is a special case of resource starvation; the general definition only states that a specific process is not progressing. http://citeseer.ist.psu.edu/anderson01sharedmemory.html
As a real-world example, livelock occurs when two people meet in a narrow corridor, and each tries to be polite by moving aside to let the other pass, but they end up swaying from side to side without making any progress because they always both move the same way at the same time. As demonstrated in a sketch in "The Fast Show", a popular UK comedy show.
Livelock is a risk with some algorithms that detect and recover from deadlock. If more than one process takes action, the deadlock detection algorithm can repeatedly trigger. This can be avoided by ensuring that only one process (chosen randomly or by priority) takes action. http://doi.acm.org/10.1145/850752.850753
- Deadlock Detection Agents
- Paper "Deadlock Detection in Distributed Object Systems" by Nima Kaveh and Wolfgang Emmerich
- Article "Distributed Deadlock Detection" by JoAnne L. Holliday and Amr El Abbadi
- Article "Deadlock detection in distributed databases" by Edgar Knapp
- Article "Advanced Synchronization in Java Threads" by Scott Oaks and Henry Wong
- Paper "Confirmation of Deadlock Potentials Detected by Runtime Analysis" by Saddek Bensalem, Jean-Claude Fernandez, Klaus Havelund and Laurent Mounier
- Coffman, E.G., M.J. Elphick, and A. Shoshani, System Deadlocks, ACM Computing Surveys, 3, 2, 67-78 (1971).
- Paper Eliminating Receive Livelock in an Interrupt-driven Kernel by Jeffrey C. Mogul, K. K. Ramakrishnan
- DeadLock at the Portland Pattern Repository
- Etymology of "Deadlock"
- ARCS - A Web Service approach to alleviating deadlock
deadlock in Catalan: Abraçada mortal
deadlock in Czech: Deadlock
deadlock in German: Deadlock
deadlock in Spanish: Bloqueo mutuo
deadlock in French: Interblocage
deadlock in Korean: 교착 상태
deadlock in Italian: Deadlock
deadlock in Hebrew: חבק
deadlock in Lithuanian: Rakinimo aklavietė
deadlock in Hungarian: Holtpont
deadlock in Japanese: デッドロック
deadlock in Polish: Zakleszczenie
deadlock in Portuguese: Deadlock
deadlock in Russian: Взаимная блокировка
deadlock in Swedish: Baklås (datavetenskap)
deadlock in Ukrainian: Взаємне блокування
deadlock in Chinese: 死锁
Tweedledum and Tweedledee, arrest, bell, blind alley, block, box, brake, bring to, bring up short, cessation, check, checkmate, condition, corner, cul-de-sac, cut short, cutoff, dam, dead end, dead heat, dead set, dead stand, dead stop, dead-end street, dilemma, draw, draw rein, dying down, ebb, ebbing, end, endgame, ending, even break, extremity, fair shake, final whistle, freeze, full stop, grinding halt, gun, halt, hole, impasse, knotted score, lock, lockout, neck-and-neck race, photo finish, plight, posture, predicament, pull up, put paid to, quandary, sit-down strike, situation, slow down, stalemate, stall, stand, stand-off, standoff, standstill, state, stay, stem, stem the tide, stillstand, stop, stop cold, stop dead, stop short, stoppage, strike, stymie, subsidence, the same, tie, walkout, wane, waning, work stoppage