操作系统——死锁

死锁发生的条件:

  • 互斥条件:资源是竞争性的,有多个线程需要这个资源。
  • 不可剥夺条件:只能靠线程主动释放资源,不能强行剥夺。
    请求和保持条件:线程占用某些资源的同时,还请求其他资源。
  • 循环等待条件:进程A需要的资源掌握在进程B手中,进程B需要的资源掌握在进程A手中。如果资源数大于1,这就是不充分条件,资源数为1就是充分必要条件。

死锁发生的场景:

  • 争夺不可剥夺的系统资源,如打印机
  • 请求和释放资源的顺序不当,如进程A占用资源1,进程B占有资源2,紧接着线程A申请资源2,进程B申请资源1。
  • 信号量使用不当

死锁的解决办法

静态策略:预防死锁,破坏必要条件:

  • 破坏互斥条件:把资源改造成可以共享的。缺点是不太现实
  • 破坏不可剥夺条件:一旦线程申请不到所需的资源,立即释放全部资源,或让系统协助剥夺其他进程的资源。缺点:容易导致线程运行出问题;增加线程切换的频率,开销大;可能导致饥饿。
  • 破坏请求保持条件:一次性申请所需的全部资源,否则不让进程进入运行态。缺点:资源利用率低;可能导致饥饿。
  • 破坏循环等待条件:给资源编号,必须按从小到大的顺序使用资源,申请到大编号资源的进程不可再申请编号小的资源。缺点:实现复杂;浪费资源

动态策略

避免死锁发生,使用银行家算法。由Dijkstra提出来,一开始用于银行贷款,后来用于避免操作系统死锁。安全序列是指按这个序列分配资源,所有进程都可以顺利执行。如果系统中可以找出至少1个安全序列,那么系统就处于安全状态,否则处于

举例:
在这里插入图片描述

银行家总共由100亿,已经借走60亿,现在还剩40亿。如果B找银行家借30亿,银行家还是处于安全状态,因为剩下20亿还可以满足T的最大要求,接下来有两个安全序列:T-A-B和T-B-A。如果B找银行家借40亿,银行家如果借钱的话就处于不安全状态,因为只剩下10亿,无法满足任何客户的最大贷款要求。

银行家算法步骤:
每个进程声明最大需求数
检查此次申请是否超过之前声明的需求数
检查剩余资源能否满足需求
试探着分配,更改数据结构。
使用安全性算法检测此次分配是否会让系统进入不安全状态。

安全性算法步骤

  • 如果剩余资源能满足进程的最大需求数,就把进程加入安全序列。
  • 如果所有进程都可以加入安全序列,说明可以批准此次申请。

事先编写好方法,能在使用过程中检测死锁并解锁死锁。
保持请求和资源信息的数据结构—资源分配图:分配边和请求边,资源节点(矩形)和进程节点。依次消除不孤立且不阻塞的进程节点的边,即有边存在,而且请求边连接的资源节点存在空闲资源。如果没有发生死锁,所有的边都会消除,否则就是发生死锁,连接这些边的进程就是发生了死锁。
在这里插入图片描述

处理死锁的办法:

  • 资源剥夺法:挂起死锁进程,释放进程的资源。注意避免挂起的进程饥饿。
  • 终止进程法:强制终止部分甚至全部死锁进程,剥夺其占用的资源。优点是比较简单,但代价较大。
  • 进程回退法:让一个或多个死锁进程回退到能避免死锁的状态,需要系统记录进程的历史信息,设置还原点。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值