操作系统期末复习——第七章 死锁
第七章 死锁
1.分析死锁问题
1.1什么时候会发生死锁
- 进程占用一个资源
- 进程请求被其他进程所占用的资源
当一组进程都在等待一个事件,而事件只能由这组进程的另一个进程引起,那么这组进程就处于死锁状态
1.2死锁特征——必要条件
- 互斥
- 占用并等待
- 非抢占
- 循环等待:“衔尾蛇”
当以上四个条件都满足时会发生死锁
1.3资源分配图
由节点集合V和边集合E组成
- 节点集合V分为进程集合P和资源集合R
- 边集合E:P->R表示P申请使用R,R->P表示R已经分配给了P
如果分配图中没有环一定没有死锁发生!
如果分配图中有环,可能发生死锁
- 若每个资源类型中只有一个实例,一定发生死锁
- 若有多个实例,可能发生死锁
2.预防和避免死锁
2.1预防死锁
- 破坏互斥条件
- 不可共享资源互斥——打印机
- 可共享资源不互斥——只读文件
- 破环“占有并等待条件”
- 每个进程在执行前申请所有资源
- 只有不占有资源时才允许进程申请资源
以上两种方式的缺点——资源利用率低,可能发生饥饿
- 破坏“非抢占条件”:
- 一个进程请求的资源被其他进程占有,可以抢占该资源
- 破坏“循环等待条件”:
- 给每个资源分配一个唯一的整数
- 进程按整数递增的顺序申请资源
2.2避免死锁
避免死锁指的是确保系统不进入不安全状态,是一种动态的方法
2.2.1资源分配图算法
资源分配图算法适用于每个资源具有单个实例时
引入需求边虚线P-->R,表示进程P未来可能申请资源R
以后申请时虚线变实线
算法规则:只有申请边变分配边时不会导致资源分配图成环时才允许申请资源
2.2.2银行家算法
适用于资源中有多实例
- 安全性算法:确定计算机系统是否处于安全状态
- 资源分配算法:判断能否安全允许请求的算法
数据定义:n位进程个数,m位资源类型数
- Available(1* m向量)表示可分配的资源数,A[i] = k表示第i中资源还有k个
- Max(n * m矩阵)表示每个进程的资源最大需求数
- Allocation(n * m 矩阵):表示占有的资源数
- Need(n * m 矩阵):表示仍需要的资源数
资源分配算法伪代码:
if(Request[i] <= Need[i]){
if(Request[i] <= Available[i]){
Available[i] -= Request[i];
Allocation[i] += Request[i];
Need[i] -= Request[i];
do SafetyCheck;//安全性检查算法
}else{
waiting;
}
}else{
error;
}
安全性检查伪代码:
work = Available;
for all i
finish[i] = false;
for all i{
if(finish[i] == false && Need[i] <= work){//当前进程需要的资源小于空闲的资源
work += Allocation[i]//将空闲的资源分配给该进程,并在进程结束后将资源全部回收作为空闲的资源
finish[i] = true;
}
}
if (for all i,finish[i] == true){//每个进程都能按上边的方式获得资源执行完毕,则该序列为安全的
System is safe
}
P4请求不可,P0可以
3.死锁的检测和恢复
3.1死锁的检测
3.1.1等待图法
适用于资源只有单个实体的检测算法
取消了资源分配图中的资源节点,P->P代表一个进程在等待另一个进程释放资源
- 如果图中有环则存在死锁
3.1.2运用银行家算法的安全性检查算法进程检测
代码:
work = Available;
for all i
if(Allocation[i] != 0){
finish[i] = false;
}else
finish[i] = true;
for all i{
//当前进程需要的资源小于空闲的资源
if(finish[i] == false && Need[i] <= work){
//将空闲的资源分配给该进程,并在进程结束后将资源全部回收作为空闲的资源
work += Allocation[i]
finish[i] = true;
}
}
//只要有一个进程不能执行完毕,系统处于死锁状态
if (there is a i -> finish[i] = false){
System is in deadlock
}
何时使用检测算法取决于:
- 死锁发生的频率
- 死锁发生时,多少进程会受影响
3.2死锁恢复
- 结束所有进程
- 每次结束一个进程,直到没有死锁
需要考虑的是:要避免每次取消的都是一个进程——会导致饥饿
回滚:把不能正常运行的进程回滚到某个安全状态,以便重启进程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异