菜鸟求帮助,急求!!!关于银行家算法与动态资源分配的,错误不知道怎么改

落红尘一梦 2012-05-29 08:23:27


用银行家算法实现资源分配。要求:
(1)设计一个3个并发进程共享10个同类资源的系统,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。
(2) 设计用银行家算法和随机分配算法,实现资源分配的两个资源分配程序,应具有显示或打印各进程依次要求申请的资源数以及依次分配资源的情况。
(3) 确定一组各进程依次申请资源数的序列,在相同的情况下分别运行上述两种资源分配程序,观察运行结果。


#include <stdio.h>
#include <fstream.h>
#define countprocess 3
#define countresource 10
#define countresourcekind 3

typedef enum{Ready,Run,Blocked,Finish}STATUS;
typedef struct{
int processnumber;
STATUS status;
int Allocation[countresourcekind];
int Claim[countresourcekind];
int Need[countresourcekind];
}PCB;
PCB Process[countprocess];
int set;//全局变量
FILE *infile1,*infile2;
infile1=fopen("H:\\资源总数表.txt","rt");
infile2=fopen("H:\\资源请求表.txt","rt");
if(!infile1)
{
cout<<"资源总数表未成功打开!\n"<<endl;
return 0;
}
cout<<"资源总数表**************\n"<<endl;
int availible[countresourcekind];
for(int i=0;i<countresourcekind;i++)
{
fscanf(infile1,"%d",&availible[i]);
cout<<availible[i]<<endl;
}
cout<<"\n"<<endl;
fclose(infile1);
if(!infile2)
{
cout<<"资源请求表未成功打开!\n"<<endl;
return 0;
}
int resourcerequest[countprocess][countresourcekind];
cout<<"资源请求表**************\n"<<endl;
for(i=0;i<countprocess;i++)
{
for(j=0;j<countresourcekind;j++)
{
fscanf(infile2,"%d",&resourcerequest[i][j]);
cout<<resourcerequest[i][j]<<endl;
}
cout<<"\n"<<endl;
}
fclose(infile2);
//声明函数
void InitProcess();
void bankermake();
void suijimake();
void Test();
void bijiao();


int main()
{
InitProcess();//初始化PCB
bankermake();
suijimake();
return 0;
}

void InitProcess()//初始化函数
{

for(int i=0;i<countprocess;i++)
{
process[i].processnumber=i+1;
process[i].status=Ready;
for(int j=0;j<countresourcekind;j++)
{
process[i].Allocation[j]=0;
process[i].Claim[j]=resourcerequest[i][j];
process[i].Need[j]=0;
}

}
}


