Loading...

文章背景图

死锁

2025-12-19
20
-
- 分钟
|

概念

死锁是指在两个或两个以上的进程(或线程)中,每个进程都因等待被其他进程占用的资源而无限期阻塞的一种僵持状态。此时,若无外力干预,这些进程都将无法向前推进。

死锁产生的四个必要条件

互斥条件:资源是独占的,一次只能被一个进程使用。

请求和保持条件:进程在持有至少一个资源的同时,又请求获取新的资源(且该新资源正被其他进程持有)。

不可剥夺条件:进程已获得的资源在未使用完之前,不能被其他进程强行剥夺,只能由该进程主动释放。

循环等待条件:存在一个进程-资源的循环等待链,即 P1 等待 P2 占用的资源,P2 等待 P3 占用的资源,……,Pn 又等待 P1 占用的资源。

死锁的处理策略

预防死锁

核心思想

破坏死锁产生的四个必要条件中的其中之一

破坏“互斥条件”

方法:将独占资源改造成可共享资源(如只读文件)。

评价:对很多物理资源(如打印机)无法实现,实用性有限。

破坏“请求和保持条件”

方法:采用 “一次性申请” 策略。进程在运行前,必须一次性申请其所需的所有资源。若无法全部满足,则进程等待。

缺点:资源利用率极低,可能导致饥饿;很多进程在运行时才明确所需资源。

破坏“不可剥夺条件”

方法:当一个进程请求新资源得不到满足时,必须释放其已持有的所有资源,待以后需要时再重新申请。

缺点:实施复杂,代价高。适用于资源状态易于保存和恢复的资源(如CPU、内存),不适用于打印机等。

破坏“循环等待条件”

方法:采用 “资源有序分配法” 。给所有资源类型赋予一个全局的线性顺序,进程必须严格按照递增顺序申请资源。

优点:这是最常用且实用的预防方法,破坏了循环等待链。

缺点:限制了资源申请的灵活性;资源的排序可能影响效率。

避免死锁

核心思想

在资源动态分配的过程中,系统根据预先掌握的信息(如进程最大资源需求量),通过算法预测分配是否会导致系统进入不安全状态,从而决定是否立即分配。

概念

安全状态:存在一个安全序列,使得系统能按此顺序为每个进程分配其所需资源并运行完毕,不会发生死锁。

不安全状态:非死锁状态,但可能因不当分配而进入死锁。

典型算法:银行家算法

进程需事先声明其最大资源需求。

当进程请求资源时,系统模拟分配,并检查分配后系统是否仍处于安全状态。

仅当结果是安全时,才进行实际分配;否则让进程等待。

检测和解除

核心思想

系统不主动预防或避免死锁,而是定期或按需运行检测算法。一旦发现死锁,则采取强制措施打破它。

死锁检测

方法:使用资源分配图或其变种(如等待图)的简化算法来检测是否存在循环等待。

频率:取决于死锁可能发生的频率和影响。

死锁恢复

方法一:进程终止

终止所有死锁进程:简单粗暴,代价大。

逐个终止进程:每终止一个,就检测死锁是否解除,直到消除。需要选择“代价最小”的进程(如已运行时间短、剩余时间长、持有资源少等)。

方法二:资源剥夺

从某些死锁进程那里强制剥夺资源给其他进程用。

问题:需要解决“选哪个进程”、“剥夺哪些资源”、以及“被剥夺进程如何回滚和重启”等问题,实现复杂。

评论交流

文章目录