视频字幕
死锁检测是操作系统中的重要机制,用于识别系统是否发生了死锁。当多个进程相互等待对方持有的资源时,就可能形成死锁。系统需要通过检测机制来发现这种状态。
检测时机有两种选择:定期检测是按固定时间间隔进行,而按需检测则在资源请求被拒绝时触发。图中展示了进程和资源的关系,绿色箭头表示已分配的资源,红色箭头表示正在请求的资源。
死锁检测的必要性在于及时发现死锁状态,避免系统资源的浪费,保证系统能够正常运行。通过系统状态图,我们可以清楚地看到进程间的资源依赖关系,这为后续的死锁检测算法提供了基础。
资源分配图是死锁检测的核心工具。它由四种基本元素组成:圆形表示进程节点,方形表示资源节点,从资源指向进程的边表示资源已分配给进程,从进程指向资源的边表示进程正在请求该资源。
现在我们来逐步构建一个资源分配图。首先创建进程节点,用不同颜色的圆形表示四个进程P1到P4。
接下来添加资源节点,用方形表示三类资源R1、R2、R3。每个资源节点代表系统中的一类资源。
然后绘制分配边,用绿色箭头从资源节点指向进程节点,表示该资源已经分配给对应的进程。
最后添加请求边,用红色箭头从进程节点指向资源节点,表示进程正在请求该资源但尚未获得。
完整的资源分配图构建完成。图例说明了各种元素的含义。通过这样的图形表示,我们可以清晰地看到系统中进程和资源的分配关系,为后续的死锁检测算法提供了直观的数据结构基础。
死锁检测算法是判断系统是否存在死锁的核心方法。算法首先初始化可用资源向量,然后逐步寻找能够完成的进程,释放其占用的资源,直到无法继续为止。
现在我们通过一个具体实例来演示算法执行过程。初始状态下,系统有可用资源2、1、0,四个进程都标记为未完成状态。
第一步:检查进程P3,其请求资源为0、0、1,小于等于当前可用资源2、1、0,因此P3可以完成。标记P3为已完成,可用资源保持不变。
第二步:检查进程P4,其请求资源为1、0、0,满足条件可以执行。P4完成后释放资源0、1、0,可用资源更新为2、2、0。
第三步:检查进程P1,其请求资源为0、1、0,满足条件。P1完成后释放资源1、0、1,可用资源更新为3、2、1。
最后检查进程P2,其请求资源为1、0、1,但当前可用资源为3、2、1,第三个资源不足。P2无法完成,算法结束。由于存在未完成的进程P2,系统检测到死锁。
当检测到死锁后,系统需要采取措施解除死锁。主要有四种策略:进程终止、资源抢占、进程回滚和系统重启。每种策略都有其优缺点和适用场景。
策略一是进程终止。可以选择终止所有死锁进程,或者逐个终止直到死锁解除。这里我们选择终止进程P2,释放其占用的资源,打破死锁循环。
策略二是资源抢占。选择一个受害者进程,强制收回其占用的资源。这里选择P2作为受害者,抢占其资源R2,然后让P2回滚到安全状态重新执行。
策略三是进程回滚。将部分进程回滚到之前保存的检查点状态,释放在检查点之后获得的资源,从而打破死锁。这种方法需要系统支持检查点机制。
策略四是系统重启,这是最极端的方法。清除所有进程状态,重新开始执行。虽然能够彻底解决死锁,但会丢失所有工作,通常作为最后手段使用。
现在我们通过一个完整的实例来演示死锁检测和解除的全过程。系统有3个进程和3类资源,当前的分配和请求状态已经形成了死锁。
第一步:构建资源分配图。绿色箭头表示已分配的资源,红色箭头表示进程的资源请求。可以看到P1占用R1和R3,P2占用R2,P3占用R1和R3。
第二步:执行死锁检测算法。初始可用资源为0、0、0,检查每个进程是否能够完成。由于所有资源都已分配,没有进程能够满足其请求。
第三步:发现死锁。算法检测到所有进程都无法完成,形成了循环等待。红色高亮显示了死锁循环:P1等待R2,P2等待R1,形成环路。
第四步:选择解除策略。我们选择进程终止策略,并选择P2作为被终止的进程。红色圆圈标记了受害者进程。
第五步:执行解除操作。终止进程P2,释放其占用的R2资源。现在可用资源变为0、1、0,打破了死锁循环。
第六步:验证结果。死锁已成功解除,P1可以获得R2资源继续执行,P3也能正常运行。系统恢复到正常状态,完成了整个死锁检测和解除的流程。