操作系统之死锁

发表于:2011-11-21 10:15

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:xiazdong    来源:51Testing软件测试网采编

  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、抢占死锁进程资源。

  抢占要抢占谁的又是个问题。自己选呗~而被抢占资源的进程必须回滚到不会发生死锁的时刻。而且不能一直欺负一个进程,这样该进程会发生饥饿。

22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号