操作系统死锁相关知识点!

多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放其他资源。

在未改变这种状态之前都不能向前推进,多个进程无限期相互等待 的一种状态。

四个必要条件

死锁产生的 4 个条件(有一个条件不成立,则不会产生死锁):

互斥:一个资源一次只能被一个进程使用。

请求与保持:一个进程因请求资源而阻塞时,对已获得资源保持不放。

非抢占:进程获得的资源,在未完全使用完之前,不能强行抢占。

循环等待:若干进程之间形成一种头尾相接的环形等待资源关系。

死锁处理方法

死锁的四个处理方法:

鸵鸟策略:忽略掉死锁,视而不见。

死锁检测与恢复:允许死锁发生,检测它们是否发生,一旦发生死锁,就采取行动解决问题。

死锁避免:仔细对资源进行分配,动态地避免死锁,银行家算法是避免死锁的经典算法。

死锁预防:破坏引起死锁的 4 个必要条件。

银行家算法

银行家算法的主要思想是避免系统进入不安全状态。

在每次进行资源分配时,它首先检查系统是否有足够的资源满足要求。

  • 如果有,则先进行分配,并对分配后的新状态进行安全性检查。

如果新状态安全,则正式分配上述资源,否则就拒绝分配上述资源。

  • 这样,它保证系统始终处于安全状态,从而避免死锁现象的发生。

安全状态

安全状态与不安全状态的区别是,从安全状态出发,系统能够保证所有的进程都能完成。

而从不安全状态出发,没有这样的保证。

活锁

活锁指进程并没有被阻塞,但由于某些条件没有满足,导致一直重复尝试、失败、尝试、失败。

进程仍可以在 CPU 上活动,但 CPU 时间片执行完了之后又下了 CPU,进程没有任何进展但也没有阻塞。

饥饿

进程无限等待的情况,饥饿 ≠ 死锁,但是饥饿至少有一个进程的执行被无限期推迟。

产生饥饿的原因:

  • 往往是由于资源分配策略的 不公平性 导致的,比如短作业优先。

此时系统虽然没有发生死锁,某些进程也可能会一直得不到 CPU 的使用权而长时间等待。

当 饥饿 到一定程度,进程任务即使完成也不再具有实际意义时称该进程被饿死。