面试_操作系统_操作系统中的死锁

244 阅读4分钟

进程和线程都可以并发,所以都需要竞争资源,所以都有可能发生死锁。他们发生死锁的四个必要条件是一致的。



死锁和活锁的区别

  • 死锁:面对资源,都满足了条件,都拼命去争资源,陷入僵持状态。无法自行解开
  • 活锁:面对资源,由于都没有满足条件,谁都不去第一个拿,陷入僵持状态。可以自行解开


什么是死锁?产生的原因?

  死锁是指两个或两个以上的进程(线程)在执行过程中,由于争夺资源进程推进顺序不当而造成的一种阻塞的现象,若无外力的作用,它们将永远阻塞下去

一句话概括:相互等待所需资源



造成死锁的具体场景?

①、加锁后忘记解锁; ②、重复加锁造成死锁; ③、程序中存在多个共享资源,有多把锁,随意加锁导致相互被阻塞。



死锁产生的必要条件(缺失任何一个,都不会发生死锁)

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


解决方法

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


鸵鸟策略

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

大多数操作系统,包括 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个资源。