避免死锁

#策略特点


  • 动态策略:避免死锁
  • 弄清三个问题:
  • 什么是安全序列
  • 什么是系统的不安全状态,与死锁有何联系
  • 如何避免系统进入不安全状态?银行家算法
  • #安全序列

  • 举个例子
  • 我手上有100亿,A最多借走40亿,B最多借走70亿,T最多借走50亿
  • 如果100亿被三人全部借走,且没有人达到最多需求,则100亿全部打水漂
  • 故而,需要考虑借钱的顺序
  • Pasted image 20260707194221.png
  • 如上图所示,尚若如第一图借钱的话必然会导致钱打水漂
  • 当借钱的顺序存在不打水漂的情况下,则称该顺序为安全序列
  • 用作系统上的资源分配,则这样解释
  • 安全序列,就是如果系统按照这种序列分配资源,则每个进程都能顺利完成。
  • 只要找出一个安全序列,系统就是安全状态
  • 安全序列存在多个
  • 反之,分配资源后,系统找不到一个安全序列,则称系统处于不安全状态
  • 这意味着可能所有的进程都无法顺利执行下去
  • 当然,如果有进程提前归还了资源,系统也可能重新回到安全状态
  • 系统处于安全状态就一定不会发生死锁
  • 反之,则可能发生死锁
  • 因此可以在资源分配之前预先怕段这次分配是否导致系统进入不安全状态,依此决定是否答应资源分配请求。
  • 这便是*银行家算法*的核心思想
  • #安全性算法


  • 就是得到安全序列的算法,其思想就是上面的分钱思想
  • 无非是把人换成进程,钱换成系统内的资源
  • 流程步骤:
  • 检查当前剩余的可用资源是否能满足某个进程的最大需求
  • 可以就把该进程加入安全序列,并把该进程持有的资源全部回收
  • 不断重复上述过程,看最终是否能让所有进程都加入安全序列
  • #银行家算法


  • 如果有n个进程,m种资源,则可以设置一个**n\*m的矩阵来表示所有进程对各种资源的最大需求数,简称为Max**
  • Max\[i,j]=k表示为,Pi进程最多需要k个Rj资源,就是二维数组里对应坐标的数字
  • 同理,使用**n\*m的分配矩阵Allocation表示对所有进程的资源分配状况**
  • Max-Allocation=Need矩阵,表示各个进程还需要多少各类资源
  • 另外使用长度为m的一维数组Available来表示当前系统中还有多少可用资源
  • 进程向系统申请资源,可用长度为m的一维数组Request表示本次申请的各种资源量
  • ok,总结下出现的数组
  • Max二维数组,所有进程最大需求
  • Allocation二维数组,已经分配资源量
  • Need二维数组,每个进程还需要的资源量
  • Available一维数组,当前系统还有多少可用资源
  • Request一维数组,进程向系统申请的资源量
  • Pasted image 20260707201305.png
  • #银行家算法流程

  • 1.进程提供的Request<=Need,转向2,否则认为出错
  • 2.进程提供的Request<=Available,转向3,否则表示无足够资源,该进程等待
  • 3.系统尝试给该进程分配资源,并修改相应数据(并非真的分配,修改数值只是为了做预测
  • 4.操作系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态,安全则分配,否则让该进程阻塞