Skip to content

408

操作系统

死锁的预防与避免(银行家算法)


一、定位信息

  • 所属圈层:核心层
  • 前置知识:理解死锁的概念和四个必要条件(OS-02-14)
  • 知识网络位置:银行家算法是408考试中OS部分最高频的综合题考点之一,必须掌握其执行过程和安全性判断
  • 考点热度等级H级(高频重点)——近5年综合题出现≥3次,是必考必练的核心算法

二、知识点讲解

2.1 死锁预防

通过破坏死锁四个必要条件中的至少一个来预防死锁:

预防策略破坏的条件做法缺点
一次性分配请求与保持进程开始前一次性申请所有资源资源利用率低,可能饥饿
可剥夺式分配不可剥夺OS可以强制回收进程的资源实现复杂,可能需要回滚
资源有序分配循环等待按编号递增顺序申请资源编号难以确定,限制灵活性
假脱机技术互斥将独占设备虚拟为共享设备仅适用于特定设备(如打印机)

2.2 死锁避免——安全状态

安全状态:系统能按某种顺序为所有进程分配资源,使每个进程都能顺利完成。该顺序称为安全序列

  • 安全状态→一定不会死锁
  • 不安全状态可能死锁(不一定死锁)
  • 死锁状态→一定是不安全状态

2.3 银行家算法

核心思想:在分配资源前,先试探性分配,检查分配后系统是否仍处于安全状态。如果是,则分配;否则不分配,让进程等待。

