在操作系统中,死锁是一个任何情况都不想遇到的。操作系统一旦出现一个死锁,就会导致出现一堆死锁,最后操作系统无法正常工作,最后“自闭”。
为什么说一个死锁出现以后,会连带着出现更多的 死锁呢,那就要从他的定义开始分析。
死锁的定义:在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲,就是两个或多个进程无限期的阻塞、相互等待的一种状态。
从定义中我们可以知道,死锁的出现是由于多个进程占用资源而造成的一种现象,那么如果有一个死锁的进程出现,即代表有部分资源被占用无法释放,而其他想要使用该资源的进程就会使用不到这部分资源,而这些进程自己也占着一些资源,以此类推,结果可想而知。
因此,对死锁的解决也是操作系统的重要的一部分。
我们先来捋一下死锁产生的必要条件:
互斥:至少有一个资源必须属于非共享模式,即一次只能被一个进程使用;若其他申请使用该资源,那么申请进程必须等到该资源被释放为止;
占有并等待:一个进程必须占有至少一个资源,并等待另一个资源,而该资源为其他进程所占有;
非抢占:进程不能被抢占,即资源只能被进 程在完成任务后自愿释放
循环等待:若干进程之间形成一种头尾相接的环形等待资源关系
只有同时满足上述四个条件才能产生死锁,那么我们的解决方案也就定了下来。
首先我们是要预防死锁的产生,这在学术上称为死锁预防。
我们知道同时满足上述四个条件才会产生死锁,那么只要不满足其中任意一个死锁就不会产生了,跟着这个思路,我们有了四个死锁预防的方案:(摘自百度百科)
打破互斥条件:允许进程同时访问某些资源。但是,有些资源是不能被多个进程所共享的,这是由资源本身属性所决定的,因此,这种办法通常并无实用价值。
打破占有并等待条件:可以实行资源预先分配策略(进程在运行前一次性向系统申请它所需要的全部资源,若所需全部资源得不到满足,则不分配任何资源,此进程暂不运行;只有当系统能满足当前进程所需的全部资源时,才一次性将所申请资源全部分配给该线程)或者只允许进程在没有占用资源时才可以申请资源(一个进程可申请一些资源并使用它们,但是在当前进程申请更多资源之前,它必须全部释放当前所占有的资源)。但是这种策略也存在一些缺点:在很多情况下,无法预知一个进程执行前所需的全部资源,因为进程是动态执行的,不可预知的;同时,会降低资源利用率,导致降低了进程的并发性。
打破非抢占条件:允许进程强行从占有者哪里夺取某些资源。也就是说,但一个进程占有了一部分资源,在其申请新的资源且得不到满足时,它必须释放所有占有的资源以便让其它线程使用。这种预防死锁的方式实现起来困难,会降低系统性能。
打破循环等待条件:实行资源有序分配策略。对所有资源排序编号,所有进程对资源的请求必须严格按资源序号递增的顺序提出,即只有占用了小号资源才能申请大号资源,这样就不回产生环路,预防死锁的发生。
百密必有一疏,如果死锁预防没有成功的话,那么我们就要在进程运行的时候避免死锁的产生,这称之为死锁避免。
死锁避免的基本思想是:动态检测资源分配情况,确保系统处于安全状态。
安全状态:如果系统能按某个顺序为每个进程分配资源(不超过其最大值),那么系统状态是安全的,换句话说就是,如果存在一个安全序列,那么系统处于安全状态。
死锁避免的最常用算法当属资源分配图算法和银行家算法,这两个算法本次先不写,可能放到以后再写。
当然,毕竟人体的防御系统都会漏掉一些病菌,所以我们漏掉一些死锁也很正常,但既然知道有可能会漏掉,就要去弥补,这就有了监测死锁的手段。
检测死锁: 允许系统运行过程中产生死锁,在死锁发生之后,采用一定的算法进行检测,并确定与死锁相关的资源和进程。
当然,我们都知道漏网之鱼很难抓住,同样,检测死锁的过程复杂,实现难度非常之大。
那既然我们都确认了死锁的存在,那么接下来就是解除死锁。
解除死锁: 与死锁检测配合,将系统从死锁中解脱出来(撤销进程或者剥夺资源),通常使用的方法有进程终止和资源抢占。
进程终止:是指简单地终止一个或多个进程以打破循环等待,包括两种方式:终止所有死锁进程和一次只终止一个进程直到取消死锁循环为止。
资源抢占:是指从一个或多个死锁进程那里抢占一个或多个资源。
上述即为死锁的相关面试知识点,如果哪里有问题欢迎提出。
原文:https://www.cnblogs.com/FuloliyaLansfroya/p/13533328.html