目录
1. 定义:
死锁是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
2. 死锁产生的必要条件:
互斥条件:资源是独占的且排他使用,进程互斥使用资源,即任意时刻一个资源只能给一个进程使用,其他进程若申请一个资源,而该资源被另一进程占有时,则申请者等待直到资源被占有者释放。
不剥夺条件:进程所获得的资源在未使用完毕之前,不被其他进程强行剥夺,而只能由获得该资源的进程资源释放。
请求和保持条件:进程每次申请它所需要的一部分资源,在申请新的资源的同时,继续占用已分配到的资源。
循环等待条件:在发生死锁时必然存在一个进程等待队列{P1,P2,…,Pn},其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路,环路中每一个进程所占有的资源同时被另一个申请,也就是前一个进程占有后一个进程所深情地资源。
3. 预防死锁:
- 破坏“不可剥夺”条件:一个进程不能获得所需要的全部资源时便处于等待状态,等待期间他占有的资源将被隐式的释放重新加入到 系统的资源列表中,可以被其他的进程使用,而等待的进程只有重新获得自己原有的资源以及新申请的资源才可以重新启动,执行。
- 破坏”请求与保持条件“:第一种方法静态分配即每个进程在开始执行时就申请他所需要的全部资源。第二种是动态分配即每个进程在申请所需要的资源时他本身不占用系统资源。
- 破坏“循环等待”条件:采用资源有序分配其基本思想是将系统中的所有资源顺序编号,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。
4. 解决方法:
在系统中已经出现死锁后,应该及时检测到死锁的发生,并采取适当的措施来解除死锁。
- 死锁预防
- 死锁避免
- 死锁检测和解除:先检测:这种方法并不须事先采取任何限制性措施,也不必检查系统是否已经进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过系统所设置的检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源。检测方法包括定时检测、效率低时检测、进程等待时检测等。
解除死锁:采用适当措施,从系统中将已发生的死锁清除。常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给已处于阻塞状态的进程,使之变为就绪状态,以继续运行,解除死锁。
5. 避免死锁的算法
以下引自https://blog.csdn.net/triorwy/article/details/80643753
5.1 线性资源分配法
这种算法资源必须按照某种规则给系统中的所有资源统一编号(例如打印机为1、磁带机为2、磁盘为3、等等),申请时必须申请序列号高的资源。系统要求申请进程:
1、对它所必须使用的而且属于同一类的所有资源,必须一次申请完;
2、在申请不同类资源时,必须按各类设备的编号依次申请。例如:进程P1,使用资源的顺序是R1,R2; 进程P2,使用资源的顺序是R2,R1;若采用动态分配有可能形成环路条件,造成死锁。
采用有序资源分配法:R1的编号为1,R2的编号为2;
P1:申请次序应是:R1,R2
P2:申请次序应是:R1,R2
这样就破坏了环路条件,避免了死锁的发生
5.2 系统安全状态法
即在系统分配资源之前,就应该检测此次资源分配的安全性,如果此次分配资源会导致进程进入不安全状态,那就等待,如果不会,则分配资源。
5.3 银行家算法
四个条件:
1.分批向银行贷款时,申请的总额不能超过一开始申请的额度。
2.申请贷款时不能超过银行现有资金数目
3.当银行资金不能满足顾客贷款需求时,可以推迟支付,但是肯定会让顾客在需求时间内得到贷款
4.顾客拿到贷款后必须在规定时间内归还。