视频字幕
死锁避免是操作系统中一种重要的死锁处理策略。与死锁预防的静态限制不同,死锁避免采用动态策略,在每次资源分配前都会检查系统的安全性。系统通过安全性检查器来预测资源分配后的状态,只有确保系统仍处于安全状态时,才会批准资源请求。这种方法既避免了死锁的发生,又最大化了系统的资源利用率。
安全状态是死锁避免算法的核心概念。如果系统存在一个进程执行序列,使得每个进程都能按顺序获得所需资源并完成执行,那么系统就处于安全状态。在这个例子中,我们有三个进程P0、P1、P2和可用资源3、3、2。通过分析可以找到安全序列P1、P0、P2。首先P1完成释放资源,然后P0完成,最后P2完成。需要注意的是,安全状态不等于无死锁状态,不安全状态也不等于死锁状态,但不安全状态可能导致死锁的发生。
银行家算法是由荷兰计算机科学家迪杰斯特拉提出的死锁避免算法。算法的思想来源于银行家放贷的策略:银行家在放贷前必须确保能够收回所有贷款,避免银行破产。算法使用四个关键的数据结构:Available向量记录每种资源的可用数量;Max矩阵记录每个进程对各种资源的最大需求量;Allocation矩阵记录当前已分配给各进程的资源数量;Need矩阵记录各进程还需要的资源数量。其中Need矩阵通过Max减去Allocation计算得出,这个关系式是算法的基础。
安全性检查算法是银行家算法的核心部分,用于判断系统当前状态是否安全。算法分为五个步骤:首先初始化工作向量Work等于Available;然后查找满足条件的进程,即未完成且需求不超过当前可用资源的进程;接着模拟该进程完成执行,将其占用的资源释放到Work向量中,并标记该进程为已完成;重复这个过程直到找不到满足条件的进程;最后检查是否所有进程都已完成。在这个例子中,我们可以按照P1、P0、P2的顺序找到安全序列,证明系统处于安全状态。
资源请求算法是银行家算法处理进程资源请求的完整流程。当进程P1请求资源(1,0,2)时,算法首先检查请求的合法性:请求量不能超过进程的最大需求,也不能超过系统的可用资源。检查通过后,系统进行试探性分配,临时更新Available、Allocation和Need矩阵。接下来执行安全性检查,验证分配后系统是否仍处于安全状态。在这个例子中,分配后系统仍能找到安全序列P1、P0、P2,因此算法批准这个资源请求。如果安全性检查失败,系统会撤销试探性分配,拒绝该请求。