| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 525 人关注过本帖
标题:求教一个关于死锁的问题
只看楼主 加入收藏
luxianglinlu
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-1-24
结帖率:0
收藏
已结贴  问题点数:20 回复次数:1 
求教一个关于死锁的问题
#include<stdio.h>
int Available[10];      //可用
int Allocation[10][10]; //已分配
int Max[10][10];  //进程最大需求数
int Need[10][10]; //尚需资源
int Request[10][10]; //请求资源
int Work[10]; //工作向量
int Finish[10]; //表示系统是否有足够的资源分配给进程,true为是
int p[10];  //用于存储安全序列
int All[10];
int sum[10];
int i,j;   //i表示进程,j表示资源
int n,m;  //n为进程i的数量,m为资源j种类数
void chushihua()
{

    printf("输入进程数量n:");
    scanf("%d",&n);
    printf("\n输入资源种类数m:");
    scanf("%d",&m);
    printf("\n");
   
    for( i=0;i<n;i++)   //初始每个进程资源状态为false
         p[i]=0;
    printf("输入可用资源Available[%d]\n",&m);
    for(j=0;j<m;j++)
        {            
            printf("  ");
            scanf("%d",&Available[j]);
            Work[j]=Available[j];   
            printf("\n");
        }
   
      
    printf("输入已分配矩阵Allocation[%d][%d]:\n",&n,&m);
    for(i=0;i<n;i++)
    {
        for(j=0;j<m;j++)
        {            
            printf("  ");
            scanf("%d",&Allocation[i][j]);
            
            
        }
        printf("\n");
    }
 
    printf("请输入请求矩阵Request[%d][%d]:\n",&n,&m);
    for(i=0;i<n;i++)
    {  
        
        for(j=0;j<m;j++)
        {            
            printf("  ");
            scanf("%d",&Request[i][j]);
            
         printf("\n");
        }
    }
    printf("\n");
    for(i=0;i<n;i++){
       Finish[i]=1;      
       for(j=0;j<m;j++)
       {  
           if(Allocation[i][j]>0||Request[i][j]>0)  
           {  
               Finish[i]=0;
           }  
       }
    }
   

}

int Compare( int i) //比较Request[i]>Work ,成立则返回false  
{

int j,c=0;
for(j=0;j<m;j++)
{   
     if(Request[i][j]>Work[j])  
     {  c++;  }
}
if(c>0)
return 0;
else if(c==0)   
return 1;
}
int Jiance()
{   

     int i,j,flag=1,K=0;
     while(flag==1)  //反复判断,直到无法判断
     {
       flag=0;
       for(i=0;i<n;i++) //对任一进程进行判断
       {
           if(Finish[i]==0&&Compare[i]==1)  //if Request<=Work;释放资源
           {
              for(j=0;j<m;j++) //增加工作向量
              {   
                  Work[j]=Work[j]+Allocation[i][j];  
              }
              Finish[i]=1;
              p[i]=1;   //第i个进程放完资源
              flag=1;
              break;
           }
       }
    }
//若所有的进程都放完,flag肯定为1
    if(flag==0)   
    {
     for(i=0;i<m;i++)
         if(Finish[i]==0)
         { K++; }
    }
   if(K>0)  { return 0;}
   else  if(K==0)      {  return 1;}

}


void Jiechu()         //解除死锁,使用撤销的进程数目最小的方法,死锁进程中占有资源最多的进程撤销
{
      int t;
      int flag=0;
      for(i=0;i<n;i++)  
          sum[i]=0;

      for(i=0;i<n;i++)     //统计死锁资源、释放
          if(p[i]==0)  
          {  
              for(j=0;j<m;j++)
                 sum[i]=sum[i]+Allocation[i][j];
              Allocation[i][j]=0;
          }

      t=sum[0];
      for(i=1;i<n;i++)    //找出最大死锁进程i
          if(t<sum[i]) { t=sum[i];flag=i;}
      
      printf("撤消占资源最大的进程:%d\n",&flag);

      for(j=0;j<m;j++)   //回收资源
          Work[j]=Work[j]+Allocation[flag][j];
      Finish[flag]=1;  //完成flag进程的操作
      p[flag]=0;     //不再对它进行判断
      flag=Jiance(); //判断是否已经解除死锁
      if(flag==1)  {printf("\n成功解除死锁\n");}
      else  Jiechu();     

//如果还没解除,继续放资源
}

   
  

void main()   
{
    printf("死锁检测与解除\n");
    chushihua();
    int flag;  
    flag=Jiance();   //检测死锁
   if(flag==0)
   {
        printf("发生死锁,死锁进程如下:\n");
        for(int i=0;i<n;i++)      //找出死锁进程
          if(p[i]==0)  
              printf("i=%d\n",&i);
        Jiechu();  //解除死锁
        
   }
    else   
    {
       printf("不会发生死锁!\n");
    }
    printf("pause");
}

总是提示错误,小白又不太会改,求大神指教!!!
搜索更多相关主题的帖子: Request include 种类 资源 
2013-06-25 13:45
wyw19880809
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:178
专家分:738
注 册:2013-3-14
收藏
得分:20 
提示什么错误哦???
2013-06-25 14:59
快速回复:求教一个关于死锁的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020606 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved