操作系统的相关问题 死锁检测!!

kiviren 2012-04-17 11:23:00
#include<stdio.h>
#include<iostream.h>
#include<string.h>


const int MAXQUEUE=100;//定义表的最大行数


typedef struct node
{
int resource;
int process;
}cell; //边的结构(一个资源节点、一个进程节点)


cell occupy[MAXQUEUE];//分配边数组
int occupy_quantity; //分配边的数量
cell wait[MAXQUEUE]; //申请边数组
int wait_quantity; //申请边的数量


//初始化函数
void initial()
{
int i;
for(i=0;i<MAXQUEUE;i++)
{
occupy[i].process=-1;
occupy[i].resource=-1;
wait[i].process=-1;
wait[i].resource=-1;
}
occupy_quantity=0;
wait_quantity=0;
}


//读数据文件
int readData()
{
FILE *fp;
char fname[20];
int i;
cout<<"请输入资源分配表文件的文件名:"<<endl;
//strcpy(fname,"d:\tmp\trouble1.txt");
cin>>fname;
if((fp=fopen(fname,"r"))==NULL)
{
cout<<"错误,文件打不开,请检查文件名:"<<endl;
return 0;
}
else
{
while(!feof(fp))
{
fscanf(fp,"%d %d",&occupy[occupy_quantity].resource,&occupy[occupy_quantity].process);
occupy_quantity++;
}
}

cout<<"请输入进程等待表文件的文件名:"<<endl;
//strcpy(fname,"d:\tmp\trouble2.txt");
cin>>fname;
if((fp=fopen(fname,"r"))==NULL)
{
cout<<"错误,文件打不开,请检查文件名:"<<endl;
return 0;
}
else
{
while(!feof(fp))
{
fscanf(fp,"%d %d",&wait[wait_quantity].process,&wait[wait_quantity].resource);
wait_quantity++;
}
}

//输出所读入的数据
cout<<endl<<endl<<"输出所读入的数据"<<endl;
cout<<"━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
cout<<"资源分配表"<<endl;
cout<<"资源编号 进程编号"<<endl;


for(i=0;i<occupy_quantity;i++)
{
cout<<" "<<occupy[i].resource<<" "<<occupy[i].process<<endl;
}

cout<<"━━━━━━━━━━━━━━━━━"<<endl;
cout<<"资源分配表"<<endl;
cout<<"资源编号 进程编号"<<endl;

for(i=0;i<wait_quantity;i++)
{
cout<<" "<<wait[i].resource<<" "<<wait[i].process<<endl;
}
return 1;
}


//检测
void check()
{
int table[MAXQUEUE][MAXQUEUE];
int table1[MAXQUEUE][MAXQUEUE];

int i,j,k;
int flag,t,p;
int max_process;

//初始化表格
for(i=1;i<MAXQUEUE;i++)
{
for(j=1;j<MAXQUEUE;j++)
{
table[i][j]=0;
table1[i][j]=0;
}
}
//先找到进程最大编号
max_process=-1;
for(i=1;i<occupy_quantity;i++)
{
if(occupy[i].process>max_process)
{
max_process = occupy[i].process;
}
}
for(i=1;i<wait_quantity;i++)
{
if(occupy[i].process>max_process)
{
max_process = wait[i].process;
}
}

for(i=1;i<wait_quantity;i++)
{
for(j=1;j<occupy_quantity;j++)
if(wait[i].resource==occupy[i].resource)
{
table[wait[i].process][occupy[j].process]=1;
table1[wait[i].process][occupy[j].process]=1;
}
}

cout<<"初始等待占用表:"<<endl;
for(i=1;i<max_process+1;i++)
{
for(j=1;j<max_process+1;j++)
{
cout<<table[i][j]<<"";
}
cout <<endl;
}

for(i=1;i<max_process+1;i++)
{
for(j=1;j<max_process+1;j++)
{
for(k=1;k<max_process+1;k++)
{
table[i][j]=table[i][j]||(table[i][k]&&table[k][j]);
}
}
}
cout<<"检测后的等待占用表"<<endl;

for(i=1;i<max_process+1;i++)
{
for(j=1;j<max_process+1;j++)
{
cout<<table[i][j]<<""<<endl;
}
}
flag=-1;
for(i=1;i<max_process+1;i++)
{
if(table[i][j]==1)
{
flag=i;
break;
}
}
cout<<endl<<endl<<"检测结果"<<endl;
cout<<"----------------"<<endl;
if(flag!=-1)
{
cout<<"存在死锁"<<endl;
cout<<"进程循环等待队列:";
p=flag;//存在进程循环等待队列的那一进程
//进程循环等待队列中的所有进程是table表中的这一行是1的进程,只是顺序要在确定
//及该进程无法运行,则其他它后面的进程也无法运行
t=1;
while(t)
{
cout<<p<<"";
for(j=1;j<max_process+1;j++)
{
if(table1[p][j]==1)
{
if(table[j][flag]==1)
{
p=j;
break;
}
}
}
if(p==flag) t=0;//出现节点的重复/即环,结束
}
cout<<flag<<endl;
}
else
{
cout<<"不存在死锁"<<endl;
}
}

//显示版本权信息函数

void version()
{
cout<<endl<<endl;
cout<<"┏━━━━━━━━━━━━━━━━━━┓"<<endl;
cout<<"┃ 死 锁 检 测 算 法 ┃"<<endl;
cout<<"┣━━━━━━━━━━━━━━━━━━┫"<<endl;
cout<<"┃ (c)All Right Reserved SWPU ┃"<<endl;
cout<<"┃ version 2007 build 1021 ┃"<<endl;
cout<<"┗━━━━━━━━━━━━━━━━━━┛"<<endl;
cout<<endl<<endl;
}
void main()
{
int flag;
version();
initial();
flag=readData();
if(flag)check();
}





这个程序具体怎么运行???求高手解释!!
...全文
138 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