死锁

什么是死锁?

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。


死锁产生的原因:

  • 系统资源的竞争
  • 进程运行推进的顺序不当

死锁产生的必要条件(缺一不可)

  • 互斥:每个资源要么已经分配给了一个进程,要么就是可用的。
  • 占有和等待:已经得到了某个资源的进程可以再请求新的资源。
  • 不可抢占:已经分配给一个进程的资源不能强制性地被抢占,它只能被占有它的进程显式地释放。
  • 环路等待:有两个或者两个以上的进程组成一条环路,该环路中的每个进程都在等待下一个进程所占有的资源。

解决方法

主要有以下四种:

  • 鸵鸟策略
  • 死锁检测与死锁恢复
  • 死锁预防
  • 死锁避免

鸵鸟策略

把头埋在沙子里,假装根本没发生问题。

大多数操作系统,包括 Unix,Linux 和 Windows,处理死锁问题的办法仅仅是忽略它。

为什么可行?
  1. 解决死锁问题的代价很高,这种方案会获得更高的性能。
  2. 发生死锁时不会对用户造成多大影响,或发生死锁的概率很低。

死锁检测

事先不采取任何限制性措施,也不检查系统是否进入不安全区,此方法允许系统在运行过程中发生死锁。但可通过检测机构,及时地检测出死锁的发生,并精确地确定与死锁有关的进程和资源,然后采取适当措施,从系统中将已发生的死锁清除掉。


死锁恢复

  • 利用抢占恢复
  • 利用回滚恢复
  • 通过杀死进程恢复

死锁预防(破坏必要条件之一)

  1. 破坏互斥条件
  2. 破坏占有和等待条件
    一种实现方式是规定所有进程在开始执行前请求所需要的全部资源。
  3. 破坏不可抢占资源
  4. 破坏环路等待
    给资源统一编号,进程只能按编号顺序来请求资源。

死锁避免

在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
常用的实施方法是撤销或挂起一些进程,以便回收一些资源,再将这些资源分配给处于阻塞状态的进程,使之转为就绪状态,以继续运行。


死锁解答题

  • 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个资源。

-------------本文结束感谢您的阅读-------------
0%