Linux:带你理解死锁(银行家算法详解)


死锁概念:

多个执行流对锁资源争抢访问,但是因为访问推进顺序不当,造成互相等待最终导致程序流程无法继续推进,这时候就造成了死锁
死锁实际是一种程序流程无法继续推进,卡在某个位置的一种概念

死锁的产生通常是在访问多个锁的时候需要注意的事项

死锁产生的必要条件:
  1. 互斥条件:我加了锁,别人就不能再继续加锁
  2. 不可剥夺条件:我家的锁,别人不能解,只有我能解锁
  3. 请求与保持条件:我加了A锁,然后去请求B锁;如果不能对B锁加锁,则也不释放A锁
  4. 环路等待条件:我加了A锁,然后去请求B锁;另外一个人加了B锁,然后去请求A锁
死锁的预防

破坏死锁产生的必要条件(主要避免3和4两个条件的产生)

死锁的避免
  • 死锁检测算法
  • 银行家算法

银行家算法的思路:系统的安全状态/非安全状态

每一个线程进入系统时,它必须声明在运行过程中,所需的每种资源类型最大数目,其数目不应超过系统所拥有每种资源总量,当线程请求一组资源系统必须确定有足够资源分配给该进程。
若有再进一步计算这些资源分配给进程后,是否会使系统处于不安全状态?

  • 如果有可能就不能分配(等待)
  • 如果不会(即若能在分配资源时找到一个安全序列),系统是安全的,则分配这个锁

后续若不能分配锁,可以资源回溯,把当前执行流中已经加的锁释放掉 - 破坏请求与保持
非阻塞加锁操作,若不能加锁,则把手上的其他的锁也释放掉 - 破坏请求与保持

加锁对临界资源进行保护,实际上对程序的性能是一个极大的挑战!
在高性能程序中通常会讲究一种无锁编程 - CAS锁(乐观锁) / 一对一的阻塞队列 / atomic 原子操作

具体介绍:

假定系统中有五个线程{P0,P1,P2,P3,P4}和三类资源{A,B,C},各类资源数量分别为10,5,7,在T0时刻分配资源情况如图:

  • Max: 表示线程对每类资源的最大需求量;
  • Allocation: 表示系统给线程已分配每类资源的数目;
  • Need:表示线程还需各类资源数目;
  • Available:表示系统当前剩下的资源。

在这里插入图片描述

从初始找出安全序列:

  1. 首先系统剩下资源{3,3,2},查表可满足5个进程Need的进程有:P1(1,2,2)、P3(0,1,1),先给P1分配;
  2. P1分配以后执行完释放其所占资源后系统此时剩下资源有:Allocation+{3,3,2}={5,3,2};
  3. 根据系统剩下资源查表可满足剩下4个进程Need的进程有P3{0,1,1}、P4{4,3,1},再给P3分配;
  4. P3分配以后执行完释放其所占资源后系统此时剩下资源有:Allocation+{5,3,2}={7,4,3};
  5. 根据系统剩下资源查表可满足剩下3个进程Need的进程有P0{7,4,3}、P2{6,0,0}、P4{4,3,1},再给P4分配;
  6. P4分配以后执行完释放其所占资源后系统此时剩下资源有:Allocation+{7,4,3}={7,4,5};
  7. 根据系统剩下资源查表可满足剩下2个进程Need的进程有P0{7,4,3}、P2{6,0,0},再给P2分配;
  8. P2分配以后执行完释放其所占资源后系统此时剩下资源有:Allocation+{7,4,5}={10,4,7};
  9. 根据系统剩下资源查表可满足剩下1个进程Need的进程有P0{7,4,3},最后给P0分配;
  10. P0分配以后执行完释放其所占资源后系统此时剩下资源有:Allocation+{10,4,7}={10,5,7};
  11. 所有进程按此序列{P1,P3,P4,P2,P0}可安全执行完毕,最后系统资源全部释放。(由以上也可知安全序列不唯一,但只要找出一个安全序列,则说明此系统是安全的(找到安全序列可按此序列真正执行进程推进顺序,若没找到,则恢复初始状态,其并没有真正给进程分配资源,只是提前避免))

由表表示:

  • work:表示系统当前剩下的资源数;

在这里插入图片描述

个人觉得:死锁检测算法和银行家算法大同小异。。。

银行家算法强调的是运行的安全状态和非安全状态,只是安全状态的检测和死锁检测算法比较类似(安全状态前提要求就是不能出现死锁)

知识点习题

  1. 下列选项中,有关死锁说法正确的是()

A. 采用"按序分配"策略可以破坏产生死锁的环路等待条件
B. 银行家算法是最有代表性的死锁解除算法
C. 在资源的动态分配过程中,防止系统进入安全状态,可避免发生死锁
D. 产生死锁的现象是每个进程等待着某一个不能得到且不可释放的资源

正确答案: A、D

答案解析:

  • 银行家算法是避免死锁;

  • 在资源的动态分配过程中,防止系统进入不安全状态,可避免发生死锁。(系统处于安全状态一定不会发生死锁;系统发生死锁,一定处于非安全状态。)

  1. “一个对象一次只能被一个事务使用”是发生死锁的哪个条件( )

A. 部分分配条件
B. 互斥条件
C. 独占条件
D. 不可抢占条件

正确答案: C

答案解析:

产生死锁的四个必要条件:

(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不可剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值