死锁
什么是死锁?
由于两个或以上的线程互相持有对方所需要的资源,导致这些线程处于等待状态,无法执行
死锁产生的原因:
- 系统资源不足
- 进程运行推进顺序不合理
- 资源分配不当
如果系统资源充足,进程的资源请求都能得到满足,死锁出现的可能性很低,否则就会因为竞争有限资源进入死锁,其次进程运行的推进顺序和速度不同,也可能产生死锁
- 竞争不可抢占性资源
线程 | P1 | P2 |
---|---|---|
拥有资源 | F1 | F2 |
need(需求资源) | F2 | F1 |
死锁产生条件?
互斥条件:某一时间段一个线程持有资源会一直持有直到使用完释放
请求和保持条件:当进程请求资源的时候不会对已有资源进行释放
不可剥夺条件:进程已经持有的资源,在使用完之前,不可以被其他线程剥夺,直到使用完自己释放
环路等待条件:发生死锁时一定存在进程相互请求并等待对方持有的资源
死锁的预防
破坏请求条件:一次性分配需要的资源,减少请求
破坏保持条件:如果现有资源无法满足进程,就不给这个进程分配任何资源,防止资源的无效持有
破坏不可剥夺条件:将获得一部分资源但是无法获取所需全部资源的进行进行资源的释放
破坏环路等待条件:将资源进行编号,进程申请资源的时候编号(升序)取出,释放时(降序)释放
死锁的避免
银行家算法
进程名 |
---|
状态(R\W\E) |
资源需求总量(max) |
已占有资源(allocation) |
能执行完标志(1\0) |
银行家算法分配原则是:当某个进程提出资源请求时,假定先分配资源给它,然后查找各进程的剩余请求,检查系统的剩余资源量是否由于进程的分配而导致系统死锁。若是,则让该进程等待;否则,为该进程分配所需资源。
简而言之就是对资源进行模拟分配,查看是否会造成死锁
进程 | allocation | need | avaiable(可获取的资源) | p完成后系统可用资源 | 执行顺序 |
---|---|---|---|---|---|
p1 | (0,0,3,2) | (0,0,1,2) | (1,6,2,2) | (1,6,5,4) | ① |
p2 | (1,0,0,0) | (1,7,5,0) | (1,9,8,6) | (2,9,8,6) | ③ |
p3 | (1,3,5,4) | (2,3,5,6) | (2,9,8,6) | (3,12,13,10) | ④ |
p4 | (0,3,3,2) | (0,6,5,2) | (1,6,5,4) | (1,9,8,6) | ② |
p5 | (0,0,1,4) | (0,6,5,6) | (3,12,13,10) | (3,12,14,14) | ⑤ |
()表示元组是不同种类的资源
死锁的检测
- 每个进程指定唯一编号
- 设定一张资源分配表,记录各进程与资源之间的关系
- 设定一张资源等待表,记录各进程与要申请资源之间的关系
资源分配表:
资源 | 进程 |
---|---|
r1 | p2 |
r2 | p5 |
r3 | p4 |
r4 | p1 |
进程等待表:
资源 | 进程 |
---|---|
r1 | p1 |
r3 | p2 |
r4 | p4 |
p1-r1-p2-r3-p4-r4-p1 出现环路引起死锁
死锁的解除
资源剥夺:将某些死锁进程挂起,将挂起进程分配给其他死锁进程,等到资源充足给将挂起进程分配足够的资源防止长时间挂起
撤销进程:强制撤销部分、全部死锁进程,并剥夺这些进程的资源(优先撤销优先级低的,和撤销进程造成的代价小的)
进程回退:要求系统保持进程的历史信息,设置快照(还原点)通过回退,使资源自愿(不是剥夺)放弃资源,回退到拥有足够避免死锁的时候
参考文档:
https://www.cnblogs.com/JimmyFanHome/p/9914562.html
https://zhuanlan.zhihu.com/p/25677118