什么是死锁?
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。
死锁产生的原因:
- 系统资源的竞争
- 进程运行推进的顺序不当
死锁产生的必要条件(缺一不可)
- 互斥:每个资源要么已经分配给了一个进程,要么就是可用的。
- 占有和等待:已经得到了某个资源的进程可以再请求新的资源。
- 不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
- 环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。
解决方法
主要有以下四种:
- 鸵鸟策略
- 死锁检测与死锁恢复
- 死锁预防
- 死锁避免
鸵鸟策略
把头埋在沙子里,假装根本没发生问题。
大多数操作系统,包括 Unix,Linux 和 Windows,处理死锁问题的办法仅仅是忽略它。
为什么可行?
- 解决死锁问题的代价很高,这种方案会获得更高的性能。
- 发生死锁时不会对用户造成多大影响,或发生死锁的概率很低。
死锁检测
事先不采取任何限制性措施,也不检查系统是否进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。
死锁恢复
- 利用抢占恢复
- 利用回滚恢复
- 通过杀死进程恢复
死锁预防(破坏必要条件之一)
- 破坏互斥条件
- 破坏占有和等待条件
一种实现方式是规定所有进程在开始执行前请求所需要的全部资源。 - 破坏不可抢占资源
- 破坏环路等待
给资源统一编号,进程只能按编号顺序来请求资源。
死锁避免
在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给处于阻塞状态的进程,使之转为就绪状态,以继续运行。
死锁解答题
- n个进程竞争m个资源,问最少需要多少个资源,系统才不会发生死锁?
最极端的情况是每个进程有m-1个资源,而总资源一共就有n(m-1)个,那么这个时候也会发生死锁,这个时候只需要再多出一个资源,就可以保证某一个进程执行成功,然后执行成功以后,就会有更多的资源释放,后面的进程也可以执行。所以最终的结果就是n(m-1)+1
- 有同类资源m个,被n个进程共享,当M>N和 M<=N时候,每个进程最多请求多少个这类资源,一定不会死锁?
例如11个同类资源被5个进程共享,每个进程最多可以请求多3个资源才能保证系统不会发生死锁。
因为如每个进程都已分配到2个资源,系统还剩下一个资源,就能保证某一个进程能分配到全部3个资源,并能运行到底,最终释放这3个资源。
当m>n时,设一个进程最多可以请求多x个资源,故当m > n * (x-1)时,系统不会发生死锁。
于是:
x – 1 < m / n
x < m / n +1
当 m 能被n除尽时,x = m/n
当 m 不能被n除尽时,x = (m/n)+1
当m <=n时,每个进程最多可以请求1个资源。