关于操作系统的几个重要概念(三)

死锁的必要条件,如何处理死锁

为了实现多线程的同步互斥问题,我们在并发编程领域中引入了这样一个概念–信号量,而信号量只能通过PV操作改变。如果一个线程在执行P操作之后,因为信号量减到0而被挂起,那么他需要等待其他程序执行一个V操作来获得信号量之后才能继续运行。而程序死锁就是因为每一个线程都在等待其他程序执行一个不可能发生的V操作,从而陷入无尽的等待之中,我们称这样的状态为死锁。

知道程序死锁的原因之后我们来分析死锁的必要条件:
1、资源独占:如果资源属于共享资源,也就不存在占有资源或者等待资源的概念了。
2、不可抢占:也就是说资源不可以剥夺,必须是自己释放。
3、零散请求:如果一次性将所需要的所有资源请求完毕之后才执行程序的话,也不会存在等待资源的问题了,所以所如发生死锁,必然是零散的请求。
4、循环等待:当等待资源的进程形成了一个封闭的链之后,每一个进程都在等待下一个进程释放资源,从而陷入无尽的等待之中。

知道了死锁的必要条件之后,我们可以从这些条件入手,来处理死锁。既然这四个条件是必然条件,那么我们只要破坏其中的任意一条,死锁就不会发生。

资源独占:大多数资源都无法达到共享的状态,这是资源本身的性质决定的,所以这一个条件我们大概是破坏不了了。

不可抢占:既然不可剥夺是必要条件,那么我们就让资源可剥夺。也就是说当一个进程已经占有资源再次申请资源得不到满足的时候,他必须要放弃已经占有的资源(即使没有使用完),下次再一起申请。或者优先级高的资进程强迫优先级低的进程放弃资源。抢占资源的方式需要保存放弃资源的现场以便下次恢复,这往往要消耗很多的时间和空间。所以这种方法也并不提倡。

零散请求:要破坏零散请求就要求进程执行之前要把他所需的资源一次性请求完毕,但是这样做的话很可能导致资源的浪费,并且在程序执行之前预测需要用到的资源也是一件非常困难的事情。

循环等待:为了防止循环等待,我们给资源排个序,每个进程申请资源的时候只能从小序号往大序号申请,释放的时候则反过来,这样就可以防止等待资源的进程形成一个封闭链。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值