死锁产生机制和预防方法

死锁:如果两个或更多进程永久的等待某个事件,而该事件只能由这些等待进程的某一个进程引起,那么就会出现死锁状态。
7.1系统模型
     进程在使用资源前必须申请资源,使用完资源后必须释放资源。在正常模式下,进程只能按照以下顺序使用资源:
     ①申请:如果申请不被立即允许,那么它必须等待,直到它获得该资源。
     ②使用:进程对资源进行操作
     ③释放:进程释放资源
     死锁进程既可以发生于不同资源间也可以发生于相同类型资源。
7.2死锁特征
     7.2.1必要条件:
          ①互斥:至少有一个资源处于非共享模式,即一次只能由一个进程使用。如果另一进程申请该资源,那么申请进程必须等到该资源被释放为止。
          ②占有并等待:一个进程至少占有一个资源,并等待另一资源,而该资源被其他进程所占有。
          ③非抢占:资源不能被抢占,即资源只有当进程完成任务后主动释放。
          ④循环并等待:有一组等待进程{P0,P1...Pn},P0等待P1占有的资源,P1等待P2占有的资源....Pn等待P资源。
          只有当四个条件同时满足时才会出现死锁状态。
 
     7.2.2资源分配图
 
        该图由一组进程P={P1,P2....Pn}和一组资源R={R1,R2...Rn}构成。
          申请边:Pi->Rj  表示进程Pi申请资源Rj。
          分配边:Ri->Pj  表示资源Ri分配给了进程Pj。
          在图上用圆形表示进程,矩形表示资源类型,矩形里面的点表示具体资源实例。申请边从进程开始指向矩形,分配边从矩形中的点开始指向进程。
          由资源分配图可以看出,如果分配图没有环,则系统不存在死锁,系统可能存在死锁(如果每个资源类型只有一个实例则存在死锁,若有多个实例则可能不存在死锁)。
7.3死锁处理方法
     从原理上说有三种处理死锁的方法:
     可使用协议以预防或避免死锁,确保系统不会进入死锁状态。
     可允许系统进入死锁状态,然后检测它,再修复。
     可忽视这个问题,认为系统不会发生死锁。
     第三种方法目前被绝大多数系统采用,因此应用开发人员应该自己处理死锁问题。
7.4死锁预防
          死锁出现需要满足四个必要条件,只要破坏其中一个条件即可预防死锁发生。
     7.4.1互斥
          共享资源不要求互斥,因此不会出现死锁。对于非共享资源,必须要有互斥。因此通常不能通过否定互斥条件来预防死锁:有些资源本身是非共享的。
     7.4.2占有并等待
          为了确定占有并等待不会出现在系统中,必须保证:当一个进程在申请资源时不能占有其他资源。
          ①进程在执行任务前一次性申请所有资源
          ②允许进程在没有资源时才可以申请资源,即在它申请更多资源时必须先释放已占有的资源。
          例如,一个进程要从DVD驱动器中复制数据到磁盘中并在磁盘对数据进行排序,然后打印到打印机上。第一种方法是进程在开始任务前则需要申请DVD驱动器,磁盘,打印机。
          第二种方法是先申请DVD驱动器和磁盘,将数据从DVD驱动器复制到磁盘并排好序后,再释放DVD驱动器和磁盘,然后再申请磁盘和打印机,将排好序的结果打印在打印机上。
     7.4.3非抢占
          破坏非抢占可使用协议:如果一个进程占有资源并申请其他不能立即分配的资源,那么其已占有的资源可被抢占。相当于这些资源被隐式的释放了。
          也就是说,当一个进程申请资源时,先检查资源是否可用,若可用,则立即分配它们;若不可用,则检查该资源是否被等待其他资源的进程所占有,如果是则从等待进程抢占这些资源,分诶给申请进程。如果资源不可用且不                                                                                                                                               被等待进程占有,那么申请进程只有等待。  
          这个协议只能用于状态可以保存和恢复的资源,如CPU寄存器和内存。
     7.4.4循环等待
          对所有资源类型进行完全排序,且要求每个进程按递增顺序申请资源。若需要同一资源类型的多个实例,则它们必须一起申请。若一个进程需要申请资源类型Rj时,那么它必须先释放所有的Ri(F(Ri)>=F(Rj)).
7.5死锁避免
     7.5.1安全状态
          系统能按某种顺序为每个进程分配资源(不超过其最大值)并能避免死锁,那么系统状态就是安全的。
          安全序列:一个进程顺序<P1,P2,...,Pn>,如果对每个Pi,Pi仍然可申请的资源数小于当前可用资源加上所有进程Pj(其中就(j<i)占有的资源,那么这一顺序称为安全序列。在这种情况下,进程Pi所需的资源可能不能马上被分配,但是Pi可等待直到所有Pj释放其占有的资源。
     7.5.2资源分配图算法
          此算法适合于每种资源类型只有一个实例的情况。在资源分配图的基础上在加一条需求边以用于死锁避免。
          需求边Pi-->Rj表示进程Pi在未来某个时间会申请资源Rj。
          系统必须事先说明所要求的资源,所有需求边必须先处于资源分配图中。可放宽此条件,当进程Pi的所有相关边为需求边时才将Pi-->Rj加入到资源分配图中。
          若资源分配图中没有环,则系统处于安全状态;若系统有环,则分配会导致系统处于不安全状态。
     7.5.3银行家算法
            uploading.4e448015.gif转存失败重新上传取消    uploading.4e448015.gif转存失败重新上传取消    uploading.4e448015.gif转存失败重新上传取消
7.6死锁检测
     7.6.1每种资源只有单个实例——等待图
           uploading.4e448015.gif转存失败重新上传取消
          删除资源分配图中的所有资源节点,合并相应的边,就可以得到等待图。
         当且仅当资源分配图中存在Pi->Rj和Rj->Pk两条边,则将Rj节点删除,并合并相应的边得到Pi->Pk,表示进程Pi正在等待Pj占有的一个资源。
          当且仅当等待图中有环时,则系统存在死锁。此检测算法的复杂度为O(n2),n为进程节点数。 
     7.6.2每种资源有多个实例——与银行家算法相似
7.7死锁恢复
     7.7.1进程终止
          终止所有进程:代价大,有些进程可能计算了很长时间,这部分计算以后可能还需要重新计算。
          一次只终止一个进程直到取消死锁循环为止:开销较大,因为每终止一个进程都必须调用死锁检测算法以确定进程是否仍处于死锁状态。
     7.7.2资源抢占
          通过抢占资源以取消死锁,逐步从进程中抢占资源供其它进程使用,直到死锁被打破。
          需要处理三个问题:
               选择一个牺牲品:必须确定抢占哪些进程的哪些资源以及抢占顺序以使代价最小化。代价因素包括 死锁进程拥有的资源数量,死锁进程运行的时间。
               回滚:为了使被抢占资源的进程能够重启,必须使进程回滚到一个安全状态,然而确定一个安全状态并不容易。最简单的回滚方法就是终止进程,更有效的回滚方法就是回滚到打破死锁状态。
                         这种方法需要维护有关运行进程状态的更多信息。
               饥饿:如何保证资源不总是从同一个进程抢占?若系统是基于代价来选择牺牲品的,那么可能总是选择同一进程。最常用的解决方法则是在代价因素上加上回滚次数。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值