携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第34天,点击查看活动详情
死锁
概念相关
-
什么是死锁
- 各进程互相等待对方手里的资源,导致进程都阻塞,无法向前推进
-
死锁,饥饿,死循环的区别
-
死锁
- 两个以及两个以上的进程死锁进程一定阻塞,不能上处理机
-
饥饿
- 可能一个可能阻塞可能就绪,不能上处理机
-
死循环
- 可能一个死循环是程序员的问题,能上处理机
-
-
死锁产生的必要条件
-
互斥条件
- 资源只能一个人使用
-
不可剥夺
- 进程占有的资源,不能被他人强行剥夺,只能进程主动释放
-
请求和保持条件
- 我占有了一些资源,我还在申请其他资源
-
循环等待
- 发生死锁一定有循环等待
- 有循环等待未必死锁
-
-
死锁产生的原因
- 竞争资源
- 进程推进顺序非法
- 信号量使用不当(把信号量理解为一种抽象的资源)
死锁的处理策略
-
不允许死锁发生
-
预防死锁
-
破坏互斥条件
-
spooling技术 :将互斥资源改造为允许共享使用
-
缺点:可行性不高,大多数情况下不能改造
-
-
破坏不剥夺条件
- 1.立即释放,2.允许自己被剥夺
- 缺点:实现复杂,开销大
-
破坏请求保持条件
- 要么全给,要么全不给,资源不全就不能运行
- 缺点:效率低,饥饿
-
破坏循环等待条件
- 给资源编号,必须从小到大的顺序申请资源
- 原理分析:一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已持有大编号资源的进程不可能逆向地回来申请小编号的资源,从而就不会产生循环等待的现象。
- 缺点:不方便增加新设备,进程实际使用资源的顺序可能和 编号递增顺序不一致,会导致资源浪费;
-
-
避免死锁
-
在资源分配之前预先判断这次分配是否会导致系统进入不安全状态
-
不安全状态
- 找不到任何一个安全序列(安全序列:每个进程都能被满足的序列)
- 死锁一定是在不安全状态,但是在不安全状态未必就是发生了死锁
- 安全状态一定不死锁
-
银行家算法
-
检查当前的剩余开可用资源是否满足某个进程的最大需求,如果可以就把该进程加入安全序列,然后回收资源,接着看有没有下一个能运行的进程,一直重复操作,最后形成的序列就是安全序列
-
安全序列不唯一
-
并将该进程持有的资源全部回收
-
银行家算法用来判断系统是否处于死锁状态
-
银行家算法用来判断系统是否处于不安全状态
-
-
-
-
允许死锁发生
-
死锁检测算法
-
原理
-
依次消除与即不阻塞又不孤立进程相连的边,直到无边可消
-
死锁定理:如果分配图不可完全简化,说明发生了死锁
-
-
-