计算及操作系统--死锁

目录

什么是死锁
死锁形成的原因
死锁的必要条件
死锁的预防

什么是死锁

死锁指的是两个或两个以上的进程在执行过程中,因为争夺资源而造成一种互相等待的状态,如果不借助外力的话他们将无法推进下去。在多任务操作系统中,操作系统为了协调不同行程,能否获取系统资源时,为了让系统运作,必须要解决问题。

死锁形成的原因

  1. 系统资源不足。
  2. 进程运行推进的顺序不合适。
  3. 资源分配不等。

死锁的必要条件

  • 互斥:每个资源要么已经分配给了一个进程,要么就是可用的。
  • 占有和等待:一个进程可以在等待时持有系统资源。
  • 不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显示地释放。
  • 循环等待:有两个或两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。

死锁的预防

死锁只有在四个必要条件同事满足时出现。预防死锁就是至少破坏这四个条件其中之一,即破坏“互斥”,“不可抢占”,“循环等待”,“占有和等待”

处理方法
  • 鸵鸟策略
  • 死锁检测与死锁恢复
  • 死锁预防
  • 死锁避免
鸵鸟策略

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

死锁检测与死锁恢复
1.每种类型一个资源的死锁检测

在这里插入图片描述
此图片取自CyC2018的github
上图为资源分配图,其中方框表示资源,圆圈表示进程,资源指向进程表示该资源已经分配给该进程,进程指向资源表示进程请求获取该资源。
图a可以抽取出环,如图b,它满足了循环等待的条件,因此会发生死锁。
每种类型一个资源的死锁检测算法是通过检测有向图是否存在环来实现,从一个节点出发进行深度优先搜索,对访问过的节点进行标记,如果访问了已经标记的节点,就表示有向图存在环,也就是检测到死锁的发生。

2.每种类型多个资源的死锁检测

在这里插入图片描述
此图片取自CyC2018的github
上图中,有三个进程四个资源,每个数据代表的含义如下:

  • E向量:资源总量
  • A向量:资源剩余量
  • C矩阵:每个进程所拥有的资源数量,每一行都代表一个进程有资源的数量
  • R矩阵:每个进程请求的资源数量

进程p1和p2所请求的资源都得不到满足,只有进程p3可以,让p3执行,之后释放p3拥有的资源,此时A=(2 2 2 0).p2可以执行,执行后释放p2拥有的资源,A=(4 2 2 1).p1也可以执行,所有进程都可以顺利执行,没有死锁。
算法总结如下:
每个进程最开始都不被标记,执行过程有可能被标记。当算法结束时,任何没有被标记的进程都是死锁进程。

  • 寻找一个没有标记的进程Pi,它所请求的资源小于等于A。
  • 如果找到了这样一个进程,那么将C矩阵的第i行向量加到A中,标记该进程,并转回1。
  • 如果没有这样的一个进程,算法终止。
死锁恢复
  • 利用抢占恢复:一次性撤销参与死锁的全部进程,剥夺全部资源,或者是逐步撤销参与死锁的进程,逐步收回死锁进程占有的资源
  • 利用回滚恢复:让参与死锁的进程回到没有发生死锁钱某一点处,并由此点处继续执行,以求再次执行时不再发生死锁,这个操作的缺点就是操作起来开销大,而且要有专门的机构来记录每一步的变化,以便今后的回退。
  • 通过杀死进程恢复:最常用的就是系统的重新启动,不过代价比很大。
死锁预防

死锁的预防是保证系统不进入死锁状态的一种策略,它的基本思想是要求进程申请资源时遵循某种协议,从而打破产生死锁的四个条件中的一个或多个,保证系统不会进入死锁状态。

  • 破坏互斥条件:即允许进程同时访问某些资源,但是,有的资源是不允许被同时访问的,像打印机等等,这是资源本身属性所决定的。所以这种办法并无使用价值。

  • 破环不可剥削条件:允许进程强行从占有者那里夺取某些资源。就是说,当一个进程已占有了某些资源,它又申请新的资源,但不能立即被满足时,他必须释放所占有的全部资源,以后重新申请。它所释放的资源可以分配给其他进程,这就相当于该进程占有的资源被强占了这种预防死锁的方法实现起来困难,会降低系统性能。

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

    1.在许多情况下,一个进程在执行之前不可能直到它所需要的全部资源,这是由于进程在执行时是动态的,不可预测的。
    2.资源地利用率低,无论资源何时用到,一个进程只有在占有所需的全部资源后才能执行。及时有些资源最后才被该进程用到一次,但该进程在生存期间却一直占有他们,造成长期占着不用状态。这是资源的极大浪费。
    3.降低了进程的并发性。因为资源有限,又加上存在浪费,能分配到所需全部资源的进程个数就必然少

  • 破坏循环等待条件,实行资源有序分配策略:采用这种策略,把资源事先分类编号,按号分配,使进程在申请,占用资源时形成环路。所有进程对资源的请求必须严格按资源序号递增的顺序提出。进程占用了小号资源,才能申请大号资源,就不会产生环路,从而预防了死锁。这种策略与前面的策略相比,资源的利用率和系统的吞吐量都有很大的提高,但时也存在以下缺点。

    1.限制了进程对资源的请求,同时给系统中所有资源合理编号也是件困难事,并增加系统开销
    2.为了遵循按标编号申请的次序,暂不使用的资源也需要提前申请,从而增加了进程对资源的占用时间。

死锁避免

  • 上面讲到的死锁预防时排除死锁的静态策略,它使产生死锁的四个必要条件不能同时具备,从而对进程申请资源的活动加以限制,以保证死锁不会发生。下面我们介绍排除死锁的动态策略–死锁的避免,它不限制进程有关申请资源的命令,而是对进程所发出的每一个申请资源命令加以动态检查,并根据检查结果决定是否进行资源分配。就是说,在资源分配过程中若预测有发生死锁的可能性,则加以避免。这种方法的关键是确定资源分配的安全性。
安全序列
  • 所谓安全序列,是指系统中的所有进程能够按照某一种次序分配资源,并且依次地运行完毕,这种进程序列{p1,p2,…pn}就是安全序列。如果存在这样的安全序列,则系统是安全的,如果不存在系统则不安全。
  • 安全序列{p1,p2,…,pn}是这样的,若对于每一给进程pi,它需要的附加资源可以被系统中当前可用资源加上所有进程pj当前占有资源之和所满足,则{p1,p2,…pn}为一个安全序列,这时系统处于安全状态,不会进入死锁状态。
银行家算法

是一个著名的避免死锁的算法
问题描述:一个银行家拥有一定数量的资金,有若干个客户要贷款,每个客户需要在一开始贷款之前申明自己所需贷款的总额,若该客户贷款总额不超过银行家的资金总数,银行家可以接受客户的要求。客户在减贷款之前可能会等待,但是银行家需要保证这种等待是有限的,可完成的。
银行家算法允许死锁必要条件的互斥,占有和等待,不可抢占的存在,这样它与预防死锁的几种方法相比较,限制条件少了,资源利用程度提高了。
银行家算法的缺点:

1.要求客户数保持不变,这在多道程序中难以做到。
2.这个算法保证所有客户在有限的时间内得到满足,但实时客户要求快速响应,所以要考虑这个因素。(分配的时间得不到保证)
3.由于要寻找一个安全序列,实际上增加了系统的开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值