[操作系统] 死锁

什么是死锁?

​ 各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进

死锁、饥饿、死循环的区别

  • 死锁:至少是两个进程一起死锁,死锁进程处于阻塞态
  • 饥饿:可以只有一个进程饥饿、饥饿进程可能阻塞也可能就绪,例如短进程优先调度算法
  • 死循环:可能只有一个进程发生死循环,死循环的进程可上处理机,死循环一般是由程序bug导致的
  • 死锁和饥饿是OS要解决的问题,死循环是应用程序员要解决的问题

死锁产生的四个必要条件

互斥条件

  • 对必须互斥使用的资源的抢夺才会导致死锁

不剥夺条件

  • 进程保持的资源只能主动释放,不可强行剥夺

请求和保持条件

  • 保持着某些资源不放的同时,请求别的资源

循环等待条件

  • 存在一种进程资源的循环等待
  • 循环等待未必死锁,当不在循环内的进程释放了一些资源后,即可能解除循环等待现象。死锁一定有循环等待

什么时候会发生死锁?

​ 对不可剥夺资源的不合理分配(数量和顺序),可能导致死锁

死锁的处理策略

不允许死锁发生

静态策略:预防死锁

破坏互斥条件
  • 将临界资源改造为可共享使用的资源(如SPOOLing技术)
  • 缺点:可行性不搞,很多时候无法破坏互斥条件
破坏不可剥夺条件
  • 方案一:申请资源得不到满足时,立即释放拥有的所有资源
  • 方案二:申请的资源被其他进程占用时,由操作系统协助剥夺(考虑优先级)
  • 缺点:实现复杂;剥夺资源可能导致部分工作实效;反复申请和释放导致系统开销大;可能导致饥饿;
破坏请求和保持条件
  • 运行前分配好所有需要的资源,之后一直保持
  • 缺点:资源利用率低;可能导致饥饿
破坏循环等待条件
  • 给资源编号,必须按编号从小到大顺序申请资源
  • 缺点:不方便增加新设备;会导致资源浪费;用户编程麻烦

动态策略:避免死锁

什么是安全状态?

  • 系统能按某种顺序(如<P1,P2,…,Pn>)来为每个进程分配其所需的资源,使每个进程都可顺利完成,则称此时系统处于安全状态。
    在这里插入图片描述

什么是安全序列?

  • 可使所有进程顺利执行的序列<P1,P2,…,Pn>称为安全序列

什么是不安全状态?

  • 若不存在安全序列,则称系统处于不安全状态
  • 安全序列、安全状态、不安全状态、死锁之间的联系
  • 银行家算法—避免系统进入不安全状态

允许死锁发生

死锁的检测

数据结构:资源分配图

在这里插入图片描述

两种结点
  • 进程结点
  • 资源结点
两种边
  • 进程结点->资源结点:请求边
  • 资源结点->进程结点:分配边

死锁检测算法

  • 依次消除与不阻塞进程相连的边,直到无边可消
  • 注:所谓不阻塞进程是指其申请的资源数还不够的进程
  • 死锁定理:若资源分配图是不可完全简化的,即不能消除所有边,就说明发生了死锁

死锁的解除

不采用预防死锁和避免死锁的措施就可能导致死锁

  • 资源剥夺法:OS挂起死锁进程,暂时放到外存上,并释放资源

  • 撤销进程法(终止进程法):OS强制撤销部分或全部进程

  • 进程回退法:让一个或多个进程回退到可以避免死锁的安全状态

    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43216714/article/details/124483514
今日推荐