什么是死锁?
通俗点讲:死锁就是两个或两个以上的进程或线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
案例
某计算机系统中互斥资源 R 的可用数为 8,系统中有 3 个进程竞争 8 个资源,那么每个进程最少需要几个资源,该系统会发生死锁?
如果每个进程都需要4个资源,并且有3个进程,系统中只有8个资源,这种情况下可能会导致死锁。我们可以通过分析一下资源分配的情况来理解这个问题。
死锁条件
死锁的发生需要同时满足以下四个条件:
- 互斥:资源不能被共享,进程必须独占资源。
- 占有且等待:进程持有一些资源并等待其他资源。
- 非抢占:已经分配给进程的资源不能被抢占。
- 循环等待:存在一个进程集合,使得每个进程都在等待下一个进程持有的资源。
总结 好记:东西少 不抢 还客气 还不着急。
分析情况
第一种情况:需要 3 个资源
我们满足互斥、占有等待、非抢占的条件下,但是不满足循环等待这个条件。
如果一个进程完成其任务并释放它所持有的资源,那么这些资源就可以被进程 3 使用,从而打破循环等待条件。
第二种情况:需要 4 个资源
在你的场景中,假设有3个进程(P1, P2, P3)和8个资源(R1, R2, …, R8),每个进程需要4个资源才能完成。以下是可能的资源分配情况:
- 初始分配:假设每个进程都请求4个资源,但由于资源限制,无法同时满足所有进程的需求。
- 占有且等待:P1 持有4个资源并正在执行,而 P2 和 P3 则需要的4个资源都不能得到,这样就形成了占有且等待的状态。
- 非抢占:由于已分配的资源不能被抢占,P1 无法释放资源,导致 P2 和 P3 只能等待。
- 循环等待:此时 P2 可能需要 P1 持有的资源,而 P3 需要 P2 持有的资源,形成了循环等待的条件。
如何处理死锁?
在这种情况下,由于每个进程都需要4个资源,但系统的资源总数(8个)不足以满足所有进程同时的需求,因此就可能发生死锁。为避免这种情况,系统需要采用适当的资源管理策略,例如:
1.打破互斥
允许进程 同时访问某些资源
2.打破不剥夺
如果资源已经被进程占据了,允许进程强行从占有者那里夺取某些资源
3.打破请求与保持
进程在运行前申请得到所有的资源,否则该进程不能进入准备执行状态。
避免总是请求其他的资源
4.打破循环等待
避免出现资源申请环路,即对资源事先分类编号,按号分配
。
原文链接:https://blog.youkuaiyun.com/ss123mlk/article/details/107017403
死锁公式
资源数 m > 进程个数 n x (每个进程需要的资源数 w - 1)
m > n * (w - 1)
条件成立:则不会发生死锁;
条件不成立:会发生死锁;
回到案例
某计算机系统中互斥资源 R 的可用数为 8,系统中有 3 个进程竞争 8 个资源,那么每个进程最少需要几个资源,该系统会发生死锁?
代入公式:8 > 3*( w -1 )
当 w = 3 时 ,满足条件,不会发生死锁;
当 w = 4 时,不满足条件,会发生死锁;