现代操作系统——死锁

资源

资源分为两类:
■可抢占式资源(preemptable resource)是指可以从拥有它的进程中抢占而不会产生任何副作用。比如存储器就是一类可抢占式的资源,还有CPU。
■不可抢占式资源(nonpreemptable resource)是指再不引起相关计算失败的情况下,无法把它从占有它的进程处抢占过来。当系统将这些资源分配给进程后,无法再强行收回,只能等进程自行释放。比如光盘刻录机,打印机。

ps:临时资源是指临界区中的资源,一般是不允许两个进程同时访问的。

进程想要使用相关的资源需要下面的流程:
◉请求资源
◉使用资源
◉释放资源

死锁的概念

死锁(deadlock)是因为进程再运行过程中因争夺资源而造成的一种僵局,当进处于这种僵局状态时,若无外力作用,进程都无法先前推进。

举个简单的例子:
在这里插入图片描述
T1,T2分别是两个进程,R1,R2是两个进程需要的资源,当进程1占有资源1,进程2占有资源2的时候,进程1请求资源2但是得不到,进程2请求资源1但是也得不到,于是进程1,2就都因为无法获得资源而都无法推进,就是发生了死锁。

死锁产生的原因

◉竞争不可抢占式资源(比如在上面简介中的资源1,2在不可抢占的情况下就一定会发生死锁)。
◉竞争临资源(回忆一下用信号量和PV原语解决生产者消费者问题是,P操作不可交换,假设,生产者的P操作顺序颠倒,就有可能产生生产者持有进入临界区的锁变量,但是缓冲区中没有空位导致生产者进程没法推进;同时消费者发现缓冲区中有资源可以消费并且执行了第一个P操作,但是,由于生产者持有锁变量,消费者进程也没法继续推进。最终两个进程就陷入了死锁)。
◉进程间的推进顺序非法(比如上面的简介中,进程1,2先后取得了资源1,2,这时紫系统处于不安全状态,继续推进就会导致死锁)。

死锁产生的必要条件

死锁产生有4个必要条件:
◉互斥条件(Mutual condition):某一段时间内,某一资源仅被某一进程占用(或空闲)
◉请求和保持条件(Hold and wait condition):已获得某些资源的进程可以继续请求新的资源;而进程对以获得的资源保持不放;当进程因请求被占用的资源而阻塞时,进程将一直等待。
◉不可抢占条件(No preemption condition):对进程已获得但是没使用完的资源,系统不能剥夺。
◉环路等待条件(Circular wait condition):必然存在一个进程—资源的环形链。

死锁模型

在这里插入图片描述
用方框表示资源,圆圈表示进程,有向图由资源指向进程表示该进程拥有该资源;由进程指向资源表示该进程渴望拥有该资源。
上图中c)就是一个进程—资源的环路,因此发生了死锁。

解决死锁

鸵鸟算法

忽略,因为解决思索的代价太大,出现思索的概率较低,如果真的出现死锁的时候可以采取手动干预的方式解决(比如重启)。

检查和回复

在这里插入图片描述
◉检查
先用一张有向图描述当前进程和竞争资源的关系,然后用合适的算法检查是否有环路,如果有就说明存在死锁。
◉恢复
在发现并且真的产生死锁后,我们想办法破解这个环路就可以了。恢复的方法主要有3种:
1)preemption抢占资源,通过人工干预把一个进程占有的资源剥夺就可以打破环链。
2)roll back回滚,通过(以最小代价)撤销进程,复位到死锁之前的状态,但是也意味着这一段时间的工作都将丢失。
3)杀死进程,与回滚类似,选择可以重新从头运行的,代价最小的进程(一般是年轻的进程)。

ps:进程对多个资源的情况就不描述了,要通过资源矩阵的方式进行检测。

避免死锁

小心的分配资源,尽可能地让死锁不会发生。

资源轨迹图

在这里插入图片描述
由于进程A,B交替执行,因此特征时折线,并且只能向上或者向右延伸。
当执行到t点时,如果继续执行进程B,根据折线延申地特征,折线必定会进入阴影部分,就一定会导致死锁,那么在这种可以测地情形下,我们可以选择运行进程A直到绕过阴影区域。

但是资源轨迹图能表示的情况太局限。

银行家算法

银行家算法建立在对安全状态和不安全状态地评估上,先介绍一下安全状态和不安全状态。

■安全状态与不安全状态
在这里插入图片描述
在上面的情况中,如果利用现有的资源分配给部分进程,在进程完成后释放更多的资源去满足其他的进程,如过有这样一个进程的序列(被称为安全序列))最终可以使得所有的进程都获得想要的资源,就称这样的状态为安全状态,反之,就是不安全状态。

银行家就是看能否找到这样一个序列。银行家算法对每一个请求进行检查,看满足这个请求时能否达到安全状态,如果不能就推迟,能就满足就满足并且在使用完之后回收资源;然后继续检查下一个最容易满足的进程。如果最终能够满足所有的进程,就可以找到一个合适的进程序列避免死锁。

ps:多个资源的银行家算法基本类似,要用到分配矩阵和所需资源矩阵。

预防死锁

要实现预防死锁,只要破坏发生死锁的4个必要条件之一就行。
◉破坏互斥条件。举个例子,打印机同一时间只能被一个进程使用,但是如果添加一个打印队列,使所有提交上来的任务在队列中排队,就不存在因为竞争打印机而发生死锁的问题了。这种方法叫做假脱机打印机(spooling printer)
◉破坏占有并等待条件。让进程一次性(提前)请求所有的资源,比如一个小时后要使用打印机,进程就先占用打印机,1小时后就一定可以使用。不用多说,这种方式会导致非常大的资源浪费。
◉破坏不可抢占条件。有些资源本身就没办法抢占,比如光盘刻录机,有可能会导致其受损。
◉破坏循环等待条件。资源的按序分配策略,给所有的资源进行编号,规定所有的资源必须按从小到大的去申请。但实际上这种方式也会导致资源使用效率比较低。

总结一下,最常用的就是鸵鸟算法和spooling的方式,好死锁发生的也并不是那么频繁。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值