死锁定义:
举个例子来阐述死锁,假设当前系统中由两个进程A和B,他们的运行都依赖资源M和N,此时呢,进程A持有了资源N,进程B持有了资源M,
进程A在等待资源M,进程B在等待资源N,两个谁也不释放资源,都在等待对方释放,然后两个进程都无法继续向下推进了,这就是死锁。
死锁的成因:
- 资源互斥使用,这些资源都是互斥的,不能同时被使用;
- 不能抢占,资源只能由进程主动的去退让;
- 请求和保持状态同时进行,也就是既持有资源,又去请求其他资源;
- 循环等待
死锁的处理:
预防:
破坏死锁出现的条件:
1.一次性申请所有资源,不会已经占用一部分资源又去申请其他资源;
2.资源申请必须按序
避免:
对每一次的资源申请进行检测,判断资源分配出去会不会有危险,会不会造成死锁,有的话就拒绝:
银行家算法:分析系统现有资源和所有进程(p1,p2.p3,p4)已有资源,计算出一条可行的执行序列,比如p2->p1->p3->p4
即先将资源满足p2,然后p2结束,是否资源,再去满足p1的资源,p2继续运行,一次类推
银行家算法一篇不错的文章
缺点:
算法复杂度高,每次资源分配都得执行一次算法,效率低下
死锁检测和恢复:
定时检测死锁,如果已经死锁,让某个死锁进程回滚,让出资源,然后运行一次银行家算法,得出安全序列,解除死锁
优点:产生死锁才执行算法,效率能提升
缺点:回滚实现起来比较困难
死锁忽略:
忽略