石臼墙话板河南科技学院我的大学

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

2022-05-14  本文已影响0人  胡小毛

死锁

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

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

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

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

[图片上传失败...(image-832d44-1652539562462)]

2、什么是死锁?

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

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

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

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

4、死锁产生的条件?

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

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

5、如何处理死锁问题

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

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

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

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

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

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

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

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

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

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

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

[图片上传失败...(image-713d88-1652539562462)]

(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

上一篇 下一篇

猜你喜欢

热点阅读