死锁相关内容

死锁是指两个或多个线程互相等待对方持有的资源而形成的一种僵局。产生条件包括互斥条件、请求和保持条件、不可剥夺条件和环路等待条件。预防死锁的方法有破坏这四个条件,银行家算法是一种避免死锁的策略,通过模拟分配资源来确保系统安全。当死锁发生时,可以通过资源剥夺、撤销进程或进程回退等方式解除。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

死锁

什么是死锁?

由于两个或以上的线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法执行

死锁产生的原因:
  1. 系统资源不足
  2. 进程运行推进顺序不合理
  3. 资源分配不当

如果系统资源充足,进程的资源请求都能得到满足,死锁出现的可能性很低,否则就会因为竞争有限资源进入死锁,其次进程运行的推进顺序和速度不同,也可能产生死锁

  • 竞争不可抢占性资源
线程P1P2
拥有资源F1F2
need(需求资源)F2F1

死锁产生条件?

互斥条件:某一时间段一个线程持有资源会一直持有直到使用完释放

请求和保持条件:当进程请求资源的时候不会对已有资源进行释放

不可剥夺条件:进程已经持有的资源,在使用完之前,不可以被其他线程剥夺,直到使用完自己释放

环路等待条件:发生死锁时一定存在进程相互请求并等待对方持有的资源

死锁的预防

破坏请求条件:一次性分配需要的资源,减少请求

破坏保持条件:如果现有资源无法满足进程,就不给这个进程分配任何资源,防止资源的无效持有

破坏不可剥夺条件:将获得一部分资源但是无法获取所需全部资源的进行进行资源的释放

破坏环路等待条件:将资源进行编号,进程申请资源的时候编号(升序)取出,释放时(降序)释放

死锁的避免

银行家算法
进程名
状态(R\W\E)
资源需求总量(max)
已占有资源(allocation)
能执行完标志(1\0)

银行家算法分配原则是:当某个进程提出资源请求时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统的剩余资源量是否由于进程的分配而导致系统死锁。若是,则让该进程等待;否则,为该进程分配所需资源。

简而言之就是对资源进行模拟分配,查看是否会造成死锁

进程allocationneedavaiable(可获取的资源)p完成后系统可用资源执行顺序
p1(0,0,3,2)(0,0,1,2)(1,6,2,2)(1,6,5,4)
p2(1,0,0,0)(1,7,5,0)(1,9,8,6)(2,9,8,6)
p3(1,3,5,4)(2,3,5,6)(2,9,8,6)(3,12,13,10)
p4(0,3,3,2)(0,6,5,2)(1,6,5,4)(1,9,8,6)
p5(0,0,1,4)(0,6,5,6)(3,12,13,10)(3,12,14,14)

()表示元组是不同种类的资源

死锁的检测

  1. 每个进程指定唯一编号
  2. 设定一张资源分配表,记录各进程与资源之间的关系
  3. 设定一张资源等待表,记录各进程与要申请资源之间的关系
资源分配表:
资源进程
r1p2
r2p5
r3p4
r4p1
进程等待表:
资源进程
r1p1
r3p2
r4p4

p1-r1-p2-r3-p4-r4-p1 出现环路引起死锁

死锁的解除

资源剥夺:将某些死锁进程挂起,将挂起进程分配给其他死锁进程,等到资源充足给将挂起进程分配足够的资源防止长时间挂起

撤销进程:强制撤销部分、全部死锁进程,并剥夺这些进程的资源(优先撤销优先级低的,和撤销进程造成的代价小的)

进程回退:要求系统保持进程的历史信息,设置快照(还原点)通过回退,使资源自愿(不是剥夺)放弃资源,回退到拥有足够避免死锁的时候

参考文档:

https://www.cnblogs.com/JimmyFanHome/p/9914562.html
https://zhuanlan.zhihu.com/p/25677118

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值