死锁产生的原因+如何避免死锁
死锁产生的原因+如何避免死锁:一,死锁产生的原因:1)什么是死锁?所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局;当进程处于这种僵持状态,而且无外力作用时,它们都将无法再向执行任务。举个例子来描述:如果此时有一个线程A,按照先获取锁a、再获得锁b的顺序来获取锁,而此时同时还有一个线程B,按照先获取锁b、再获得锁a的顺序来获得锁。如下图所示:...
死锁产生的原因+如何避免死锁:
一,死锁产生的原因:
1)什么是死锁?
所谓死锁,是指多个进程在运行过程中因争夺资源而造成的一种僵局;
当进程处于这种僵持状态,而且无外力作用时,它们都将无法再向执行任务。
举个例子来描述:
如果此时有一个线程A,按照先获取锁a、再获得锁b的顺序来获取锁,而此时同时还有一个线程B,按照先获取锁b、再获得锁a的顺序来获得锁。
如下图所示:
`
.
.
2)产生死锁的原因:
可归结为如下两点:
1)竞争资源;
2)进程间推进顺序非法;
a. 竞争资源:
系统中的资源可以分为两类:
可剥夺资源,是指某进程在获得这类资源后,该资源可以再被其他进程夺走,比如:CPU就属于可剥夺性资源;
不可剥夺资源,是指当系统把这类资源分配给某进程后,不能再强制收回,只能在进程将任务完成后、自行释放,比如:磁带机、打印机等。
产生死锁中的一个原因:竞争资源,指的就是竞争不可剥夺资源。
比如:现在只有一台打印机,可供进程P1使用,假定P1已占用了打印机,而此时进程P2也需要使用打印机,那么P2将阻塞。)
b. 进程间推进顺序非法
若进程P1保持了资源R1,进程P2保持了资源R2,此时这两个进程再向前推进,
即,P1想要获取资源R2、P2想要获取资源R1,那么,P1将因资源R2已被P2占有而阻塞,P2将因资源R1已被P1占有而阻塞,此时便发生了进程死锁。
.
.
.
3)死锁产生的4个必要条件:
产生死锁的必要条件:
1>互斥条件:进程要求对所分配的资源进行排它性控制,即在一段时间内某资源仅为一进程所占用。
2>请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放。
3>不可剥夺条件:进程已获得的资源在未使用完之前,不能被剥夺,只能在使用完时由进程自己释放。
4>循环等待条件:即存在一个循环等待队列,P1占有P2的资源,P2占有P3的资源,P3又占有P1的资源,这样就形成了一个等待回路。
二,解决死锁问题:
概括:
1)预防死锁;(资源一次性分配、一个资源也不分配、可剥夺资源、资源有序分配法)
2)避免死锁;(银行家算法)
3)解除死锁;(给予资源、撤消进程)
1)预防死锁:
1> 资源一次性分配:
一次性分配完所有的资源,这样就不会再有进程请求获取资源了。(破坏了请求条件)
2> 一个资源也不分配:
就是,给一个进程分配资源时,如果无法给该进程分配它所需的所有资源,则直接,一个资源也不给该进程分配!(破坏请保持条件)
3> 可剥夺资源:
即当某进程获得了部分资源,但得不到其它资源,则自动释放自己已经占有的资源。(破坏不可剥夺条件)
4> 资源有序分配法:
即,让系统给每类资源都赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏循环等待条件)
2)避免死锁:
引言:
预防死锁的几种策略,会严重地损害系统性能。
因此,还有避免死锁的策略,可以更好的解决死锁问题且尽量得到较满意的系统性能。
1> 简介:
在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前,预先估算一下资源分配的安全性。
如果发现此次分配不会导致系统进入不安全的状态,则将资源分配给进程;否则,进程等待。
其中最具有代表性的避免死锁算法是,银行家算法。
2> 银行家算法:
银行家算法是一种最有代表性的避免死锁的算法。
简单描述就是:在避免死锁方法中`允许进程动态地申请资源`,但系统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。
1.如何判断分配资源的安全性:
存在安全序列则说明系统是安全的,如果不存在则系统不安全,但不安全状态不一定引起死锁。
2.什么是安全序列:
安全序列是指一个进程序列{P1,…,Pn}是安全的,即,对于每一个进程Pi(1≤i≤n),它以后需要的资源量 不超过 系统当前剩余资源量与所有进程Pj (j < i )当前已占有的资源量之和。(即在分配过程中,不会出现 某一进程后续需要的资源量 比 其他所有进程及当前剩余资源量总和 还大的情况。)
3.原理过程:
系统给当前进程分配资源时,先检查是否安全:
在满足当前的进程X的资源申请之前,判断一下,是否还能有足够的资源去满足 下一个 距最大资源需求最近 的进程,若可以满足,则继续检查下一个 距最大资源需求最近 的进程,若均能满足所有进程,则表示为安全,可以允许给当前进程X分配其所需的资源申请,否则让该进程X进行等待。
注:检查是否安全的过程中,每满足了一个进程,则进行下个检查时,当前可用资源为回收上一个进程资源的总值,每满足一个进程表示此进程已结束,资源可回收。)
.
3)解除死锁:
当发现有进程死锁后,应立即把它从死锁状态中解脱出来,常采用的方法有以下几种:
1> 给予资源:
从其它进程剥夺足够数量的资源,给予死锁进程,以解除它的死锁状态;
2> 撤消进程:
可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态消除为止;
所谓代价是指优先级、进程的重要性和价值等。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)