面向校招操作系统 —— 死锁

Posted 胡毛毛_三月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向校招操作系统 —— 死锁相关的知识,希望对你有一定的参考价值。

死锁

目录

1、死锁、饥饿、死循环的区别

**死锁:**各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。

**饥饿:**由于长期得不到想要的资源,某进程无法向前推进的现象。比如:在短进程优先(SPF)算法中,若有源源不断的短进程到来,则长进程将一直得不到处理机,从而发生长进程“饥饿”。

**死循环:**某进程执行过程中一直跳不出某个循环的现象。有时是因为程序逻辑bug导致的,有时是程序员故意设计的。

2、什么是死锁?

什么是死锁:各进程互相等待对方手里的资源,导致各进程都阻塞,无法向前推进的现象。

在两个或者多个并发进程中,如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源,在未改变这种状态之前都不能向前推进,称这一组进程产生了死锁。通俗的讲就是两个或多个进程无限期的阻塞、相互等待的一种状态。

3、什么时候会发生死锁?

对不可剥夺资源的不合理分配,可能导致死锁

4、死锁产生的条件?

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

  • 互斥条件:一个资源一次只能被一个进程使用,只有对必须互斥使用的资源的争抢才会导致死锁(如哲学家的筷子、打印机设备)。
  • 请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,对已获得资源保持不放。
  • 不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
  • 循环等待条件:存在进程资源的循环等待链。若干进程之间形成一种头尾相接的环形等待资源关系,链中的每一个进程已获得的资源同时被下一个进程所请求。

注意!发生死锁时一定有循环等待,但是发生循环等待时未必死锁(循环等待是死锁的必要不充分条件)

5、如何处理死锁问题

常用的处理死锁的方法有:死锁预防、死锁避免、死锁检测、死锁解除、鸵鸟策略

**(1)死锁的预防(静态策略):**基本思想就是确保死锁发生的四个必要条件中至少有一个不成立:

  • ① 破除资源互斥条件:把只能互斥使用的资源改造为允许共享使用,则系统不会进入死锁状态。

    • 缺点:可行性不高,很多时候无法破坏互斥条件,并不是所有的资源都可以改造成可共享使用的资源。并且为了系统安全,很多地方还必须保护这种互斥性。
  • ② 破除“请求与保持”条件:实行资源预分配策略(静态分配方法),进程在运行之前,一次性申请完它所需要的全部资源,在它的资源未满足前,不让它投入运行。一旦投入运行后,这些资源就一直归它所有,该进程就不会再请求别的任何资源了。

    • **缺点:**在很多情况下,无法预知进程执行前所需的全部资源,因为进程是动态执行的,同时也会降低资源利用率,导致降低了进程的并发性。
    • 有些资源可能只需要用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就会造成严重的资源浪费,资源利用率极低。另外,该策略也有可能导致某些进程饥饿。
  • ③ 破除“不可剥夺”条件:

    • 方案一:当某个进程需要的资源被其他进程所占有的时候,可以由操作系统协助,将想要的资源强行剥夺。这种方式一般需要考虑各进程的优先级(比如:剥夺调度方式,就是将处理机资源强行剥夺给优先级更高的进程使用)
    • 方案二:当一个已经保持了某些不可被抢占资源的进程,提出新的资源请求而不能得到满足时,它必须释放已经保持的所有资源,待以后需要时再重新申请。也就是说,即使某些资源尚未使用完,也需要主动释放,从而破坏了不可剥夺条件。这意味着进程已经占有的资源会被暂时被释放,或者说被抢占了。
    • 缺点:
      • 1、实现起来比较复杂
      • 2、释放已获得的资源可能造成前一阶段工作的失效。因此这种方法般只适用于易保存和恢复状态的资源,如CPU
      • 3、反复地申请和释放资源会增加系统开销,降低系统吞吐量。
      • 4、若采用方案一,意味着只要暂时得不到某个资源,之前获得的那些资源就都需要放弃,以后再重新申请。如果一直发生这样的情况,就会导致进程饥饿。
  • ④ 破除“循环等待”条件:采用顺序资源分配法:实行资源有序分配策略,对所有资源排序编号,按照顺序获取资源,将紧缺的,稀少的采用较大的编号,在申请资源时必须按照编号的顺序进行,一个进程只有获得较小编号的进程才能申请较大编号的进程。

    • 缺点:
      • 1、不方便增加新的设备,因为可能需要重新分配所有的编号
      • 2、进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费
      • 3、必须按规定次序申请资源,用户编程麻烦

(2)死锁避免(动态策略):

