2、允许进入死锁,但可以检测并恢复。
3、忽略死锁。
银行家算法: 银行有一些资源,一个客户一会要一点资源,一会要一点资源,银行耐着性子分配。 预先知道Max,Allocation,Available
在新进程进入时,必须说明需要资源类型的种类和数量,但是不能超过系统总资源。
n为进程个数,m为资源类型种类,available为长度为m的向量,表示每种资源拥有多少的资源。
Max是n*m的矩阵,Max[i]表示特定进程需要的每个资源的最大需求。
Allocation是n*m的矩阵,Allocation[i]表示特定进程已经分配的每个资源的数量。
Need是n*m的矩阵,Need[i]是特定进程需要的剩余资源。
两个向量比较,只有每个分量都大,才大。
安全性算法:
设work是长度m的向量,finish是长度n的向量
work=available; for(int i=0;i<n;i++) finish[i]=false; for(int i=0;i<n;i++) O(n) { if(finish[i]==false&&Need[i]<work) O(m) //如果进程i的最大剩余需求小于系统剩余的资源量 { work=work+allocation[i]; O(m) //执行完后释放,则系统剩余资源变多 finish[i]=true; //进程i执行结束 } else break; } for(int i=0;i<n;i++) { if(finish[i]==false) return false; } return true; |
资源请求算法:
Request[i]是进程i的请求向量。
if Request[i]<Need[i] 说明能申请
if Request[i]<Available 说明能分配
if能分配
{
Available-=Request[i]; //系统剩余减少
Allocation[i]+=Request[i]; //已分配增多
Need[i]-=Request[i]; //剩余需求减少
}
分配完执行安全性算法,即看看是不是安全。
系统不采用预防或避免提前去除死锁时,可以
1、有一个算法可以检索死锁的发生。
2、有一个算法可以让死锁恢复。
当资源类型只有一个资源实例时,可以用等待图(只有进程)解决。当有环时,则死锁。
当资源类型可以有多个实例时,则可以用银行家算法解决。
有一个好办法解决死锁,就是当CPU使用率低于多少多少时,才调用死锁检测,再去除死锁。
恢复死锁可以:
1、随便终止一个进程打破循环等待。
当选择进程的终止时,需要考虑很多方面,就像CPU调度里的优先队列法,可以以不同方面考虑优先。可以以进程执行时间、进程还需资源多少、进程是交互的还是批处理的。
2、抢占死锁进程资源。
抢占要抢占谁的又是个问题。自己选呗~而被抢占资源的进程必须回滚到不会发生死锁的时刻。而且不能一直欺负一个进程,这样该进程会发生饥饿。