操作系统----死锁

死锁是指两个或更多进程在等待对方持有的资源而无法继续执行的状态。产生死锁需要满足四个条件:互斥条件、请求和等待条件、不可剥夺条件和循环等待条件。解决死锁的策略包括预防、避免和检测解决。预防死锁是破坏四个条件之一,避免死锁通常使用银行家算法,而检测和解决死锁则涉及资源剥夺、撤销进程或进程回退等方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是死锁?两个及以上的进程在拥有一个资源的前提下相互等待其它进程所拥有的资源,从而导致这些进程陷入阻塞态并且在无外力干扰下无法回到就绪态,这一情况称为死锁。

死锁产生的四个条件:互斥条件,请求和等待条件,不可剥夺条件,循坏等待条件。

互斥条件:进程所等待的资源必然是需要互斥访问的资源,如果是可以同时访问的资源直接就获取了,也就不会发生死锁了。

请求和等待条件:进程想要发生死锁就必然是再自己拥有资源的前提下去请求其它资源但是该资源又被其它进程所使用,所以才会变成阻塞态,但是另外的进程又等待则我方进程的资源,所以造成死锁。

不可剥夺条件:操作系统给进程分配资源后该资源只能由进程主动释放,操作系统无权剥夺该资源。如果该资源操作系统可以剥夺,那么也就不会造成死锁了。

循坏等待条件:发生死锁的进程必然构成了一个循环等待链,每个进程在拥有资源的前提下去等待其它进程所占有的资源,形成一个资源等待环。从而使得这一个环内的所有进程都陷入死锁状态。

解决死锁问题有三种策略:预防死锁,避免死锁,检测和解决死锁。

预防死锁和避免死锁是阻止死锁的发生,预防死锁是指破坏死锁发生中的四个条件的任意一个,相当于从根源上解决问题。而避免死锁是指操作系统在进行资源分配时要预知此次分配是否会造成死锁问题。

检测和解决死锁相当于死锁已经发生了该如何解决相当于事后补救。

预防死锁:从互斥条件入手,只需要把一个互斥资源变成能同时访问的资源即可,一般是采用spooling技术,把一个互斥资源在逻辑上改造成能够同时访问的资源。缺点:并不是所有的资源都可以改造成可共享使用的资源。并且为了系统安全,很多地方还必须保这种互斥性。因此,很多时侯都无法破坏互斥条件。

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

从请求和等待条件入手,采用静态资源分配法当一个进程无法获取到它所需要的全部资源时就不会运行该进程,所以当进程运行时一定获取到了它所需的全部资源,并且这些资源会一直归该进程所有直到该进程运行完成。缺点:有些资源可能只需要用很短的时间,因此如果进程的整个运行期间都一直保持若所有资源,就会造成严重的资源浪费,资源利用率极低。另外,该策路也有可能导致某些进程饥饿。

从循环等待条件入手,采用顺序资源分配法给每一类资源进行编号,每一个进程只能按照编号递增的顺序申请资源,及如果进程申请了大编号的资源就无法回过头申请小编号资源必须按照递增顺序。按照这种方式就无法形成资源等待环导致所有进程发生死锁,假设有两个进程都申请了一个资源,那这两个资源的编号肯定有小有大,小号资源的进程能等待大号的资源但是大号资源无法回过头等待小号资源所以避免了死锁问题。缺点:1.不方便增加新的设备,因为可能需要重新分配所有的编号。2.进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费。3.必须按规定次序申请资源,用户编程麻烦。

避免死锁:最常用的是银行家算法,本质是预测该次分配会不会导致死锁问题,看能否找到一个安全序列如果能则证明此次分配是安全的可以执行,否则不可执行。在银行家算法中定义了几个数组用来记录数据,max数组用来记录进程告知操作系统的最大请求的资源数,Allcation数组用来记录进程已被分配的资源数,need数组记录进程还需要的资源数,request数组记录本次进程请求的资源数,available记录操作系统还能分配的资源数。当进程通过系统调用的方式向操作系统请求分配资源时操作系统会把请求资源的数量记录在request数组中,并把request数组的值和need数组的值进行比较如果大于则说明超过了该进程承诺的最大资源量则拒绝该次请求。如果小于等于则需要进行安全序列判断判断该次分配是否会导致死锁的发生。安全序列算法:先假设同意该请求并修改相依数组的值如available,Allcation,need数组的值,之后拿available数组的值和各个进程的need数组的值进行对比如果大于则把该进程加入到安全序列中并回收该进程的资源即available数组的值变成available+该进程的Allcation。之后继续该操作直到把所有进程都加入到安全序列中,如果能把所有进程都加入到安全序列证明此次操作是安全的可以执行,否则不可执行会导致死锁直接拒接该进程的资源请求。

检测和解决死锁:为了能对系统是否已发生了死锁进行检测,必须:1.用某种数据结构米深存资原的请求和分配信总:2.提供一种算法,利用上述信息来检测系统是否已进入死锁状态。

 

 判断进程是否发生死锁需要看该与该进程相连的边是否都能消除,如果都消除说明没发生死锁否则发生死锁。

解除死锁的主要方法有:1.资源剥夺法。挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿。2.撤销进程法(或称终止进程法)。强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的优点是实现简单,但所付出的代价可能会很大。因为有些进程可能己经运行了很长时间,已经接近结束了,一旦被终止可谓功亏一篑,以后还得从头再来。3.进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值