-
哈工大李治军老师操作系统笔记【17】:死锁处理(Learning OS Concepts By Coding Them !)
0 回顾
- 这是进程这部分最后一讲,死锁是多进程图像产生的一个问题,要解决这个问题,多个进程在内存当中同时触发交替执行的时候,如果控制不好,就会出现互相死锁的计划,这种死锁就需要操作系统进行一系列的处理,不然就会造成一系列问题
- 如下,生产者消费者信号量解法,这两个因为信号量的问题就会造成死锁
- 将empty和mutex反过来会怎样?
- 因为这是用户写的代码,完全可以反过来
- 但是反过来的话,就会造成死锁,如下图
- 总的来就是,你得先看好有没有纸,有纸才能去占坑。你先占坑然后发现没纸了,只能等别人给你送,但别人进来会发现坑被你占了,就会等着不会进来给你送纸
- 我们将这种多个进程由于互相等待对方持有的资源而造成的准都无法执行的情况叫死锁,如果死锁造成了很多进程都没法执行,再结合操作系统的核心就是多进程图像,计算机就不工作了
- 调换一下信号量的使用顺序,如上图,就会产生死锁
- 等待条件形成了一条环路
1.1 死锁的成因
- 互相等待对方死锁的资源造成了死锁
- 进程占有了一些资源,又不释放,再去申请其他资源
- 各自占有的资源和互相申请的资源形成了环路等待
1.2 死锁的四个必要条件
1.3 死锁的处理方法
- 再来回顾一下怎么会产生死锁,因为循环等待对方占着资源导致谁也没法执行,想一下四条火车占着四条路,谁也动不了的那张图
- 死锁怎么造成的呢?因为占有一个东西又去请求一个东西造成环路等待,在请求的时候自己占有的资源只能靠自己自愿释放,又不能剥夺,又必须互斥等造成了死锁
- 死锁避免,银行家算法
- 所以判断他是否死锁可以转变思想来判断他是不是不死锁
- 不死锁就是:是不是存在一条路,能够走下去,也就是判断是不是存在一条可以完成的执行序列,看按照那种方式执行完以后,所有进程都能执行完事
- 如果有,那个状态就是安全状态
- 如图一步步推下去,发现AD是正确的
- 每一次都去判断一下
n
e
e
d
need
need是不是小于
w
o
r
k
work
work
- 如果能满足了,这个进程就可以
f
i
n
i
s
h
finish
finish
-
w
o
r
k
work
work就把曾经分配给他的资源进行累加
- 然后挨个判断即可
- 银行家算法的时间复杂度是
O
(
m
n
2
)
O(mn^2)
O(mn2),
m
m
m是资源的个数,
n
n
n是进程的个数,时间复杂度较高
- 银行家算法是找到一个可执行的安全序列,那怎么通过银行家算法判断此次请求是否引起死锁呢?
- 假装给此次请求分配资源,然后调用银行家算法,看还能不能找到一个安全序列
- 假如先申请
P
0
P_0
P0为
(
0
,
2
,
0
)
(0, 2, 0)
(0,2,0),往下推发现都行不通,所以
P
0
P_0
P0的这个申请不是个安全序列,一旦给他了,系统就造成死锁了,所以不应该
- 所以请求出现时:首先假装分配,然后调用银行家算法,看看有无死锁,如果有,此次死锁直接拒绝,所以造成代价比较大(关键是每次申请都要做)
- 死锁检测+恢复
- 定时检测或者是发现资源利用率低时检测,执行一遍银行家算法
- 找到死锁的进程序列,从里面挑一个进程回滚
- 什么是回滚?就是把曾经他执行的东西全部退出去
- 回滚到什么状态呢?就是往前往后回滚试一试,滚到一定程度,再用银行家算法看看,别人可以执行或者不卡了那就可以不用回滚了
- 那么选择谁回滚?
- 占用资源多的?优先级低的?
1.5 死锁的引出
- 死锁忽略
2 总结
死锁就想四条火车的那张图。
-
相关阅读:
lua-总结2
【若依(ruoyi)】设置主题样式
mysql5.7 window启动慢解决方法 最慢启动长达几个小时
使用 WSLg 的 vGPU 硬件加速新特性创建重度混合生产环境
HCIA-R&S自用笔记(26)PPP
操作系统:银行家算法
Rust学习记录(linux)——安装、创建、编译、输入输出
nacos配置中心docker部署、配置及 goLang 集成使用
从物联网到万物互联:AI与6G融合,实现互联智能
冬奥AI手语主播亮相,人工智能技术助力跨越声音障碍
-
原文地址:https://blog.csdn.net/weixin_44673253/article/details/126933114