关于死锁的预防,产生,解决的方法
2017-03-30 21:20
323 查看
死锁现象:
在一组资源中,由于每个人物都占用着若干资源,同时又在等待其他任务所占用的资源,从而造成所有任务都无法进展下去的现象,这种现象称之为死锁。这样的一组任务称之为死锁任务。在死锁状态下,每个任务都动弹不得,既无法去释放所占用的资源,他们互为因果、相互等待。
产生死锁的原因:(1)竞争系统资源 (2)进程的推进顺序不当
产生死锁的四个必要因素:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
解决死锁的基本方法:
预防死锁:
资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
避免死锁:
预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得 较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全的状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。
银行家算法:首先需要定义状态和安全状态的概念。系统的状态是当前给进程分配的资源情况。因此,状态包含两个向量Resource(系统中每种资源的总量)和Available(未分配给进程的每种资源的总量)及两个矩阵Claim(表示进程对资源的需求)和Allocation(表示当前分配给进程的资源)。安全状态是指至少有一个资源分配序列不会导致死锁。当进程请求一组资源时,假设同意该请求,从而改变了系统的状态,然后确定其结果是否还处于安全状态。如果是,同意这个请求;如果不是,阻塞该进程知道同意该请求后系统状态仍然是安全的。
检测死锁
有两个容器,一个用于保存线程正在请求的锁,一个用于保存线程已经持有的锁。每次加锁之前都会做如下检测:
1)检测当前正在请求的锁是否已经被其它线程持有,如果有,则把那些线程找出来
2)遍历第一步中返回的线程,检查自己持有的锁是否正被其中任何一个线程请求
如果第二步返回真,表示出现了死锁
解除死锁:
当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。
在一组资源中,由于每个人物都占用着若干资源,同时又在等待其他任务所占用的资源,从而造成所有任务都无法进展下去的现象,这种现象称之为死锁。这样的一组任务称之为死锁任务。在死锁状态下,每个任务都动弹不得,既无法去释放所占用的资源,他们互为因果、相互等待。
产生死锁的原因:(1)竞争系统资源 (2)进程的推进顺序不当
产生死锁的四个必要因素:
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
解决死锁的基本方法:
预防死锁:
资源一次性分配:一次性分配所有资源,这样就不会再有请求了:(破坏请求条件)
只要有一个资源得不到分配,也不给这个进程分配其他的资源:(破坏请保持条件)
可剥夺资源:即当某进程获得了部分资源,但得不到其它资源,则释放已占有的资源(破坏不可剥夺条件)
资源有序分配法:系统给每类资源赋予一个编号,每一个进程按编号递增的顺序请求资源,释放则相反(破坏环路等待条件)
避免死锁:
预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得 较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全的状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。
银行家算法:首先需要定义状态和安全状态的概念。系统的状态是当前给进程分配的资源情况。因此,状态包含两个向量Resource(系统中每种资源的总量)和Available(未分配给进程的每种资源的总量)及两个矩阵Claim(表示进程对资源的需求)和Allocation(表示当前分配给进程的资源)。安全状态是指至少有一个资源分配序列不会导致死锁。当进程请求一组资源时,假设同意该请求,从而改变了系统的状态,然后确定其结果是否还处于安全状态。如果是,同意这个请求;如果不是,阻塞该进程知道同意该请求后系统状态仍然是安全的。
检测死锁
有两个容器,一个用于保存线程正在请求的锁,一个用于保存线程已经持有的锁。每次加锁之前都会做如下检测:
1)检测当前正在请求的锁是否已经被其它线程持有,如果有,则把那些线程找出来
2)遍历第一步中返回的线程,检查自己持有的锁是否正被其中任何一个线程请求
如果第二步返回真,表示出现了死锁
解除死锁:
当发现有进程死锁后,便应立即把它从死锁状态中解脱出来,常采用的方法有:
剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态;
撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。
相关文章推荐
- 关于ConcurrentModificationException的产生原因和解决方法
- 产生死锁的必要条件和解决方法
- Java多线程产生死锁的条件以及解决方法
- 关于恢复出厂后出错的原因分析及解决与预防的方法
- 产生死锁的原因和必要条件+解决死锁的基本方法
- Linux之死锁产生条件&解决方法
- 产生死锁的原因和必要条件+解决死锁的基本方法
- 死锁的产生、预防、以及接触方法整理,一目了然
- 产生死锁的原因和必要条件+解决死锁的基本方法
- 产生死锁的必要条件以及解决的方法
- 死锁产生的原因和必要条件及预防死锁的方法及死锁的检测与解除
- 产生死锁的原因和必要条件+解决死锁的基本方法
- MySQL死锁问题实例分析及解决方法(主要是SQL语句可能会产生的问题)
- MSSQL产生死锁的根本原因及解决方法
- 关于android studio项目构建时产生各种问题的解决方法
- MSSQL死锁产生原因及解决方法
- Java多线程产生死锁的原因和解决方法
- 产生死锁的原因和必要条件+解决死锁的基本方法
- 产生死锁的原因和必要条件+解决死锁的基本方法
- 死锁产生的原因和必要条件及预防死锁的方法及死锁的检测与解除