int bankermake()//银行家算法
{
int i=0,j;
FILE *infile3;
infile3=fopen("H:\\动态申请表.txt","rt");
if(!infile3)
{
cout<<"动态申请表未成功打开!"<<"\n"<<endl;
return 0;
}
fscanf(infile3,"%d",&set);
for(i=0;i<countresourcekind;i++)
{
fscanf(infile3,"%d",&process[set-1].Need[i]);
}
cout<<"\n"<<endl;
fclose(infile3);
cout<<"进程%d依次请求各资源的个数为%d,%d,%d"<<set,process[set-1].Need[0],process[set-1].Need[1],process[set-1].Need[2]<<"\n"<<endl;


for(int i=0;i<countresourcekind;i++)//判断该请求是否满足小于最大请求数的原则,若满足,往下执行
{
if(process[set-1].Need[i]>process[set-1].Claim[i])
{
cout<<"该请求不合法,请重新输入!"<<endl;
return 0;
}
}
for(i=0;i<countresourcekind;i++)//判断该请求是否满足小于当前系统可用资源的原则,若满足,往下执行
{
if(process[set-1].Need[i]>process[set-1].availible[i])
{
cout<<"该请求不能立即被响应,请耐心等待!"<<endl;
process[set-1].status=Blocked;
}
for(i=0;i<countresourcekind;i++) //试分配
{
process[set-1].Allocation[i]=process[set-1].Allocation[i]+process[set-1].Need[i];
availible[i]=availible[i]-process[set-1].Need[i];
}

bool possible=true;//检测分配之后状态是否安全
int currentavail[countresourcekind];

for(i=0;i<countresourcekind;i++)
{
currentavail[i]=availible[i];
}

//安全测试函数
while(!process[set-1])
{
i=0;j=0;
if(process[i].Claim[j]-process[i].Allocation[j]<=currentavail[i])
{
process[i].Allocation[j]=process[i].Allocation[j]-process[i].Need[j];
process[i].availible[j]=process[i].availible[j]+process[i].Need[j];
currentavail[i]=currentavail[i]+process[i].Allocation[j];
process[i].Claim[1]=0;process[i].Claim[2]=0;process[i].Claim[3]=0;
process[i].status=Finish;
}
else
{
possible=false;
return 0;
}
}
for(i=0;i<countprocess;i++)
{
if(process[i].status=!Finish)
else
{
possible=false;
}
}
if(possible=false)//若是不安全状态,则收回资源,不予以分配,将进程置为等待态
{
for(i=0;i<countresourcekind;i++)
{
process[set-1].Allocation[i]=process[set-1].Allocation[i]-process[set-1].Need[i];
process[set-1].availible[i]=process[set-1].availible[i]+process[set-1].Need[i];
process[set-1].status=Blocked;
}
}
return 0;
}



void suijimake(Process[countprocess])//随机分配算法
{
FILE *infile4;
infile4=fopen("H:\动态申请表.txt","rt");
if(!infile4)
{
cout<<"动态申请表未成功打开!"<<endl;
return 0;
}
fscanf(infile4,"%d",&set);
for(int i=0;i<countresourcekind;i++)
{
process[set-1].Need[i]=infile4.getchar;
}
process[set-1].status=Runing;
cout<<"进程%d依次请求各资源的个数为%d,%d,%d"<<set,process[set-1].Need[0],process[set-1].Need[1],process[set-1].Need[2]<<endl;
//判断系统现存资源数量是否能满足该进程的请求
process[set-1].Need[i]=need[countresourcekind]
bool miss=true;
for(i=0;i<countresourcekind;i++)
if(process[set-1].Need[i]>process[set-1].availible[i])
{
miss=false;
}

if (miss==true)//如果请求资源的愿望能被满足的情况。。。
{
cout<<"满足该请求!"<<endl;
for(i=0;i<countresourcekind;i++)
{
process[set-1].Allocation[i]=process[set-1].Allocation[i]-process[set-1].Need[i];
process[set-1].availible[i]=process[set-1].availible[i]+process[set-1].Need[i];
}
for(i=0;i<countresourcekind;i++)//检查该进程是否得到了全部所需资源,若不是,则返回去重新执行
{
if(process[set-1].Allocation[i]!=process[set-1].Claim[i])
suijimake();
}
for(i=0;i<countresourcekind;i++)//若是,则归还该进程所占有的全部资源,并设置进程状态为完成态
{
availible[i]=availible[i]+process[set-1].Allocation[i];
availible[i]=0;
}
process[set-1].status=Finish;
for(i=0;i<countprocess;i++)//检查处于等待态的进程,如果当前系统资源能够满足所需资源数量,则将状态改为Ready
{
for(j=0;j<countresourcekind;j++)
{
if(process[i].status=Blocked and process[i].Need[j]<=process[i].availible[j])
{
process[i].status=Ready;
}
}
}
for(i=0;i<countprocess;i++)//检查是否所有的进程都处于完成态
{
if(process[i].status!=Finish)//若还有进程没执行完,则
{
for(i=0;i<countprocess;i++)//继续检查是否还有Ready态的进程
{
if(process[i].status==Ready)
{
suijimake();//如果还存在Ready态的进程,返回重新执行一遍
}
else//如果目前已经没有Ready态的进程,则表示已经产生死锁
{
cout<<"随机分配算法产生了死锁!"<<endl;
return 0;
}
}
}
}
cout<<"随机分配算法没有产生死锁!"<<endl;//所有进程都执行完了,在屏幕上显示随机分配效果
return 0;
}

else//如果请求资源的愿望不能被满足的情况。。。
{
process[set-1].status=Blocked;//置进程状态为等待态,PCB中申请量已登记
for(i=0;i<countprocess;i++)//检查是否还有Ready态的进程
{
if(process[i].status==Ready)
{
suijimake();//如果还存在Ready态的进程,返回重新执行一遍
}
else//如果目前已经没有Ready态的进程,则表示已经产生死锁
{
cout<<"随机分配算法产生了死锁!"<<endl;
return 0;
}
}
}

}

//void Test() //安全测试函数
{
while(!process[set-1])
{
i=0;j=0;
if(process[i].Claim[j]-process[i].Allocation[j]<=currentavail[i])
{
process[i].Allocation[j]=process[i].Allocation[j]-process[i].Need[j];
process[i].availible[j]=process[i].availible[j]+process[i].Need[j];
currentavail[i]=currentavail[i]+process[i].Allocation[j];
process[i].Claim[1]=0;process[i].Claim[2]=0;process[i].Claim[3]=0;
process[i].status=Finish;
}
else
{
possible=false;
return 0;
}
}
for(i=0;i<countprocess;i++)
{
if(process[i].status=!Finish)
else
{
possible=false;
}
}
return possible;
}//

//void bijiao(int need[countresourcekind])//判断函数函数1
{
process[set-1].Need[i]=need[countresourcekind]
bool miss=true;
for(i=0;i<countresourcekind;i++)
if(process[set-1].Need[i]>process[set-1].availible[i])
{
miss=false;
}
return false;
}
}//





//for(i=0;i<countprocess;i++)
{
for(j=1;j<=countresourcekind;j++)
{
int sum=0;
sum=sum+resourcerequest[i][j];
if(sum>countresource)
{
cout<<"输入数据有误,请重新输入!"<<endl;
return 0;
}
else cout<<""<<endl;
}
}//
...全文
209 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
tjzkangpeng 2012-06-02
  • 打赏
  • 举报
回复
代码太多了!~
wutongsana 2012-06-01
  • 打赏
  • 举报
回复
发这么多代码,一般都没人看的。

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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