银行家算法属于死锁避免:系统允许进程申请资源,但在批准前先模拟分配,检查是否仍存在让所有进程最终完成的安全序列。它需要预先知道每个进程对各资源的最大需求,资源类型和数量也要能建模,因此更适合理论分析,不是通用 OS 每次锁申请都会运行的方案。
假设有 Available(当前可用资源)、Allocation(各进程已分配资源)、Max(最大需求),可计算 Need = Max - Allocation。安全性检查先令 Work = Available,寻找一个尚未完成且 Need 不超过 Work 的进程;假设它完成并释放 Allocation,将资源加回 Work,再继续寻找。若所有进程都能按此方式完成,则状态安全。新请求即使不超过 Need 和 Available,也要先试分配;若结果不安全,就暂缓请求。
不安全不等于已经死锁:它只说明系统无法证明未来一定能完成所有进程,仍可能因实际需求较小而无死锁。安全状态则保证存在一条完成顺序。死锁检测采取不同策略:允许分配后再分析当前资源分配状态。单实例资源可用等待图查环;多实例资源需结合 Available、Allocation、Request 做类似安全性迭代,找出无法完成的进程集合。
检测到死锁后可终止一个或多个进程、回滚到检查点,或在资源可安全抢占时回收资源。选择牺牲者要考虑已完成工作、回滚代价、优先级和是否反复被选中;否则恢复过程可能演变成饥饿。
常见追问
Q:银行家算法是预防还是避免?
A:避免。它不固定破坏某个死锁必要条件,而是在分配前判断系统状态是否安全;预防则通过规则破坏必要条件。
Q:不安全状态是否已经死锁?
A:不是。不安全只代表没有可证明的安全序列,实际运行仍可能完成;死锁要求当前已形成无法推进的等待状态。
Q:资源分配图里出现环,是否必然死锁?
A:若每类资源只有一个实例,环可判定死锁;多实例时环只是风险线索,还需检查是否有进程可先完成并释放资源。
Q:检测到死锁后最简单怎么恢复?
A:终止一个或多个受影响进程并释放资源;实际系统要尽量减少回滚损失,并防止固定牺牲同一进程导致饥饿。