操作系统死锁

文章目录

死锁概念

a进程都在等待b进程的资源,b进程等待a进程的资源,每个进程都占有其他进程需要的资源,并且申请另一种被占有了的资源

死锁产生的必要条件

互斥:每个进程需要的资源只能被一个进程访问

在这里插入图片描述

为什么一定是临界资源

看B站哈工大的视频,我就疑惑会不会有两个列车同时占用一个轨道的情况——一个资源被两个进程共享,也会形成不可打破的环路
但查阅资料知道,系统中要么是临界资源要么是共享资源,要么只能被一个进程访问,要么可以被多个进程访问,不存在一个资源被两个进程共享的情况,所以互斥性是一定满足的,产生死锁那么进程必然访问临界资源
而多个列车同时占用一个轨道的情况也是存在的,但依然是一个进程占用一个临界资源,但临界资源有多个,所以有多个列车排在一起的情况
在这里插入图片描述

为什么只有一个进程得到全部资源,其他进程得到一个资源的方法还是会死锁

请添加图片描述
资源均分会再次产生死锁,除非剩下的进程都是只缺一个资源就能完成,那么均分也不会产生死锁

怎样算不会产生死锁的最少资源m

1、第一种理解
一个进程需要n个资源,至少有一个进程完成,所以m=n+_,
为了防止资源均分的情况,剩下的k-1进程已经拥有了n-1个资源,分到一个资源时就能结束死锁,所以m=n+(k-1)(n-1)
2、所有的进程都拥有了n-1个资源,再多出一个资源给任意进程就会打破循环等待链,m=k
(n-1)+1.(注意循环等待链和死循环不同,死循环是程序一直反复进行,是程序员的代码写错了,形成循环等待链是因为资源不配不恰当)
如图:
在这里插入图片描述
所以形成循环等待链不一定会导致死锁,只要有同类资源就能打破循环等待链

不剥夺:进程完成前,其他进程不能抢走其占有的资源

怎样允许其他进程抢走资源

如果优先级更高的进程能剥夺当前执行的进程的资源(剥夺式优先级调度),那就不会产生死锁

如果抢走资源后会发生什么

但如果是静态优先级剥夺调度,如果一直出现优先级高的进程,优先级低的会一直等待资源,而且因为优先级在创建进程时就被确定,不能像动态优先级那样修改优先级,所以优先级低的进程会出现饥饿现象
进程如果是静态优先级,无论是否剥夺都可能出现饥饿,进程如果是动态优先级,不会出现饥饿

资源不剥夺的方式有哪些

产生死锁的是不剥夺的调度方式:先来先到、短作业优先…

请求并等待:每个进程都已经占有资源,还需要其他资源才能完成,但其他资源被另一个进程占有

循环等待:等待资源的进程组成集合中 pi等待pi+1,pn等待p0

为什么循环等待不是死锁的充要条件

循环等待的意义可能如图,所以若pn等待的资源能由pk提供,则没有死锁
在这里插入图片描述

什么情况下循环等待是死锁的充要条件

每类资源的同类资源只有一个,没有其他同类资源可以打破循环,循环等待是死锁的充要条件

预防死锁:破坏四个条件

破坏互斥:让临界资源变成共享资源

SPOOLING技术可以使打印机在逻辑上变成共享设备,但许多时候需要保护互斥性,并不是所有资源都可以改成共享资源的

破坏不剥夺:放弃资源或抢占资源

彻底放弃资源

如果一直没有足够的资源给一个进程,进程就会不停地放弃资源,之后再重新申请,最后导致饥饿

抢占资源

1、只有CPU等易于保存可以恢复的资源适合(???),否则另一个进程抢占走资源后,之前的工作失效
2、进程执行时申请资源,被抢占资源时释放资源,反复被抢占和申请会增加系统开销(???),降低系统吞吐量(???)

破坏请求并保持条件:不让二次请求

一开始就把所有资源分配给进程(静态分配),之后进程就会一直占有资源

若分配资源成功,进程很早就用完了其中的一个资源,也得在进程结束后才释放,导致资源利用率低

若分配资源失败,其中一个进程一直在等待被占用的资源,导致进程饥饿

破坏循环等待条件:资源编号后从小到大使用

避免死锁:在资源分配前,判断是否导致系统处于不安全状态,若是,使进程等待

安全序列

把资源分配给进程时,能使每一个进程都能完成的进程分配顺序。

不安全状态和安全状态

按一个进程分配顺序分配资源,由于资源分配方式的不同,可能产生死锁也可能不产生死锁,可能产生死锁的就是不安全状态,只要存在一个安全序列就是安全状态

为什么不安全状态不一定产生死锁

是否产生死锁是针对某个具体状态而言的,但是如果暂时没有进程提出请求,或者提出的请求小于剩余资源时,或者有其他进程归还了一部分资源时,暂时不会死锁
在这里插入图片描述

安全状态未必能时刻满足所有资源的最大需求,只要有一个序列使最后所有进程都完成了就是安全状态

银行家算法

数据结构

max[i,j]:表示第i个进程最多需要第j种资源的数量
allocation[i,j]:表示第i个进程已分配第种资源的数量
need[i,j]:表示当前第i个进程还需要分配的第j种资源的数量
available[j]:表示第j种资源还剩下的数量
request[j]:表示某进程申请分配的第j种资源的数量

思路

随机一个进程提出申请三种资源的请求,若请求合理(申请资源数小于剩余资源数并且小于该进程还需要的资源数),则暂时将三种资源分配给进程,也就是改变available、allocation、need数据结构,然后进入安全性算法,找到能被剩余资源满足的一个进程,因为进程执行结束之后会返回全部资源,所以改变临时avaliable的数据结构,并且把进程加入到安全序列中,在没有进入安全序列中的进程中,继续找能被剩余资源满足的一个进程,若所有不在安全序列中的进程都不能被满足,则不安全,再将available、allocation、need数据结构恢复到没有分配这次资源的时候,当每一个进程所需要的资源数都为0时,结束分配

代码

死锁的检测和解除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值