死锁的概念
死锁发生在资源分配阶段,由两个以上的进程需要资源,资源在其他进程手中且不会释放资源,造成的互相等待称为死锁。
死锁、饥饿、死循环的区别
概念
死锁:两个以上的进程,是在请求、分配资源的时候,造成的双方资源都没有得到满足,且不愿意释放资源。
饥饿:至少单进程。长时间没有得到响应。
死循环:单进程,发生在运行态,一直重复执行一个程序
发生死锁的条件:
互斥条件:共享资源每次只能由一个人访问。
不剥夺条件:其他进程无法去取下你持有的资源。
请求与保持条件:核心是保持,即不主动释放持有资源。然后不断请求其他资源。
循环等待链:理解是上个人都希望下一个人的资源,最后一个又希望第一个的资源,形成了一个圈。
什么时候发生死锁?
由浅层到深层(弄清楚主体,发生在那个的前提下)
1、对不可剥夺资源的竞争
2、进程非法推进:两个进程交叉推进造成互相申请对方资源。
3、代码问题,申请、释放资源的顺序有时决定是否死锁
解决死锁的策略
- 预防死锁(静态)(事前)。破坏死锁产生的四个必要条件种的一个或几个。
- 避免死锁(动态)(事中)。用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)
- 死锁的检测和解除(事后)。允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。
预防死锁(静态)(事前)
破坏互斥条件:
破坏不剥夺条件:
方案一:主动释放资源
方案二:让操作系统去恒定然后强行剥夺资源
破环请求等待条件:
一次拿完全部想要的资源,缺点:资源利用率低,
核心:程序由小到大的去申请资源,不可由大到小去申请资源
事中(避免死锁):银行家算法
不安全序列>死锁,不安全序列不一定死锁,死锁一定是因为不安全序列
安全序列:一定不死锁。
算法:
算法核心:前提:资源是一次性归还的,每次被申请资源,都会进行一次全局性的计算,推测最后资源能不能全部收回,不能则不安全,能则安全(放心分配)
事后(检查和接触死锁):
检查死锁:从进程结点出发,去满足进程结点的要求(进程指向资源)。满足后将资源归还(消除资源指向进程的线)若每个进程结点都无法满足说明死锁了。
死锁的解除就是剥夺资源,核心点在于剥夺的决策,即剥夺哪一类进程的资源。