当前位置: 首页 > news >正文

**竞争资源**:当多个进程共享系统资源(如内存、I/O设备、文件等),而资源数量不足以满足所有进程的需求时

  1. 死锁的产生原因
  • 竞争资源:当多个进程共享系统资源(如内存、I/O设备、文件等),而资源数量不足以满足所有进程的需求时,进程之间会因争夺资源而陷入等待状态。
  • 进程推进顺序非法:如果进程在运行过程中请求和释放资源的顺序设计不合理,例如先持有部分资源再请求其他资源却长期得不到响应,就可能导致死锁。
  1. 死锁的4个必要条件(必须同时满足才会发生死锁)
  • 互斥条件:资源不能被多个进程共享使用,某一时刻只能由一个进程独占。
  • 请求与保持条件(Hold and Wait):进程已经保持了至少一个资源,但仍请求其他被占用的资源。
  • 不可剥夺条件(No Preemption):已分配给进程的资源,在未使用完之前不能被系统强行回收或剥夺。
  • 环路等待条件(Circular Wait):存在一个进程链,每个进程都在等待下一个进程所持有的资源,形成闭合的环路。
  1. 死锁的处理策略
  • 鸵鸟策略:对死锁视而不见,认为其发生的概率极低,不采取任何措施(常见于桌面操作系统或嵌入式系统)。
  • 预防策略:通过破坏上述四个必要条件之一来防止死锁发生:
    • 破坏“请求保持”:采用静态分配法,要求进程在运行前一次性申请全部所需资源;
    • 破坏“不可剥夺”:允许系统在必要时强制回收资源;
    • 破坏“互斥”:尽量将资源改为可共享方式(但某些资源无法共享,如打印机);
    • 破坏“环路等待”:规定资源按线性顺序申请,避免循环依赖。
  • 避免策略:在资源动态分配过程中,判断此次分配是否会导致系统进入不安全状态,如银行家算法就是典型的死锁避免方法。
  • 检测与解除策略
    • 使用资源分配图定期检测是否存在环路;
    • 若检测到死锁,则通过终止进程或抢占资源的方式解除死锁。

补充说明:
进程资源有向图是分析死锁的重要工具:

  • 方框表示资源类,圆圈表示进程;
  • 箭头进程 → 资源表示该进程正在请求该资源;
  • 箭头资源 → 进程表示该资源已分配给该进程;
  • 当图中出现环路时,说明可能存在死锁(对于单类资源,环路即意味着死锁;多类资源需进一步分析)。
    银行家算法是一种死锁避免算法,用于在动态分配资源时判断系统是否处于安全状态,即是否存在一个进程执行序列,使得所有进程都能顺利完成。其核心思想是:在为进程分配资源前,先模拟分配,检查系统是否仍处于安全状态,若安全才真正分配。

一、基本数据结构

设系统中有n个进程,m种资源类型:

  • Available[1…m]:当前可用的每种资源数量。
  • Max[n][m]:每个进程对各类资源的最大需求量。
  • Allocation[n][m]:每个进程当前已分配到的各类资源数。
  • Need[n][m] = Max - Allocation:每个进程还需要的资源数。

二、安全性检查算法(Safety Algorithm)

步骤如下:

  1. 初始化:

    • Work[1..m] = Available(工作向量,表示当前可分配资源)
    • Finish[i] = false(标记进程是否成功完成)
  2. 寻找满足条件的进程:

    • 找到一个进程i,使得:
      • Finish[i] == false
      • Need[i] ≤ Work(该进程所需资源不超过当前可用资源)
  3. 若找到这样的进程:

    • 假设它能获得所需资源并运行完毕,则释放其占用资源:
      • Work = Work + Allocation[i]
      • Finish[i] = true
    • 回到第2步继续查找
  4. 若所有进程都满足Finish[i] == true,则系统处于安全状态;否则为不安全状态。

✅ 安全序列:按Finish成功顺序排列的进程序列称为安全序列。只要存在至少一个安全序列,系统就是安全的。


三、资源请求处理流程

