死锁产生条件和解决办法

死锁

死锁产生的四个条件

产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生。

互斥条件:线程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某资源仅为一个线程所占有。此时若有其他线程请求该资源,则请求线程只能等待

不剥夺条件:线程所获得的资源在未使用完毕之前,不能被其他线程强行夺走,即只能 由获得该资源的线程自己来释放(只能是主动释放)

请求和保持条件:线程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他线程占有,此时请求线程被阻塞,但对自己已获得的资源保持不放

循环等待条件:存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被 链中下一个线程所请求。即存在一个处于等待状态的线程集合{Pl, P2, …, pn},其中Pi等 待的资源被P(i+1)占有(i=0, 1, …, n-1),Pn等待的资源被P0占有

解决死锁方法

  1. 预防死锁:通过设置一些限制条件,去破坏产生死锁的必要条件

  2. 避免死锁:在资源分配过程中,使用某种方法避免系统进入不安全的状态,从而避免发生死锁。例如银行家算法。

  3. 检测死锁:允许死锁的发生,但是通过系统的检测之后,采取一些措施,将死锁清除掉。例如画出资源分配图

  4. 解除死锁:该方法与检测死锁配合使用

预防死锁

1、破坏互斥条件

如果允许系统资源都能共享使用,则系统不会进入死锁状态。

但不可避免的,有些资源根本不能同时访问,如打印机等临界资源只能互斥使用。所以,破坏互斥条件而预防死锁的方法不太可行,而且在有的场合应该保护这种互斥性!

2、破坏请求并保持条件

釆用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把它投入运行。一旦投入运行后,这些资源就一直归它所有,也不再提出其他资源请求,这样就可以保证系统不会发生死锁。

缺点:系统资源被严重浪费,其中有些资源可能仅在运行初期或运行快结束时才使用,甚至根本不使用。而且还会导致“饥饿”现象,当由于个别资源长期被其他进程占用时,将致使等待该资源的进程迟迟不能开始运行。

3、破坏不可剥夺条件

当一个已保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说是被剥夺了,或从而破坏了不可剥夺条件。

缺点:该策略实现起来比较复杂,释放已获得的资源可能造成前一阶段工作的失效,反复地申请和释放资源会增加系统开销,降低系统吞吐量。这种方法常用于状态易于保存和恢复的资源,如CPU的寄存器及内存资源,一般不能用于打印机之类的资源。

4、破坏循环等待条件

方法:例如为了破坏循环等待条件,可釆用顺序资源分配法。首先给系统中的资源编号,规定每个进程,必须按编号递增的顺序请求资源,同类资源一次申请完。也就是说,只要进程提出申请分配资源Ri,则该进程在以后的资源申请中,只能申请编号大于Ri的资源。

例如有 1,2,3,4,5,6,7,8 8个资源

那个线程A按照1,3,5,7顺序访问,如果线程B按照3,1顺序访问,很容易造成死锁。

但是现在线程B按照3,4,5,6,7顺序访问,那么虽然A,B对资源3都有竞争,但是他们俩争夺之后谁能够获得该资源,那么就会继续运行,另一方不会再对其造成任何妨碍了!

缺点:这种方法存在的问题是,编号必须相对稳定,这就限制了新类型设备的增加;尽管在为资源编号时已考虑到大多数作业实际使用这些资源的顺序,但也经常会发生作业使用资源的顺序与系统规定顺序不同的情况,造成资源的浪费;此外,这种按规定次序申请资源的方法,也必然会给用户的编程带来麻烦。

避免死锁的银行家算法

银行家算法原理:

我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。

为保证资金的安全,银行家规定:

(1)当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;

(2)顾客可以分歧贷款,但贷款的总数不能超过最大需求量;

(3)当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款;

(4)当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金.操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。

当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。

若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。

解除死锁

  1. 资源剥夺法

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

  1. 撤销进程法

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

  1. 进程回退法

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

  1. 尝试使用定时锁,使用lock.tryLock(timeout)来替代使用内部锁机制。
死锁是指两个或多个并发进程各自占有某种资源而又等待对方释放资源,导致它们都无法继续执行的一种状态。要形成死锁,通常需要满足四个必要条件: 1. **互斥**:至少有一个资源是不可共享的,一次只能由一个进程使用。 2. **请求与保持**:一旦某个进程占有了某个资源,它会继续请求其他资源,如果得不到就保持已有的资源不放。 3. **不可剥夺**:已经获得的资源,在未完成任务之前不能被其他进程强行夺走。 4. **循环等待**:存在一个进程集P,它们互相等待对方所持有的资源。 检测死锁通常通过以下几个步骤进行: - **死锁检测算法**:系统定期检查所有进程的状态,看是否存在环路,同时每个进程都在等待不可能得到的资源。 - **银行家算法**:一种静态预防死锁的方法,通过预先分配资源来避免死锁条件的出现。 - **资源预分配与回收**:进程申请资源时,系统可能会尝试预测并防止死锁发生。 解决死锁通常有以下几种策略: - **预防**:在资源分配阶段就避免死锁条件的发生,如采用银行家算法。 - **避免**:限制进程申请资源的顺序,打破循环等待。 - **检测和恢复**:一旦检测到死锁,强制撤销部分进程的资源分配,让其回滚到安全状态。 - **超时机制**:设置超时时间,当进程长时间无法获取所需资源时,主动放弃当前资源并重新开始。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值