死锁

来源:互联网 发布:java 生成流程图 编辑:程序博客网 时间:2024/06/10 22:32
一:死锁的概念
      1.多个进程争取同一份资源,若无外力作用,这些进程就无法向前推进,陷入僵局。
      例如线程A和线程B同时申请对方的锁但是都在等对方释放锁然后进程就不会再前进,陷入僵局。  或者同一个进程先后两次调用lock,也会陷入死锁。
二、产生死锁的根本原因和必要条件
     1.根本原因:
      竞争资源和进程推进顺序非法。
     2.产生死锁的必要条件
      互斥条件   请求保持条件    不剥夺条件    环路等待条件等。
三、对死锁问题的解决方案
      预防死锁,避免死锁,发现死锁和解除死锁。
      1.预防死锁通常采用资源独占(静止分配法)
      资源独占:
      例如有一个度假山庄,土豪级别,一次只能进去一个人享受,有一天多个土豪来了,都想要进去玩,管理员只会让一个人进去,其他的人按某种顺序在外面等待,直到刚进去的这个人出来,才会轮到下一个人,则这种机制就叫资源独享。 资源独享就不会出现死锁情况。
      2.破坏死锁产生的第三个必要条件:采用资源顺序分配
      资源顺序分配:
      例如每个线程申请锁时,按照一定的顺序申请:A锁、B锁、C锁,比如一个别墅每个门只有一把钥匙,共有有三个门,拿到大门钥匙才可以拿到屋子钥匙才能拿到房间(第三把钥匙),这样只要拿到了第一把钥匙,就能拿到第三把钥匙,如果一个人拿到了第一把钥匙,其他人也不会拿到第二把或者第三把钥匙,就不会出现有拿到大门钥匙的人进去之后发现第二把钥匙在别人手里而进不了屋子,都在等别人把资源(钥匙)给他,而陷入僵局状态。资源顺序分配可以有效避免死锁的产生。
     3.破坏死锁产生的第四个必要条件:
     采用资源受控动态分配避免死锁,采用这个方法必须事先知道每个进程在运行之前对每个资源的最大申请量。
四、解除死锁
    1.死锁解锁的实质是如何让释放资源的进程能够继续运行。
     2.解除死锁常采用资源剥夺法和撤销进程法。
     当发现有进程死锁后,便立即把它从死锁状态中解脱出来:
     (1)剥夺资源 从其他进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
     (2)撤销进程  可以直接撤销死锁进程或撤销代价最小的进程,直至有足够的资源可用,死锁状态消除为止,所谓代价是指优先级、运行代价、进程的重要性和价值等。
五、常见避免死锁的算法
      1.利用银行家算法避免死锁
      Dijkstra的银行家算法是最有代表性的避免死锁的算法。
      2.银行家算法中的数据结构
1)可利用资源向量Available是个含有m个元素的数组,其中的每一个元素代表一类可利用的资源数目。如果Available[j]=K,则表示系统中现有Rj类资源K个。2)最大需求矩阵Max这是一个n×m的矩阵,它定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max[i,j]=K,则表示进程i需要Rj类资源的最大数目为K。3)分配矩阵Allocation这也是一个n×m的矩阵,它定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation[i,j]=K,则表示进程i当前已分得Rj类资源的 数目为K。4)需求矩阵Need。这也是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。如果Need[i,j]=K,则表示进程i还需要Rj类资源K个,方能完成其任务。Need[i,j]=Max[i,j]-Allocation[i,j]
       3.银行家算法
在避免死锁的方法中,所施加的限制条件较弱,有可能获得令人满意的系统性能。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。银行家算法的基本思想是分配资源之前,判断系统是否是安全的;若是,才分配。它是最具有代表性的避免死锁的算法。设进程cusneed提出请求REQUEST [i],则银行家算法按如下规则进行判断。(1)如果REQUEST [cusneed] [i]<= NEED[cusneed][i],则转(2);否则,出错。(2)如果REQUEST [cusneed] [i]<= AVAILABLE[i],则转(3);否则,等待。(3)系统试探分配资源,修改相关数据:AVAILABLE[i]-=REQUEST[cusneed][i];ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];NEED[cusneed][i]-=REQUEST[cusneed][i];(4)系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。


   
 






原创粉丝点击