死锁
在多任务系统下,当一个或多个进程等待对方的资源,而在等待对方资源之前不会释放得到的资源,这样造成循环等待的一种现象。
产生死锁的原因:
竞争系统资源
进程的推进顺序不当
死锁的四个必要条件:
1.资源互斥/资源不共享(每个资源要么已经分配给一个进程,要么是可用的,只有这两种状态,资源不可以被共享使用)
2.请求并保持(已经的到资源的进程还可以继续请求新的资源)
3.不可剥夺(我得到的资源,只能我释放别人不能剥夺我的资源)
4.环路等待(互相等待,谁都不放手,死锁发生时,系统中一定有两个或两个以上的进程组成的一条环路,环路上的每个进程都在等待下一个进程所占有的资源)
防止死锁的办法:
防止死锁只要破坏死锁产生的四个必要条件之一即可。
1.破坏互斥条件
方法:共如果系统资源都能被享,那么就不会进入死锁状态(但是有些资源就不能被同时访问,例如 打印机)
缺点:破坏互斥条件而预防死锁的方法不太可行,而且在有的场合应该保护这种互斥性
2.破坏请求并保持条件
方法:资源请求一次性,也就是进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不运行,一旦投入运行后,这些资源就一直归他所有,也不提出其他资源的请求,这样就不会死锁了
缺点:系统资源被严重浪费,其中有的资源可能仅在运行初期或运行快结束时才会使用,甚至根本不使用,而且会导致饥饿现象,由于个别资源长期被其他进程占用,导致等待该资源的进程迟迟不能开始运行
3.破坏不剥夺条件
方法:当一个已经保持了某些不可剥夺资源的进程,请求新的资源而得不到满足时,必须释放它已经保持的所有资源,待以后重新申请。这意味着,一个进程已占有的资源会被暂时释放,或者说被剥夺了。
缺点:实施起来较为困难,释放已经获得的资源可能导致前一阶段工作的失效,反复的申请和释放资源,会增加系统开销。这种方法常用于状态易于保存和恢复的资源,比如CPU的寄存器及内存资源。一般不试用于打印机这种资源。
4.破坏循环等待条件
方法:为了破坏循环等待条件,可采取顺序分配资源法。首先要给系统中的资源编号,规定每个进程,必须按照编号递增的顺序请求资源。
缺点:按规定申请资源的方法,编号会很麻烦,而且如果新增资源如何解决等等,也必然会给用户带来麻烦
由上可看出防止死锁,往往是不可行的。我们通常采用的是避免死锁。
避免死锁的算法
银行家算法
1.当一个顾客对资金的最大需求量不超过银行家现有的资金时,就可以接纳该顾客
2.顾客可以分期贷款,但是贷款总和不能超过一开始申请的总额
3.暂时不能满足客户需求,对顾客的贷款可以推迟支付,但是总能在有效时间内得到贷款
4.当顾客使用完全部资金时,在一定的时间内归还所有的资金
死锁的解除(了解)
1.资源剥夺法
挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程,但应防止被挂起的进程长时间的不到资源,而处于资源匮乏的状态
2. 撤销进程法
强制撤销部分,甚至全部死锁进程,并剥夺这些进程的资源,撤销的原则可以按照进程优先级和撤销进程代价的高低进行
3.进程回退法
让一个进程回退到足以回避死锁的地方,进程回退时自愿释放资源而不是被剥夺,要求系统保持进程的历史信息。
死锁的检测
(1)画出资源分配图
(2)简化资源分配图
(3)使用死锁定理判断
死锁定理:
如果资源分配图中没有环路,则系统没有死锁
如果资源分配图中有环路,则系统可能有死锁