死锁预防通过约束资源请求,防止4个必要条件中至少一个的发生,可以通过直接或间接预防方法,但是都会导致低效的资源使用和低效的进程执行。

死锁避免则允许前三个必要条件,但是通过动态地检测资源分配状态,以确保循环等待条件不成立,从而确保系统处于安全状态。

所谓安全状态是指:如果系统能按某个顺序为每个进程分配资源(不超过其最大值),那么系统状态是安全的,换句话说就是,如果存在一个安全序列,那么系统处于安全状态。银行家算法是经典的死锁避免的算法。

(3)死锁检测(允许死锁发生)

用于检测系统状态,以确定系统中是否发生了死锁

死锁预防策略是非常保守的,他们通过限制访问资源和在进程上强加约束来解决死锁的问题。

死锁检测则是完全相反,它不限制资源访问或约束进程行为,只要有可能,被请求的资源就被授权给进程。但是操作系统会周期性地执行一个算法检测前面的循环等待的条件。死锁检测算法是通过资源分配图来检测是否存在环来实现,从一个节点出发进行深度优先搜索,对访问过的节点进行标记,如果访问了已经标记的节点,就表示有存在环,也就是检测到死锁的发生。

  • (1)如果进程-资源分配图中无环路,此时系统没有死锁。
  • (2)如果进程-资源分配图中有环路,且每个资源类中只有一个资源,则系统发生死锁。
  • (3)如果进程-资源分配图中有环路,且所涉及的资源类有多个资源,则不一定会发生死锁。

死锁定理:如果某时刻系统的资源分配图是不可完全简化的,那么此时系统死锁。

(4)死锁解除(允许死锁发生)

当认定系统中已经发生了死锁,利用该算法可将系统从死锁状态中解脱出来。

死锁解除的常用方法就是终止进程资源抢占,回滚。

  1. **资源抢占:**就是从一个或者多个死锁进程那里抢占一个或多个资源。

  2. 进程终止法(撤销进程法)

    1. 就是简单地终止一个或多个进程以打破循环等待,包括两种方式:终止所有死锁进程和一次只终止一个进程直到取消死锁循环为止;
    2. **优缺点:**这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能已经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。
  3. **进程回退法:**让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。

(5)鸵鸟策略:

把头埋在沙子里,假装根本没发生问题。因为解决死锁问题的代价很高,因此鸵鸟策略这种不采取任何措施的方案会获得更高的性能。当发生死锁时不会对用户造成多大影响,或发生死锁的概率很低,可以采用鸵鸟策略。大多数操作系统,包括 Unix,Linux 和 Windows,处理死锁问题的办法仅仅是忽略它。

6、银行家算法:

数据结构:

  1. 长度为m的一维数组Available表示还有多少可用资源
  2. n*m矩阵Max表示各进程对资源的最大需求数
  3. n*m矩阵Allocation表示已经给各进程分配了多少资源
  4. Max- Allocation = Need矩阵表示各进程最多还需要多少资源
  5. 用长度为m的一位数组Request表示进程此次申请的各种资源数

银行家算法步骤:

①检查此次申请是否超过了之前声明的最大需求数

②检查此时系统剩余的可用资源是否还能满足这次请求

③试探着分配,更改各数据结构

④用安全性算法检查此次分配是否会导致系统进入不安全状态

安全性算法步骤:

  1. 检查当前的剩余可用资源是否能满足某个进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收。
  2. 不断重复上述过程,看最终是否能让所有进程都加入安全序列。

注意:系统处于不安全状态未必死锁,但死锁时一定处于不安全状态。系统处于安全状态一定不会死锁。

【面向校招】全力备战2023Golang实习与校招

欢迎群共同进步:
QQ群:1007576722

以上是关于面向校招操作系统 —— 死锁的主要内容,如果未能解决你的问题,请参考以下文章

面向校招操作系统 —— 死锁

计算机操作系统 死锁 -- 产生死锁的必要条件死锁的处理方法(鸵鸟策略死锁检测与死锁恢复死锁预防死锁避免)

计算机操作系统 死锁 -- 产生死锁的必要条件死锁的处理方法(鸵鸟策略死锁检测与死锁恢复死锁预防死锁避免)

计算机操作系统 死锁 -- 产生死锁的必要条件死锁的处理方法(鸵鸟策略死锁检测与死锁恢复死锁预防死锁避免)

计算机操作系统 死锁 -- 产生死锁的必要条件死锁的处理方法(鸵鸟策略死锁检测与死锁恢复死锁预防死锁避免)

第七章 死锁