侧边栏壁纸
博主头像
沙漠渔

把過去的累積,善用到當下

  • 累计撰写 472 篇文章
  • 累计创建 285 个标签
  • 累计收到 946 条评论
标签搜索

目 录CONTENT

文章目录

面试题整理 - 死锁的产生条件、死锁的处理方法

沙漠渔
2022-09-20 / 1 评论 / 0 点赞 / 84 阅读 / 2,411 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-09-20,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

最近面试过程中频繁问过几个同学关于死锁的问题,有的同学回答的非常清楚,有的则非常含糊,这里把死锁的相关内容整理一下。

be63038cba4e4d90ab7b64a945d998d7.jpeg

一、死锁的必要条件

所谓死锁就是多个并发进程因争夺系统资源而产生相互等待的现象。

  • 互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源。

  • 请求和保持条件:进程获得一定的资源后,又对其他资源发出请求,但是该资源可能被其他进程占有,此时请求阻塞,但该进程不会释放自己已经占有的资源。

  • 不可剥夺条件:进程已获得的资源,在未完成使用之前,不可被剥夺或不能被其他进程强行夺走,只能在使用后自己释放。

  • 循环等待条件:进程发生死锁后,必然存在一个进程-资源之间的环形链 ,环路中每个进程都在等待下一个进程所占有的资源。

以上4条其实缺少任何一条都构不成死锁。

二、死锁的处理方法

主要有以下四种方法:

  • 鸵鸟策略

  • 死锁检测与死锁恢复

  • 死锁预防

  • 死锁避免

鸵鸟策略

把头埋在沙子里,假装根本没发生问题。

因为解决死锁问题的代价很高,因此鸵鸟策略这种不采取任务措施的方案会获得更高的性能,当发生死锁时不会对用户造成多大影响,或发生死锁的概率很低,可以采用鸵鸟策略。

大多数操作系统,包括 Unix,Linux 和 Windows,处理死锁问题的办法仅仅是忽略它。

解除与恢复

在死锁产生前不采取任何措施,只检测当前系统有没有发生死锁,若有,则采取一些措施解除死锁。

死锁解除:

  1. 资源剥夺:挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他死锁进程。(但应该防止被挂起的进程长时间得不到资源,而处于资源匮乏的状态。);

  2. 撤销进程:强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。(撤销的原则可以按进程优先级和撤销进程代价的高低进行);

  3. 进程回退:让一个或多个进程回退到足以避免死锁的地步。【进程回退时自愿释放资源而不是被剥夺。要求系统保持进程的历史信息,设置还原点。】

死锁恢复:

  1. 利用抢占恢复。从一个或多个进程中抢占足够数量的资源分配给死锁进程,以解除死锁状态。

  2. 利用回滚恢复。周期性地检查进程的状态(包括请求的资源),将其写入一个文件,当发生死锁,回滚到之前的某个时间点

  3. 通过杀死进程恢复。终止或撤销系统中的一个或多个死锁进程,直至打破死锁状态。

死锁预防

预防死锁即破坏四个必要条件之一

破坏互斥条件

改造独占性资源为虚拟资源,大部分资源已无法改造。
即允许进程同时访问某些资源。但是,有的资源是不允许被同时访问的,像打印机等等。所以,这种办法并无实用价值。

破坏不可剥夺条件

当一进程占有一独占性资源后又申请一独占性资源而无法满足,则退出原占有的资源。
当一个进程已占有了某些资源,它又申请新的资源,但不能立即被满足时,它必须释放所占有的全部资源,以后再重新申请。这就相当于该进程占有的资源被隐蔽地强占了。这种预防死锁的方法实现起来困难,会降低系统性能。

破坏请求与保持条件

采用资源预先分配策略,即进程运行前申请全部资源,满足则运行,不然就等待,这样就不会占有且申请。
可以实行资源预先分配策略。即进程在运行前,一次性地向系统申请它所需要的全部资源。
如果某个进程所需的全部资源得不到满足,则不分配任何资源,此进程暂不运行。只有当系统能够满足当前进程的全部资源需求时,才一次性地将所申请的资源全部分配给该进程。由于运行的进程已占有了它所需的全部资源,所以不会发生占有资源又申请资源的现象,因此不会发生死锁。

破坏循环等待条件:实行顺序资源分配法

实现资源有序分配策略,对所有设备实现分类编号,所有进程只能采用按序号递增的形式申请资源。
首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri的资源。

避免死锁

银行家算法:

银行家算法【在动态分配资源的过程中,银行家算法防止系统进入不安全状态,从而避免死锁】
当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。
当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源。若没超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若满足则按当前的申请量分配资源,否则也要推迟分配。

安全序列:

是指系统能按某种进程推进顺序(P1, P2, P3, …, Pn),为每个进程 Pi 分配其所需要的资源,直至满足每个进程对资源的最大需求,使每个进程都可以顺序地完成。这种推进顺序就叫安全序列【银行家算法的核心就是找到一个安全序列】。

系统安全状态 :

如果系统能找到一个安全序列,就称系统处于安全状态,否则,就称系统处于不安全状态。系统安全状态也就是能找到一个分配资源的序列能让所有进程都能顺序完成。

点评:
自我感觉关于死锁问题,应该在软件面试过程中应该属于热门问题,即便不能准确描述,也应该有个大概思路。

0
广告 广告

评论区