操作系统原理——死锁

1. 基本概念

1.1 死锁、活锁,与饥饿

  • 死锁(Deadlock)

多道程序设计系统中一组进程的每一个进程均无限期地等待被该组进程中的另一个进程所占有且永远不会释放的资源,这种现象称系统处于死锁状态,简称死锁

当死锁发生后,死锁进程将一直等待下去,除非有来自死锁进程之外的某种干预。

  • 活锁(Livelock)

前提条件:进入临界区互斥的时间很短,而阻塞等待的时间开销很大,那么在某种情况下,可采用轮询(忙等待)原语进入临界区或存取资源。在这种情况下,如果两个进程A和B,都需要两个资源1和2,当A获得资源1,B获得资源2,然后两个进程在之后的每个时间片都一直重复轮询工作去尝试获得资源。此时进程并没有阻塞(没有发生死锁),但是从结果来看,好像发生了死锁,这就称为活锁

  • 饥饿(Starvation)

动态运行的系统中,对资源的请求在任何时刻都可能发生,当采用一些资源分配策略的时候,可能出现某些进程始终得不到资源,该进程并没有被阻塞,只是无限延后,这个现象称为饥饿

饥饿现象可以通过先来先服务资源分配策略来避免。在这种机制下,等待最久的进程会是下一个被调度的进程随着时间的推移,所有进程都最终能够获得资源而完成。

1.2 死锁产生的原因

死锁产生的原因主要有两个:

  1. 竞争资源,系统提供的资源数量有限,不能满足每个进程的需求;
  2. 多道程序设计时,进程推进顺序不合理。

2. 产生死锁的必要条件

  1. 互斥条件。资源是独占的且排他使用。进程互斥使用资源,即任一时刻一个资源只能给一个进程使用,其他进程若请求一个资源而该资源被另一个进程占有时,则申请者等待,直到资源被占用者释放。

  2. 不可剥夺条件。进程获得的资源在没有使用完之前,不能被其他进程强行剥夺,只能由获得资源的进程自愿释放。

  3. 请求和保持条件。进程每次申请它所需要的一部分资源,在申请新的资源的同时,继续占用已分配到的资源。

  4. 循环等待条件。在死锁发生时,进程等待队列中必须存在一个进程等待环路。环路中每一个进程所占用的资源同时被另一个进程所申请,即前一个进程占有后一个进程所请求的资源。

3. 解决死锁的方法

操作系统中对待死锁问题的一种方法是:鸵鸟算法,即忽视死锁问题。因为考虑死锁所带来的危害与解决死锁所花费的代价相比,最终选择了忽视死锁问题。

另外是通过各种方法解决死锁问题。分为以下四种;

  1. 预防死锁。通过设置某些严格限制,破坏死锁产生的第一个互斥条件,以防止死锁发生。这一方法会导致资源利用率过低。其中预防死锁可以从破坏死锁产生的四个必要条件入手,因此就有了:1)破坏“互斥条件”;2)破坏“不可剥夺”条件;3)破坏“请求和保持”条件;4)破坏“循环等待”条件。这四种方法。
  2. 避免死锁。在资源动态分配过程中,采取某种方法,防止系统进入不安全状态,从而避免死锁发生。这种方法只需要以较弱的限制条件为代价,并可获得较高的资源利用率。
  3. 检测死锁。允许系统运行过程中发生死锁,但通过在系统中设置检测机构,检测死锁是否发生,并能精确地确定与死锁有关的进程与资源,然后采取措施解除死锁。
  4. 解除死锁。这是与死锁检测相配套的措施,用于将进程从死锁状态下解脱出来。

以上主要参考:《计算机四级教程——操作系统原理》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值