数据结构

  • Available[j]:系统中资源j的可用数量
  • Max[i][j]:进程i对资源j的最大需求
  • Allocation[i][j]:进程i已获得的资源j的数量
  • Need[i][j]:进程i还需要的资源j的数量(Need=MaxAllocationNeed = Max - Allocation

银行家算法步骤(进程i请求资源Request):

  1. 检查请求是否合法RequestiNeediRequest_i \leq Need_i,否则报错
  2. 检查资源是否足够RequestiAvailableRequest_i \leq Available,否则等待
  3. 试探性分配
    • Available=AvailableRequestiAvailable = Available - Request_i
    • Allocationi=Allocationi+RequestiAllocation_i = Allocation_i + Request_i
    • Needi=NeediRequestiNeed_i = Need_i - Request_i
  4. 安全性检查:执行安全算法,判断系统是否仍安全
  5. 如果安全,正式分配;如果不安全,撤销试探性分配,让进程等待

2.4 安全性算法

  1. 初始化:Work=AvailableWork = AvailableFinish[i]=falseFinish[i] = false(所有进程)
  2. 找一个进程i满足:Finish[i]=falseFinish[i] = falseNeediWorkNeed_i \leq Work
  3. 如果找到:Work=Work+AllocationiWork = Work + Allocation_iFinish[i]=trueFinish[i] = true,回到第2步
  4. 如果找不到:检查是否所有 Finish[i]=trueFinish[i] = true
    • 全部为true → 安全状态(找到安全序列)
    • 有false → 不安全状态

三、记忆与理解辅助

  1. 银行家算法口诀:"先试探→再检查→安全就分→不安全就等"
  2. 安全性算法口诀:"找能完成的→归还资源→再找→全部完成就安全"
  3. 关键公式Need=MaxAllocationNeed = Max - Allocation
  4. 安全状态一句话:存在一种顺序让所有进程都能顺利完成

四、例题与精解

例题1(基础巩固)

题目:系统中有3类资源R1、R2、R3,可用资源向量Available=(3,3,2)。有5个进程,当前状态如下:

进程AllocationMaxNeed
P0(0,1,0)(7,5,3)(7,4,3)
P1(2,0,0)(3,2,2)(1,2,2)
P2(3,0,2)(9,0,2)(6,0,0)
P3(2,1,1)(2,2,2)(0,1,1)
P4(0,0,2)(4,3,3)(4,3,1)

判断当前状态是否安全,若安全给出一个安全序列。

命题意图:考查安全性算法的执行过程。

精解

  1. 审题分析:需要执行安全性算法,逐个找到能完成的进程

  2. 解题思路:Work初始=Available=(3,3,2),找Need≤Work的进程

  3. 完整步骤

    第1轮:Work=(3,3,2)

    • P0: Need=(7,4,3) > Work → 不行
    • P1: Need=(1,2,2) ≤ Work=(3,3,2) → 可以!
    • 执行P1: Work = (3,3,2)+(2,0,0) = (5,3,2), Finish[1]=true

    第2轮:Work=(5,3,2)

    • P0: Need=(7,4,3) > Work → 不行
    • P2: Need=(6,0,0) > Work → 不行(6>5)
    • P3: Need=(0,1,1) ≤ Work → 可以!
    • 执行P3: Work = (5,3,2)+(2,1,1) = (7,4,3), Finish[3]=true

    第3轮:Work=(7,4,3)

    • P0: Need=(7,4,3) ≤ Work → 可以!
    • 执行P0: Work = (7,4,3)+(0,1,0) = (7,5,3), Finish[0]=true

    第4轮:Work=(7,5,3)

    • P2: Need=(6,0,0) ≤ Work → 可以!
    • 执行P2: Work = (7,5,3)+(3,0,2) = (10,5,5), Finish[2]=true

    第5轮:Work=(10,5,5)

    • P4: Need=(4,3,1) ≤ Work → 可以!
    • 执行P4: Work = (10,5,5)+(0,0,2) = (10,5,7), Finish[4]=true

    所有进程Finish=true → 安全状态,安全序列如:P1→P3→P0→P2→P4

  4. 方法反思:安全性算法的核心是"找能完成的→归还→再找",注意Need≤Work的逐分量比较

例题2(中等提升)

题目:在上题的基础上,若P1请求资源Request=(1,0,2),系统是否应该分配?

命题意图:考查银行家算法的完整执行过程。

精解

  1. 审题分析:P1请求(1,0,2),需要经过合法性检查→试探分配→安全性检查

  2. 解题思路:按银行家算法三步走

  3. 完整步骤

    步骤1:检查请求合法性

    • P1的Need=(1,2,2), Request=(1,0,2) ≤ Need → 合法

    步骤2:检查资源是否足够

    • Available=(3,3,2), Request=(1,0,2) ≤ Available → 足够

    步骤3:试探性分配

    • Available = (3,3,2)-(1,0,2) = (2,3,0)
    • Allocation[1] = (2,0,0)+(1,0,2) = (3,0,2)
    • Need[1] = (1,2,2)-(1,0,2) = (0,2,0)

    步骤4:安全性检查(Work初始=(2,3,0))

    • P1: Need=(0,2,0) ≤ Work → 可以!Work=(2,3,0)+(3,0,2)=(5,3,2)
    • P3: Need=(0,1,1) ≤ Work → 可以!Work=(5,3,2)+(2,1,1)=(7,4,3)
    • P0: Need=(7,4,3) ≤ Work → 可以!Work=(7,4,3)+(0,1,0)=(7,5,3)
    • P2: Need=(6,0,0) ≤ Work → 可以!Work=(7,5,3)+(3,0,2)=(10,5,5)
    • P4: Need=(4,3,1) ≤ Work → 可以!Work=(10,5,5)+(0,0,2)=(10,5,7)
    • 所有进程完成 → 安全

    结论:系统应同意分配,分配后系统仍处于安全状态。

  4. 方法反思:银行家算法的每一步都不能省略——先查合法性,再查资源够不够,再试探分配,最后安全检查


五、考情分析

  • 考查频次:近5年综合题出现≥3次
  • 常见题型:综合题(10–15分)
  • 分值占比:综合题中10–15分
  • 命题趋势:银行家算法的安全性判断和资源请求处理是必考内容。近年倾向于在安全性算法基础上增加资源请求的处理,考查完整流程

六、易错点提醒

  1. 错误表现:Need = Max + Allocation 错误原因:公式记反 正确理解:Need = Max - Allocation(还需要的 = 最大需求 - 已获得的)

  2. 错误表现:安全性检查中比较Need和Available时,使用向量加法而非逐分量比较 错误原因:对"≤"的理解错误 正确理解:Need ≤ Work是指每个分量都小于等于,如(1,2,2)≤(3,3,2)表示1≤3且2≤3且2≤2

  3. 错误表现:试探性分配后忘记在不安全时撤销 错误原因:遗漏回退步骤 正确理解:如果不安全,必须撤销试探性分配(恢复原值),让进程等待

  4. 错误表现:安全性检查时忘记更新Work 错误原因:忽略了"归还资源"的步骤 正确理解:进程完成后会释放所有资源,Work = Work + Allocation(不是 + Need)


七、来源标注

  • 依据2026考研统考408大纲
  • 依据《计算机操作系统》(汤小丹/汤子瀛版)第2章
  • 依据《操作系统概念》(Silberschatz版)第7章
  • 依据王道考研408操作系统辅导讲义

考研全科复习资料 - 基于2026考研统考大纲