死锁的产生,防止,避免

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_37964044/article/details/81411541

死锁

在多任务系统下,当一个或多个进程等待对方的资源,而在等待对方资源之前不会释放得到的资源,这样造成循环等待的一种现象。

产生死锁的原因:

竞争系统资源

进程的推进顺序不当

死锁的四个必要条件

1.资源互斥/资源不共享(每个资源要么已经分配给一个进程,要么是可用的,只有这两种状态,资源不可以被共享使用)

2.请求并保持(已经的到资源的进程还可以继续请求新的资源)

3.不可剥夺(我得到的资源,只能我释放别人不能剥夺我的资源)

4.环路等待(互相等待,谁都不放手,死锁发生时,系统中一定有两个或两个以上的进程组成的一条环路,环路上的每个进程都在等待下一个进程所占有的资源)

防止死锁的办法:

防止死锁只要破坏死锁产生的四个必要条件之一即可

1.破坏互斥条件

方法:共如果系统资源都能被享,那么就不会进入死锁状态(但是有些资源就不能被同时访问,例如 打印机)

缺点:破坏互斥条件而预防死锁的方法不太可行,而且在有的场合应该保护这种互斥性

2.破坏请求并保持条件

方法:资源请求一次性也就是进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不运行,一旦投入运行后,这些资源就一直归他所有,也不提出其他资源的请求,这样就不会死锁了

缺点:系统资源被严重浪费,其中有的资源可能仅在运行初期或运行快结束时才会使用,甚至根本不使用,而且会导致饥饿现象,由于个别资源长期被其他进程占用,导致等待该资源的进程迟迟不能开始运行

3.破坏不剥夺条件

方法:当一个已经保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,必须释放它已经保持的所有资源,待以后重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说被剥夺了。

缺点:实施起来较为困难,释放已经获得的资源可能导致前一阶段工作的失效,反复的申请和释放资源,会增加系统开销。这种方法常用于状态易于保存和恢复的资源,比如CPU的寄存器及内存资源。一般不试用于打印机这种资源。

4.破坏循环等待条件

方法:为了破坏循环等待条件,可采取顺序分配资源法。首先要给系统中的资源编号,规定每个进程,必须按照编号递增的顺序请求资源。

缺点:按规定申请资源的方法,编号会很麻烦,而且如果新增资源如何解决等等,也必然会给用户带来麻烦

由上可看出防止死锁,往往是不可行的。我们通常采用的是避免死锁。

避免死锁的算法

银行家算法

1.当一个顾客对资金的最大需求量不超过银行家现有的资金时,就可以接纳该顾客

2.顾客可以分期贷款,但是贷款总和不能超过一开始申请的总额

3.暂时不能满足客户需求,对顾客的贷款可以推迟支付,但是总能在有效时间内得到贷款

4.当顾客使用完全部资金时,在一定的时间内归还所有的资金

死锁的解除(了解)

1.资源剥夺法

 挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程,但应防止被挂起的进程长时间的不到资源,而处于资源匮乏的状态

2.  撤销进程法

  强制撤销部分,甚至全部死锁进程,并剥夺这些进程的资源,撤销的原则可以按照进程优先级和撤销进程代价的高低进行

3.进程回退法

让一个进程回退到足以回避死锁的地方,进程回退时自愿释放资源而不是被剥夺,要求系统保持进程的历史信息。

死锁的检测

(1)画出资源分配图

(2)简化资源分配图

(3)使用死锁定理判断

死锁定理:

如果资源分配图中没有环路,则系统没有死锁

如果资源分配图中有环路,则系统可能有死锁

猜你喜欢

转载自blog.csdn.net/baidu_37964044/article/details/81411541