文章目录
一、本文知识覆盖范围
1、知识意义
前趋图与银行家算法是操作系统中的核心同步与死锁处理技术,它们解决了多进程并发执行中的关键问题:
- 前趋图:解决进程间执行顺序控制问题,确保依赖关系的进程按正确顺序执行,避免数据竞争和逻辑错误
- 银行家算法:解决资源分配中的死锁预防问题,通过动态资源分配策略避免系统陷入死锁状态
具体应用场景:
- 数据库事务处理中的依赖关系管理
- 分布式系统中的任务调度
- 云计算平台的资源分配
- 实时系统中的任务优先级控制
2、知识体系概览
知识模块 | 具体内容 | 学习重点 |
---|---|---|
前趋图基础 | 前趋关系定义、前趋图结构、DAG特性 | 理解进程依赖关系,掌握图形化表示方法 |
PV操作机制 | 信号量设置、P操作检查、V操作通知 | 掌握进程同步的底层实现原理 |
死锁理论 | 四大必要条件、死锁预防、死锁避免 | 理解死锁产生机制,掌握预防策略 |
银行家算法 | 安全状态检查、资源分配原则、算法实现 | 掌握动态资源分配和死锁避免技术 |
二、前趋图:进程依赖关系的图形化表示
本章节将详细讲解前趋图的基本概念、结构特征和实际应用,帮助读者掌握进程间依赖关系的表示和管理方法。
1、前趋图基本概念
概念定义:前趋图(Precedence Graph)是一种有向无环图(DAG),用于表示进程、程序段或语句之间的执行先后顺序关系。
核心特征:
特征 | 定义与特点 | 具体实例 |
---|---|---|
无环性 | 图中不存在闭环路径,保证进程可按顺序完成 | 如编译过程中的词法分析→语法分析→语义分析 |
部分排序 | 提供进程的部分排序,无直接依赖的可并行执行 | 如Web服务器中,用户认证和日志记录可并行 |
有向边 | 箭头表示前趋关系,从a指向b表示a必须在b之前完成 | 如数据库事务中,先写日志再提交事务 |
实际例子:
- 编译系统:词法分析→语法分析→语义分析→代码生成→优化
- Web应用:用户登录→权限验证→业务处理→结果返回
- 数据处理:数据采集→数据清洗→数据转换→数据分析→结果输出
适用场景:
- 多进程系统的任务调度
- 工作流引擎的设计
- 并行计算中的任务依赖管理
- 数据库事务的依赖控制
2、前趋图结构分析
概念定义:前趋图由节点和有向边组成,节点代表进程或任务,有向边代表前趋关系。
核心特征:
结构元素 | 定义与特点 | 具体实例 |
---|---|---|
起始进程 | 没有前趋的进程,可以立即开始执行 | 如系统启动时的初始化进程 |
终结进程 | 没有后继的进程,执行完成后整个流程结束 | 如批处理作业的最终输出进程 |
前趋关系 | 箭头数量表示依赖关系的数量 | 如一个复杂任务可能有多个前置条件 |
实际例子:
电商订单处理流程:
订单创建(A) → 库存检查(B) → 支付处理(C) → 订单确认(D) → 发货通知(E)
适用场景:
- 业务流程建模
- 系统架构设计
- 任务调度算法设计
- 并行计算优化
3、PV操作实现前趋图
概念定义:PV操作是操作系统提供的进程同步原语,P操作用于检查资源,V操作用于释放资源并通知等待进程。
- pv:
- p代表:资源等待方检查资源使用方是否使用完;
- v代表:资源使用方释放资源。
- 信号量初值:实现并发时信号量初值常为0 ,前趋图中有几个前趋关系(箭头),一般就设置几个信号量。
核心特征:
P 操作:也叫 “等待操作”(wait),作用是申请资源。执行 P 操作时,信号量的值减 1:
若结果 ≥ 0,说明能获取资源,进程可继续执行;
若结果 < 0,说明资源不足,进程会被阻塞,进入等待队列。V 操作:也叫 “释放操作”(signal),作用是释放资源。执行 V 操作时,信号量的值加 1:
若结果 ≤ 0,说明有进程在等待该资源,会唤醒等待队列中的一个进程;
若结果 > 0,说明无进程等待,仅更新信号量值。S代表信号量(Semaphore),是操作系统中的一种同步原语,用于进程间的同步和互斥控制。
初值为0:表示初始状态下没有资源可用,需要等待前趋进程完成
适用场景:
- 进程间同步控制
- 资源访问控制
- 临界区保护
- 条件等待机制
### 1、依赖关系识别
从前趋图可以看出,存在以下**4个直接依赖关系**:
| 依赖关系 | 含义 | 信号量 |
|:-------|:-------|:-------|
| P1 → P2 | P1完成后P2才能开始 | S1 |
| P1 → P3 | P1完成后P3才能开始 | S2 |
| P2 → P4 | P2完成后P4才能开始 | S4 |
| P3 → P4 | P3完成后P4才能开始 | S5 |
### 2、进程特征分析
- **起始进程**:P1(没有前趋)
- **终结进程**:P4(没有后继)
- **并行进程**:P2和P3(都依赖P1,可以并行执行)
## 三、信号量设计原理
### 1、为什么需要5个信号量?
**标准情况**:4个依赖关系需要4个信号量
**实际情况**:题目要求5个信号量,原因如下:
| 信号量 | 管理依赖 | 使用位置 | 作用 |
|:-------|:-------|:-------|:-------|
| S1 | P1→P2 | P1完成,P2开始 | 确保P1完成后P2才能开始 |
| S2 | P1→P3 | P1完成,P3开始 | 确保P1完成后P3才能开始 |
| S3 | P3→P2 | P3完成,P2开始 | 确保P2等待P3完成(隐式依赖) |
| S4 | P2→P4 | P2完成,P4开始 | 确保P2完成后P4才能开始 |
| S5 | P3→P4 | P3完成,P4开始 | 确保P3完成后P4才能开始 |
### 2、S3的特殊作用
**关键理解**:S3实现了P3→P2的隐式依赖,这意味着:
- P2必须等待P3完成后才能继续执行
- 实际执行顺序变为:P1 → P3 → P2 → P4
- 这超出了前趋图显示的显式依赖关系
## 四、PV操作实现
### 1、正确答案分析
**点a, b, c的操作**:
- **点a**:V(S1)V(S2) - P1完成后通知P2和P3
- **点b**:P(S1)P(S3) - P2等待P1和P3完成
- **点c**:V(S4) - P2完成后通知P4
**点d, e, f的操作**:
- **点d**:P(S2) - P3等待P1完成
- **点e**:V(S3)V(S5) - P3完成后通知P2和P4
- **点f**:P(S4)P(S5) - P4等待P2和P3完成
### 2、执行流程
1. P1执行 → V(S1)V(S2)通知P2和P3
2. P3执行 → V(S3)V(S5)通知P2和P4
3. P2执行 → V(S4)通知P4
4. P4执行 → 完成所有任务
三、死锁理论:系统资源竞争的核心问题
本章节将深入讲解死锁的产生机制、必要条件以及预防和避免策略,帮助读者理解并解决系统资源竞争问题。
1、死锁的四大必要条件
概念定义:死锁是指多个进程因竞争资源而造成的一种僵局,当进程都在等待对方释放资源时,系统无法继续执行。
核心特征:
必要条件 | 定义与特点 | 具体实例 |
---|---|---|
互斥条件 | 资源不能被多个进程同时使用 | 如打印机、数据库连接、文件锁等独占资源 |
保持和等待 | 进程持有资源的同时请求其他资源 | 如进程A持有打印机,同时请求扫描仪 |
不剥夺条件 | 系统不能强行剥夺进程已持有的资源 | 如操作系统不能强制释放进程的内存 |
环路等待 | 多个进程形成资源请求的循环等待 | 如A等B,B等C,C等A的循环依赖 |
实际例子:
死锁场景:两个进程竞争两个资源
进程A:请求资源1 → 获得资源1 → 请求资源2 → 等待
进程B:请求资源2 → 获得资源2 → 请求资源1 → 等待
结果:A等待B释放资源2,B等待A释放资源1,形成死锁
适用场景:
- 多线程程序调试
- 数据库事务管理
- 分布式系统设计
- 资源池管理
2、死锁预防策略
概念定义:死锁预防是通过打破死锁的四大必要条件来防止死锁发生的方法。
核心特征:
预防策略 | 定义与特点 | 具体实例 |
---|---|---|
打破互斥 | 允许资源同时被多个进程访问 | 如只读文件可以被多个进程同时访问 |
打破保持等待 | 要求进程一次性申请所有资源 | 如数据库事务的原子性要求 |
打破不剥夺 | 允许系统剥夺进程资源 | 如操作系统的内存回收机制 |
打破环路等待 | 按固定顺序申请资源 | 如给资源编号,按编号顺序申请 |
3、死锁避免:银行家算法
概念定义:死锁避免是在资源分配时动态检查系统是否处于安全状态,避免进入可能导致死锁的状态。
核心特征:
算法要素 | 定义与特点 | 具体实例 |
---|---|---|
安全状态 | 存在安全序列,能使所有进程顺利完成 | 如系统能找到一种资源分配顺序让所有进程完成 |
资源请求检查 | 分配前检查是否会导致不安全状态 | 如检查分配后是否还能找到安全序列 |
动态分配 | 根据当前系统状态决定是否分配资源 | 如根据可用资源和进程需求动态决策 |
实际例子:
银行家算法示例:
系统资源:总共有10个资源
进程A:最大需求7个,已分配2个,还需5个
进程B:最大需求5个,已分配3个,还需2个
进程C:最大需求8个,已分配2个,还需6个
当前可用资源:10-2-3-2=3个
安全序列检查:B(需2个) → A(需5个) → C(需6个)
分配给B两个,运行完(3+5),分配给A后,满足a的需求
A完成后(释放给c)可用:6+2=8个,满足C的6个需求
4、 死锁最小资源数计算
题目核心要点:
死锁条件公式:
系统资源数 >= 进程数 × (进程所需资源数 - 1) + 1
计算结果:3个进程,每个需要5个资源,系统至少需要13个资源才能避免死锁
系统状态分类:
- [0,4]:必定死锁
- [5,12]:可能死锁
- [13,∞):不可能死锁
银行家算法作用:通过动态检查确保系统处于安全状态,避免死锁发生
四、银行家算法:动态资源分配的核心技术
本章节将详细讲解银行家算法的原理、实现方法和实际应用,帮助读者掌握动态资源分配和死锁避免技术。
1、银行家算法基本原理
概念定义:银行家算法是一种经典的死锁避免算法,通过模拟资源分配过程,确保系统始终处于安全状态。
资源分配原则:
算法原则 | 定义与特点 | 具体实例 |
---|---|---|
进程接纳原则 | 进程最大需求量不超过系统资源数 | 如系统有100个资源,进程最大需求不能超过100个 |
资源请求原则 | 进程请求总数不能超过最大需求量 | 如进程最大需求10个,累计请求不能超过10个 |
延迟分配原则 | 资源不足时可推迟分配,但保证有限时间内获得 | 如等待其他进程释放资源后再分配 |
2、安全状态检查机制
概念定义:安全状态是指系统存在一个安全序列,能够使所有进程按此序列执行并最终完成。
核心特征:
检查要素 | 定义与特点 | 具体实例 |
---|---|---|
安全序列 | 进程执行的顺序,每个进程都能获得所需资源 | 如P1→P3→P0→P2→P4的执行顺序 |
资源可用性 | 当前可用资源能否满足某个进程的需求 | 如可用资源[3,3,2]能否满足进程需求[1,2,2] |
资源回收 | 进程完成后释放的资源能否满足后续进程 | 如进程完成后释放的资源加入可用资源池 |
3、资源分配决策过程
概念定义:资源分配决策是在进程请求资源时,通过银行家算法检查分配后系统是否仍处于安全状态。
核心特征:
决策步骤 | 定义与特点 | 具体实例 |
---|---|---|
请求检查 | 检查请求是否超过进程最大需求 | 如进程最大需求5个,请求6个则拒绝 |
资源可用性 | 检查系统是否有足够资源满足请求 | 如请求3个资源,系统只有2个则等待 |
安全状态模拟 | 模拟分配后的系统状态是否安全 | 如分配后能否找到安全序列让所有进程完成 |
4、 习题
五、总结
核心知识点回顾:
- 前趋图:通过DAG表示进程依赖关系,使用PV操作实现进程同步,确保任务按正确顺序执行
- 死锁理论:理解死锁的四大必要条件,掌握预防和避免策略,保证系统稳定运行
- 银行家算法:通过安全状态检查实现动态资源分配,有效避免死锁发生
不同场景的技术选择建议:
应用场景 | 推荐技术 | 选择理由 | 实施要点 |
---|---|---|---|
Web应用并发控制 | 前趋图+信号量 | 控制请求处理顺序,避免数据竞争 | 使用Redis实现分布式信号量 |
数据库连接池管理 | 银行家算法 | 动态分配连接,避免连接耗尽 | 实现连接池的安全状态检查 |
分布式任务调度 | 前趋图+DAG调度 | 管理任务依赖,支持并行执行 | 使用Apache Airflow等工具 |
实时系统资源管理 | 银行家算法+优先级 | 保证关键任务资源,避免死锁 | 实现基于优先级的资源分配 |