死锁 是指两个或两个以上的进程在执行过程中,由于竞争资源或彼此通信而造成的一种阻塞现象,无外力作用,他们都将无法再推进下去。
死锁的原理
-
原因有两个:系统资源竞争、进程推进顺序不当
-
产生死锁必须同时满足以下四个原因:互斥条件(资源不可多个进程同时获取)、不可剥夺条件(只能是已经占有资源的进程来主动释放资源)、请求和保持条件(占有当前资源的同时申请新的资源)、循环等待条件(链中每一个进程已获得资源的同时被链中的下一个进程所请求,并且这个链首尾相连形成闭环)
-
资源分配图:
表示 进程与资源之间的相互关系,尝试使用资源分配图。分配图当中的顶点由进程P(圆圈)和资源R(方框)表示。有向边也分为两类:申请边(进程指向资源)和分配边(资源指向进程)。如下图所示
图表摘自:https://blog.csdn.net/coding1994/article/details/52474731
4.死锁定理(用于死锁检测)
利用资源分配图并结合死锁定理,可以来检测死锁。
- 首先,需要根据系统的情况绘出资源分配图
- 其次,随机选择图中非孤立的进程节点Pi,
如果其全部请求都能被满足
,则表明他能够得到所需要的所有资源顺利运行,因此在运行结束后释放他的全部资源。so, 这样的话我们可以去掉Pi的请求边和分配边,使其成为孤立点。(那么问题的关键就是,找到一个能够被满足的进程,先把它干掉,之后便是一步一步简化资源分配图的内容) - 随后,一直重复上述操作,若能够将所有边均消除,是所有节点成为孤立节点,则说明该图是完全可简化图,否则成为不可完全简化图。
当且仅当系统某状态S所对应的资源分配图是不可完全简化的,称S为死锁状态,该充分条件为死锁定理。
那么我们来举个锤子,根据下图,我们来进行一下化简(关键问题就是找到一个“能够被满足”的进程)。
图片来自:https://blog.csdn.net/ai977313677/article/details/72780203
-
1)首先先看进程P1,P1想要请求R1,但是R1被P2占用,因此P1的请求无法被满足,它不是我们要找的人;
2)再看P2,它想请求R2,可是R2被P3占用,因此,R2也不是我们要找的突破口;
3)然后我们看P3,它只有占用资源而没有请求其他资源,因此它是可以顺利运行结束的,所以P3就是这个问题的突破口!当它运行完毕之后,我们就可以把指向P3的两条边去除掉,P3的任务也就完成了,可以光荣下岗了,R2资源也就被释放了出来。 -
那么随后,我们的P2早已经等候多时,它拿到R2资源之后,迫不及待地完成了自己的任务,进程运行并结束后,我们把跟P2相关的三条边也去除掉,P2可以哪凉快哪呆着去了,这个时候R1也就被释放出来了。
-
就在此时,P1说:”快点儿啊,我等的花儿都谢了“,R1也已经腾了出来,所以P1、R1、R3愉快的坐在了一起斗地主。
斗地主打完之后,啊呸,进程运行完成之后,去除跟P1相关的两条边,这个时候,资源分配图中的所有点均已经孤立,因此我们的计算过程也就在此时结束,并给出相应的结论是:该图是完全可简化图(计算机组成原理期末考试10分到手)
参考书目:《操作系统原理及应用(linux)》,汪杭军主编,机械工业出版社