当某个进程提出资源请求时:

  1. 检查请求是否超过其声明的最大需求:

    • Request[i] > Need[i]→ 出错(非法请求)
  2. 检查系统是否有足够资源:

    • Request[i] > Available→ 进程等待
  3. 试探性分配

    • 更新状态:
      Available = Available - Request[i] Allocation[i] = Allocation[i] + Request[i] Need[i] = Need[i] - Request[i]
  4. 调用安全性检查算法判断新状态是否安全。

  5. 若安全 → 真正分配;
    否则 → 撤销试探性分配,让进程等待。


四、举例说明

假设有3个进程 P0、P1、P2,2种资源 A 和 B,总量为 (10, 7):

MaxAllocationNeed
P0(7,5)(0,1)(7,4)
P1(3,2)(2,0)(1,2)
P2(9,5)(3,3)(6,2)

Available = (3,3)

执行安全性检查:

  1. 可行?P1: Need=(1,2) ≤ (3,3) → 是
    → Work += Allocation[P1] = (3,3)+(2,0)=(5,3),Finish[P1]=true

  2. P2: Need=(6,2) ≤ (5,3)? 否 → 跳过
    P0: Need=(7,4) ≤ (5,3)? 否

→ 卡住,无法完成所有进程 →无安全序列?

但再试其他顺序或重新计算可能发现某些情况仍可解。

实际中需遍历所有未完成进程寻找可行路径。


✅ 结论:只有当“试探性分配”后仍能找到一个安全序列时,才允许资源分配。

http://www.jsqmd.com/news/200848/

相关文章:

  • FastGPT完全部署指南:从零搭建大语言模型知识平台
  • qmlRegisterType 详解
  • 死锁避免与银行家算法的核心在于通过动态检测资源分配后的系统状态是否处于“安全状态”,从而决定是否允许资源分配
  • 1.5.3
  • 5分钟用AI搞定顶刊级引言!掌握三段式结构+避坑要点,让你的Introduction更有说服力(附提示词)
  • 所有权之谜:为什么鲸鱼濒临灭绝,鸡却没有繁衍之忧?
  • 针对Ubuntu 22.04服务器开机黑屏无图形界面的问题,如果 nomodeset 不行,下次可以尝试换成 nvidia-drm.modeset=1【笔记】
  • GEO报告一键生成工具:从数据采集到分析闭环
  • 转行大模型产品经理:5大核心能力+6个月学习路线,月薪30K+不是梦_2026年零基础转行大模型产品经理必备
  • 飞致云 jumpserver安装
  • 学霸同款9个AI论文平台,专科生轻松搞定毕业论文!
  • I知识库实操指南:构建适配 AI 的知识系统
  • Bamtone班通:盲孔显微镜有哪些行业应用?能解决什么问题?
  • Cron-Job:超好用的分布式任务调度平台,低延迟还支持多租户
  • 所有权之谜:为什么没有一流的营利性大学?
  • Git Restore 命令教程
  • Aviator表达式引擎:凭啥子在一堆开源引擎里杀出重围
  • 大模型提示词技巧全解析:释放AI无限潜能
  • RAG搭建个人LLM知识库助手,很多人第一步就走错了...
  • 产品经理必学!掌握大模型技术的5大核心优势,建议收藏_【大模型时代】产品经理为何必须学习大模型?
  • 进阶数据结构-AC自动机 - 详解
  • 2025年,AI技术飞速发展有人观望,有人拥抱,也有人怀疑
  • 数字员工是什么?AI销冠系统在提升销售效能中的主要作用是什么?
  • 【接口测试】4_持续集成 _配置Jenkins系统邮箱
  • 一份转型大模型产品经理指南,如果你想转行做大模型,你需要具备哪些基本素质和技能?
  • 高职学历从事运营的困境与数据分析的价值
  • 收藏必学:大模型智能体设计:5大模式+5层次+3配方,从入门到精通
  • 如何构建企业级「上下文图谱」非常详细收藏我这一篇就够了
  • 多级反馈队列调度算法结合了**时间片轮转(Round Robin)**和**优先级调度(Priority Scheduling)**的优点
  • 收藏必备!LLM智能体开发三大误区:避开这些“思维病毒“,让你的AI应用更稳定可靠