是操作系统进程管理中的一种严重问题,指多个进程在执行过程中因争夺有限资源而造成的一种**互相等待、无法继续推进**的僵局状态)
死锁Deadlock是操作系统进程管理中的一种严重问题指多个进程在执行过程中因争夺有限资源而造成的一种互相等待、无法继续推进的僵局状态。若无外力干预如操作系统介入这些进程将永远阻塞。死锁产生的四个必要条件Coffman条件互斥条件Mutual Exclusion资源不能被多个进程同时共享必须互斥使用如打印机、临界区。占有并等待Hold and Wait进程已持有至少一个资源又申请新的资源但该资源被其他进程占用于是等待但不释放已占有的资源。非抢占条件No Preemption已分配给进程的资源不能被系统强行收回只能由进程主动释放。循环等待Circular Wait存在一个进程等待环即 P₀ 等待 P₁ 占有的资源P₁ 等待 P₂ 占有的资源……Pₙ 等待 P₀ 占有的资源。✅ 四个条件同时成立时死锁必然发生只要破坏其中任一条件即可预防死锁。死锁处理策略策略说明典型方法预防Prevention通过设计确保至少一个必要条件不成立资源一次性分配破坏“占有并等待”、可剥夺资源破坏“非抢占”、资源有序分配破坏“循环等待”避免Avoidance动态检查资源分配状态确保系统始终处于安全状态银行家算法Banker’s Algorithm——需预先知道最大资源需求检测与恢复Detection Recovery允许死锁发生定期检测并采取措施恢复资源分配图/等待图检测 终止进程或资源剥夺忽略Ignorance不做任何处理简单粗暴适用于死锁极罕见场景如早期Unix、Windows用户级应用中常见示例经典“哲学家进餐”问题5位哲学家围坐圆桌每人左右各有一根筷子共5根。进餐需同时拿到左右两根筷子。若所有哲学家同时拿起左边筷子则全部等待右边筷子 → 形成循环等待 → 死锁。✅ 解法示例规定奇数号哲学家先拿左筷、偶数号先拿右筷打破循环等待最多允许4人同时尝试进餐限制并发数引入“服务员”仲裁者统一发放筷子。# 简化版银行家算法核心逻辑伪代码示意defis_safe_state(available,max_need,allocation):workavailable.copy()finish[False]*len(allocation)safe_seq[]whileFalseinfinish:foundFalseforiinrange(len(allocation)):ifnotfinish[i]andall(max_need[i][j]-allocation[i][j]work[j]forjinrange(len(work))):# 可满足该进程需求work[work[j]allocation[i][j]forjinrange(len(work))]finish[i]Truesafe_seq.append(i)foundTruebreakifnotfound:returnFalse,[]returnTrue,safe_seq在银行家算法中✅安全状态Safe State是指系统当前的资源分配状态下存在至少一个进程执行序列即安全序列使得所有进程都能按某种顺序依次获得所需资源并顺利完成即每个进程的最大需求都能被满足且无需无限等待。→ 本质存在一种“无风险”的资源调度路径系统有能力避免死锁。❌不安全状态Unsafe State是指不存在任何安全序列——即无论按何种顺序尝试为进程分配剩余可用资源都至少存在一个进程无法获得其最大需求从而可能永远阻塞。→ 本质系统已进入潜在风险区虽尚未死锁但后续任意资源请求都可能触发死锁它描述的是缺乏可验证的、全局可行的完成保障而非当前已有进程阻塞。关键澄清不安全状态 ≠ 死锁已发生不安全状态是死锁的必要但不充分条件所有死锁状态必然是不安全状态但不安全状态不一定导致死锁——是否真正死锁取决于后续进程的实际请求行为。✅ 举例系统处于不安全状态但若后续所有进程只申请极少资源、或主动释放资源、或根本不再请求新资源则仍可全部完成。❌ 反之一旦进入不安全状态又恰好按最坏顺序发出请求如每个进程都紧随其后申请其最大剩余需求就极可能陷入死锁。 类比理解安全状态 ≈ 飞机燃油足够飞抵任一备降机场有确定性保障不安全状态 ≈ 燃油仅够飞向主机场但若主机场关闭即某进程“卡住”不释放资源则无其他选择——不是已坠毁但已失去容错余地。⚠️ 注意银行家算法只允许系统从安全状态转移到另一个安全状态。当进程提出资源请求时算法会先“试探性分配”再运行安全性检查仅当结果仍为安全状态才真正分配否则拒绝请求或让进程等待。