死锁
如果一个进程集合中的每个进程都在等待只能由该进程集合中的其他进程才能引发的事件,那么该进程集合就是死锁的。
死锁的条件(四个同时满足)
互斥:每个资源要么已经分配给一个进程,要么就是可用的;
占有和等待:进程因请求资源而阻塞时,对已获得的资源保持不放;
不可抢占:已经分配的资源不能强制被抢占,只能进程自己释放;
环路等待:存在一种进程资源的循环等待链。
死锁的处理策略
死锁预防:破坏死锁的四个条件之一
破环互斥条件:允许资源共享;
破环占有和等待条件:一次性分配所有资源,只要缺少一个资源,其它资源也都不给他分配;
破坏不可抢占:请求新资源得不到时,释放已经保持占有的资源,待以后重新申请;
破坏环路等待:采用顺序资源分配法,给每个资源编号,进程申请资源的时候按照编号顺序申请,释放的时候则相反;
死锁避免:死锁避免事先预防策略,但是是采用资源动态分配的过程中,防止系统进入不安全状态,以避免死锁。
预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得 较满意的系统性能。由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全的状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。
银行家算法:首先需要定义状态和安全状态的概念。系统的状态是当前给进程分配的资源情况。因此,状态包含两个向量Resource(系统中每种资源的总量)和Available(未分配给进程的每种资源的总量)及两个矩阵Claim(表示进程对资源的需求)和Allocation(表示当前分配给进程的资源)。安全状态是指至少有一个资源分配序列不会导致死锁。当进程请求一组资源时,假设同意该请求,从而改变了系统的状态,然后确定其结果是否还处于安全状态。如果是,同意这个请求;如果不是,阻塞该进程知道同意该请求后系统状态仍然是安全的。
死锁检测与解除:
检测死锁:利用死锁原理化简资源分配图检测死锁的存在
死锁解除:资源剥夺、撤销进程、进程回退
剥夺资源:从其它进程剥夺足够数量的资源给死锁进程,以解除死锁状态; 撤消进程:可以直接撤消死锁进程或撤消代价最小的进程,直至有足够的资源可用,死锁状态.消除为止;所谓代价是指优先级、运行代价、进程的重要性和价值等。