目录
2.4_1_死锁的概念
2.4_1_1什么是死锁
2.4_1_2死锁、饥饿、死循环的区别
死锁:
各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象
饥饿:
由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程有先算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”
死循环:
某进程执行过程中一直跳不出某个循环的现象 。有时是因为程序逻辑BUG导致的,有时是程序员故意设计的
2.4_1_3死锁产生的必要条件
2.4_1_4 什么时候会发生死锁
2.4_1_5死锁的处理策略
本节小结:
2.4_2_预防死锁
2.4_2_1破坏互斥条件
2.4_2_2破坏不剥夺条件
2.4_2_3 破坏请求和保持条件
2.4_2_4 破坏循环等待条件
本节小结:
2.4_3_避免死锁
2.4_3_1 什么是安全序列
安全序列:就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。
如果分配了资源后,系统中找不出任何一个安全序列,系统就进入了不安全状态。这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况。
如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁时一定是在不安全状态)
因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是“银行家算法”的核心思想。
2.4_3_2银行家算法
代码实现:
本节小结:
2.4_4_死锁的检测和解除
2.4_4_1死锁的检测
死锁的检测方法:
2.4_4_2死锁的检测
一旦检测出死锁的发生,就应该立即解除死锁
补充:并不是系统中所有的进程都是死锁状态,用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁进程
解除死锁的主要方法有:
- 资源剥夺法。挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿
- 撤销进程法(或称终止进程法)。强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。
- 进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。
那么如何决定“对谁动手”?
- 进程优先级
- 已执行多长时间
- 还要多久能完成
- 进程已经使用了多少资源
- 进程是交互式还是批处理式的
本节小结: