死锁的四个必要条件
1.资源有限
2.持有并等待
3.非抢占
4.循环等待
哲学家就餐问题
哲学家们围坐在一个圆桌边上,每个人的左右两边均放着一根筷子,如果要吃饭,需要获得左右两边的筷子
每个哲学家都拿起左边的筷子,会出现死锁
应对办法:
1.不理睬,死锁发生的频率不太高,死锁防止的代价很高,不如直接重启,windows,Linux都没有采取死锁预防措施
2.先礼后兵:死锁检测与恢复
检测死锁:
死锁的原因是资源竞争,如果用一个图来表示资源的拥有和请求,看图中有没有循环
将图转化为资源分配矩阵(已经拥有的资源的数量)和资源等待矩阵(还需要特定资源的数量)
再维持两个矢量,系统资源总量矢量(系统中所有资源的总数是多少),当前可用资源矢量(系统现在还有多少可用的资源)
通过矩阵和矢量,我们就可以通过简单的矩阵运算来判断系统是否发生了死锁,把可用资源与等待矩阵进行比较,如果每一个进程都有部分资源不够,就出现了死锁
死锁恢复:
1.抢占,把资源强行拿走
2.将进程kill
3.rollback 回到原来的状态,但是很困难,要定期记录
死锁检测和恢复的可行性:行不通,原因如下
1.用资源分配和等待矩阵判断死锁可靠吗,不,这种只能说死锁可能发生,但并不能说死锁就会发生,或许某个线程突然退出,
从而不会发生死锁,还有一种,有的线程已经死锁,但是有的线程还能继续推进,从矩阵判断没有发生死锁,但是已经发生了死锁
2 .矩阵计算代价大
最致命的一点,检查死锁的进程自己发生了死锁,更无法检测死锁是否发生,所以,这种行不通,只能不让死锁发生!!!
3.先发制人,死锁动态避免
在每次资源分配时,必须进行仔细计算,确保该资源请求批准后系统不会进入到死锁或潜在的死锁状态。潜在的死锁状态是指尚未发生的死锁,但是接下来的执行一定产生死锁,这种叫不安全状态。安全状态,可以找到一种分配方式,使所有进程都能获得需要的资源。
缺点:计算量大,且不能准确预测将来最大的资源需求
4 斩草除根,死锁的静态防止,清楚死锁发生的土壤,4个必要条件
1.资源独占: 资源共享
2.占有并等待:进程必须一次请求所需要的所有资源 缺点,1 太过浪费,要一开始知道一个进程所需的全部资源很困难
变通办法:需要才请求,如果请求的被拒绝,释放已经拥有的
3.非抢占: 允许抢占
4.循环等待: 给资源一个编号,必须按顺序去申请资源,就不会死锁了
银行家算法: 动态避免死锁
解决哲学家的吃饭问题:
1、 动态避免,每次去判断一下
2.筷子共享 ,不行
3,可以抢筷子,不行,对哲学家不够尊重
4. 杜绝循环等待,对筷子编号,按这个顺序拿筷子
5.杜绝占有并等待,要么同时拿两根筷子,要么不拿