2026/6/20 10:11:46
网站建设
项目流程
flash静态网站,佛山新网站建设机构,山西网站制作平台,郑州seo技术服务死锁的产生原因
竞争资源#xff1a;当多个进程共享系统资源#xff08;如内存、I/O设备、文件等#xff09;#xff0c;而资源数量不足以满足所有进程的需求时#xff0c;进程之间会因争夺资源而陷入等待状态。进程推进顺序非法#xff1a;如果进程在运行过程中请求和释…死锁的产生原因竞争资源当多个进程共享系统资源如内存、I/O设备、文件等而资源数量不足以满足所有进程的需求时进程之间会因争夺资源而陷入等待状态。进程推进顺序非法如果进程在运行过程中请求和释放资源的顺序设计不合理例如先持有部分资源再请求其他资源却长期得不到响应就可能导致死锁。死锁的4个必要条件必须同时满足才会发生死锁互斥条件资源不能被多个进程共享使用某一时刻只能由一个进程独占。请求与保持条件Hold and Wait进程已经保持了至少一个资源但仍请求其他被占用的资源。不可剥夺条件No Preemption已分配给进程的资源在未使用完之前不能被系统强行回收或剥夺。环路等待条件Circular Wait存在一个进程链每个进程都在等待下一个进程所持有的资源形成闭合的环路。死锁的处理策略鸵鸟策略对死锁视而不见认为其发生的概率极低不采取任何措施常见于桌面操作系统或嵌入式系统。预防策略通过破坏上述四个必要条件之一来防止死锁发生破坏“请求保持”采用静态分配法要求进程在运行前一次性申请全部所需资源破坏“不可剥夺”允许系统在必要时强制回收资源破坏“互斥”尽量将资源改为可共享方式但某些资源无法共享如打印机破坏“环路等待”规定资源按线性顺序申请避免循环依赖。避免策略在资源动态分配过程中判断此次分配是否会导致系统进入不安全状态如银行家算法就是典型的死锁避免方法。检测与解除策略使用资源分配图定期检测是否存在环路若检测到死锁则通过终止进程或抢占资源的方式解除死锁。补充说明进程资源有向图是分析死锁的重要工具方框表示资源类圆圈表示进程箭头进程 → 资源表示该进程正在请求该资源箭头资源 → 进程表示该资源已分配给该进程当图中出现环路时说明可能存在死锁对于单类资源环路即意味着死锁多类资源需进一步分析。银行家算法是一种死锁避免算法用于在动态分配资源时判断系统是否处于安全状态即是否存在一个进程执行序列使得所有进程都能顺利完成。其核心思想是在为进程分配资源前先模拟分配检查系统是否仍处于安全状态若安全才真正分配。一、基本数据结构设系统中有n个进程m种资源类型Available[1…m]当前可用的每种资源数量。Max[n][m]每个进程对各类资源的最大需求量。Allocation[n][m]每个进程当前已分配到的各类资源数。Need[n][m] Max - Allocation每个进程还需要的资源数。二、安全性检查算法Safety Algorithm步骤如下初始化Work[1..m] Available工作向量表示当前可分配资源Finish[i] false标记进程是否成功完成寻找满足条件的进程找到一个进程i使得Finish[i] falseNeed[i] ≤ Work该进程所需资源不超过当前可用资源若找到这样的进程假设它能获得所需资源并运行完毕则释放其占用资源Work Work Allocation[i]Finish[i] true回到第2步继续查找若所有进程都满足Finish[i] true则系统处于安全状态否则为不安全状态。✅ 安全序列按Finish成功顺序排列的进程序列称为安全序列。只要存在至少一个安全序列系统就是安全的。三、资源请求处理流程当某个进程提出资源请求时检查请求是否超过其声明的最大需求若Request[i] Need[i]→ 出错非法请求检查系统是否有足够资源若Request[i] Available→ 进程等待试探性分配更新状态Available Available - Request[i] Allocation[i] Allocation[i] Request[i] Need[i] Need[i] - Request[i]调用安全性检查算法判断新状态是否安全。若安全 → 真正分配否则 → 撤销试探性分配让进程等待。四、举例说明假设有3个进程 P0、P1、P22种资源 A 和 B总量为 (10, 7)MaxAllocationNeedP0(7,5)(0,1)(7,4)P1(3,2)(2,0)(1,2)P2(9,5)(3,3)(6,2)Available (3,3)执行安全性检查可行P1: Need(1,2) ≤ (3,3) → 是→ Work Allocation[P1] (3,3)(2,0)(5,3)Finish[P1]trueP2: Need(6,2) ≤ (5,3)? 否 → 跳过P0: Need(7,4) ≤ (5,3)? 否→ 卡住无法完成所有进程 →无安全序列但再试其他顺序或重新计算可能发现某些情况仍可解。实际中需遍历所有未完成进程寻找可行路径。✅ 结论只有当“试探性分配”后仍能找到一个安全序列时才允许资源分配。