-
互斥条件(Mutual Exclusion):资源在一个时间点只能被一个进程占用。如果资源是不可共享的,即同一时间只能有一个进程访问该资源,就满足了互斥条件。
-
占有并等待条件(Hold and Wait):一个进程已经获得了某个资源,同时它又请求其他资源,但这些资源可能被其他进程占用。在等待过程中,该进程不会释放它已经获得的资源。
-
不剥夺条件(No Preemption):资源不能被强制剥夺,进程只能在完成了自己的任务后自愿释放已经获得的资源。这意味着一旦一个进程获得了资源,其他进程或系统不能强制将资源收回,必须等该进程自愿释放。
-
循环等待条件(Circular Wait):存在一个进程集合 { P 1 , P 2 , … , P n } \{P1, P2, \ldots, Pn\} {P1,P2,…,Pn},其中 P 1 P1 P1 等待 P 2 P2 P2 占有的资源, P 2 P2 P2 等待 P 3 P3 P3 占有的资源,依此类推, P n Pn Pn 等待 P 1 P1 P1 占有的资源,形成一个循环等待链。
例子说明
假设有两个进程 P1 和 P2,两个资源 R1 和 R2。以下是一个满足死锁四个条件的场景:
- 互斥条件:R1 和 R2 都是独占资源,不能被多个进程同时访问。
- 占有并等待条件:P1 占有 R1 并请求 R2,而 R2 此时被 P2 占用;同时,P2 占有 R2 并请求 R1,而 R1 被 P1 占用。
- 不剥夺条件:R1 和 R2 都不能被强制收回,必须由进程自己释放。
- 循环等待条件:P1 等待 R2,而 P2 等待 R1,形成一个循环等待。
在这个场景中,P1 和 P2 相互等待对方释放资源,导致双方都无法继续执行,从而发生死锁。
预防和避免死锁
了解死锁的四个必要条件,有助于设计预防和避免死锁的策略,如:
- 破坏互斥条件:尽量使用共享资源或减少对独占资源的需求。
- 破坏占有并等待条件:在一个进程请求资源时,要求它先释放它持有的所有资源,或者要求进程在请求资源时一次性申请所有所需资源。
- 破坏不剥夺条件:允许操作系统强制剥夺资源。
- 破坏循环等待条件:为所有资源编号,要求进程按顺序请求资源,避免形成循环等待。
通过打破上述任一条件,可以避免系统进入死锁状态。