[操作系统概念]第五部分——死锁

死锁

概念解释:计算机存在若干种资源,一任务可能需要若干个资源才能执行完成。如果几个进程都仅仅保持获得一部分资源,但都没有获得执行完成所需的所有资源,它们都在等待其他进程释放自己所需的资源,那么没有任何一个进程可以前进、执行完成,这种僵局叫做死锁。

死锁的必要条件(特征):都满足时才会出现死锁

  1. 互斥:一个资源只可以被独享
  2. 占有并等待:进程占有一个资源不释放,并且等待其他资源
  3. 非抢占:资源不能被抢占,只能等待任务完成被释放
  4. 循环等待:有一组进程(P0,P1,P2……Pn),p0等待的资源被P1占有,P1等待的资源被P2占有……Pn等待的资源被P0占有

系统资源分配图:可以描述死锁问题

资源分配图中由一组表示进程的点,一组表示资源的点,以及一组表示请求资源的有向边(申请边),一组表示正在占有资源的有向边(分配边)表示,其中,同一种资源的若干个点用矩形括起来,申请边仅仅指向矩形,而分配边则从矩形中的资源点出发,指向表示进程的点。
资源分配图
资源分配图中如果没有环,则一定没有死锁,如果有环,则 可能 有死锁;如果每种资源只有一个实例,则有环一定死锁。

死锁解决的几种办法

死锁预防:思路是让死锁的必要条件不成立,缺点是低设备利用率和系统吞吐量

  1. 解决占有并等待:
    方法一:进程申请资源时,只有所有资源都可用时才能分配给进程
    方法二:进程申请资源时,可以允许有些资源不可用,在进程执行中需要使用其他资源时,要释放目前拥有的所有资源。
    上述两种方法也有缺点:第一是会导致资源利用率低,分配了的资源可能长时间不会使用;第二是可能会发生饥饿,如果一个进程需要很多资源,进程可能一直等不到导致饿死。

  2. 解决非抢占:
    当一个进程申请其他资源而等待时,当前它说拥有的资源可以被其他进程抢占。这种方法通常应用于状态可以保存的资源,比如CPU,寄存器和内存,而不适用于其他资源,比如打印机和 硬盘驱动器。

  3. 解决循环等待
    可以给所有资源类型一个权值,几个进程如果要申请资源,一定要按资源权重的升序序列申请,同时,同种资源的多个实例必须一起申请。

死锁避免:另一种死锁解决的方式

  • 安全序列:定义一种为每种进程分配资源的顺序,这种顺序不会导致死锁,这种顺序称为安全序列。需要注意的的是,并不是所有非安全序列都会导致死锁,只是可能而已。

    1. 资源分配图算法:在资源分配图的基础上,增加用虚线表示的需求边(表示进程在执行的某个时候会需要资源),如果这样的资源分配图中存在环的话,则进程处于非安全序列。

    2. 银行家算法:一种在进程运行之前需要知道所有需要的资源的算法,效率比资源分配图算法低。
      假设有n个进程,计算机有m个资源,那么有两个m*n的矩阵:Need,表示当前n个进程还需要m个资源的多少个实例 ;Allocation,表示当前n个进程已经申请了m个资源的多少个实例,一个m长度的数组:Available,表示当前系统还剩m个资源的多少个实例。一般还会有一个m*n的矩阵Max,表示系统m个资源一共有多少个实例。
      实际计算时,通过比较当前时刻所有进程的Need矩阵的每一行和Available数组(要求Available数组每一项都大于等于Need矩阵的一行的每一项),求出当前系统的剩余资源可以供哪一个进程执行完成(比如进程i,n>i>=0),这时Available数组中相应的资源减去Need矩阵的第i行,这是资源分配给进程i后的系统所有剩余资源,而Allocation矩阵的第i行相应增加Need矩阵第i行的资源数量,当这个进程执行完成后,它将会归还系统Allocation矩阵中i行的所有资源到Available数组中,此时再次比较Need矩阵和Available数据,求出下一个可以执行的进程。这样求出的所有n的进程的执行顺序,就是不会导致死锁的安全序列。
      银行家算法
      在上图的例子中,进程数量n=5,系统资源m=3(分别是A,B,C),运用银行家算法,可以看出,第一个满足运行条件的(Available数组表示的资源可以满足Need矩阵表示的当前所需资源)进程是P1,当P1执行完,将Allocation矩阵的P1行归还给Available下,第二个满足条件的进程是P3,以此类推,得出进程的执行顺序:P1,P3,P4,P0,P2.

死锁检测:如果发生了死锁,系统需要能检测出来

  • 如果系统的每一种资源只有一个实例:
    将资源费配图的资源删去,合并适当的边,会得到一个只有进程和箭头的图——等待图。当且仅当等待图中有一个环,系统存在死锁。
  • 如果系统中每一个资源不止一个实例:
    运行银行家算法,如果不能排列出进程执行序列,则发生了死锁。

死锁恢复:检测出系统出现死锁之后,就要处理,将死锁消除掉

死锁恢复的方法大体上有两种:

  1. 进程终止:一次性终止所有进程或者一个个地终止进程直到死锁解除。这里需要注意的问题是如果是一个个地终止进程,如何选择首先被终止的进程,需要考虑进程优先级,进程的已经进行的计算量,进程的类型等
  2. 资源抢占:允许系统资源被抢占,发生死锁时,进程抢占资源直到死锁解除。这里需要注意的问题是如何选择牺牲的进程(这个进程的资源被其他进程抢占),以及被牺牲的进程需要回滚操作,以便重启。另外,如果一个进程经常被选为牺牲品,进而被饿死是不行的,所以一般选择牺牲品时,需要把进程回滚的次数考虑在内。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值