什么是死锁?
在一组进程发生死锁的情况下,这组死锁进程中的每一个进程,都在等待另一个死锁进程所占有的资源,或者说每个进程所等待的事件是该组中其他进程释放所占有的所有资源,但由于所有这些进程已都无法运行,因此他们谁也不能释放资源,致使没有任何一个进程可被唤醒。这样这组进程只能无限期的等待下去。由此可以给死锁做出如下定义:如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。
死锁产生的原因:
- 进程竞争资源顺序
- 进程间推进不当
死锁产生的四个必要条件:
- 互斥条件。进程对所分配到的资源进行排它性使用,即在一段时间内,某资源只能被一个进程占用。如果此时还有其他进程请求资源,则请求进程只能等待,直到占有该资源的进程用毕释放。
- 请求和保持条件。进程已经保持了至少一个资源,但又提出新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
- 不可强占资源。进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完成时由自己释放。
- 循环等待条件。在发生死锁时,必然存在一个进程——资源的循环链,即进程集合{p0,p1,p2..pn}中的p0正在等待一个P1占用的资源,p1正在等待p2占用的资源.......,pn正在等待已被p0占用的资源。
如何避免死锁,常见算法与原理
- 预防死锁
- 破坏“请求和保持”条件
- 破坏“不可抢占”条件
- 破坏“循环等待"条件
- 利用银行家算法
为使用银行家算法,每一个新进程在进入系统时,他必须申明在运行过程中,可能要每种资源类型的最大单元数目,其数目不应超过系统所拥有的资源总量。当进程请求一组资源时,系统必须首先确定是否有足够的资源分配给该今进程。若有,再进一步计算在将这些资源分配给进程后,是否会使系统处于不安全状态。如果不会,才将资源分配给它,否则让进程等待。
银行家算法中的数据结构:
- 可利用资源向量Available
- 最大需求矩阵Max
- 已分配资源矩阵Allocation
- 需求矩阵Need
银行家算法步骤:
设Request(i)是进程Pi的请求向量,如果Request(i)[j]=K;表示进程P(i)需要K个R(j)类型的资源。当P(i)发出资源请求后,系统按照下述步骤进行检查。
- 如果Request(i)[j]<=Need[i,j],便转向下一个步骤;否则认为出错,因为它所需要的资源数已超过它所宣布的最大值。
- 如果Request(i)[j]<=Available[j],便转向下一个步骤,否则,表示尚无足够资源,P(i)须等待。
- 系统试探着把资源分配给进程P(i),并修改以下数据结构中的数值:
Available[j]=Available[j]-Request(i)[j];
Allocation[i,j]=Allocation[i,j]+Request(i)[j];
Need[i,j]=Need[i,j]-Request(i)[j];
3.检测死锁
- 死锁检测算法
4.解除死锁
- 死锁解除算法
- 终止进程的方法:1>终止所有死锁进程。2>逐个终止进程
逐个终止进程考虑的若干因素:
- 进程的优先级大小
- 进程已执行了多少时间,还需多少时间能完成。
- 进程在运行中已经使用资源的多少,以后还需要多少资源
- 进程的性质是交互式的还是批处理式的。