操作系统 银行家算法 c++如何实现?

lovesoftchina 2009-12-03 08:28:09
鄙人是新手 今遇银行家算法不知如何实现 请高人指点 c++编程高手进 万分感谢
...全文
1691 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuhesheng 2010-03-31
  • 打赏
  • 举报
回复
你在看ls的代码之前,先去看看什么是银行家算法
看懂了你再看代码
要不你会疯掉的

其实代码的原理很简单
pengyong543 2010-03-31
  • 打赏
  • 举报
回复
初始化数据需要键入的有(按顺序输入):

Available:3 3 2

Max:7 5 3 3 2 2 9 0 2 2 2 2 4 3 3

Allocation:0 1 0 2 0 0 3 0 2 2 1 1 0 0 2

(1)P1发出请求Request(1,0,2)

(2)P4发出请求Request(3,3,0)

(3)P0发出请求Request(0,2,0)






///实验名称:死锁的避免--银行家算法/////
///实验时间:2009年10月18日完成,在VC++6.0和WINDOWS XP环境下能够运行成功。////////

/*----------------------------------------------------------------*/
/*---------by----软件1084---赖伟威---200811701414-----------------*/

#include <iostream.h>
#include "stdio.h"
//#include "windows.h"

const unsigned short c = 3;//资源类数
const unsigned short t = 5;//进程数

void Print(); //用于打印输出表格的函数
void Input();//用于输入的函数
void tryfenpei(int i);//试分配函数
void refenpei(int i);//恢复数据函数
void checksafe(int s);//安全检测函数

//定义初始化数组
int Available[c],
Max[t][c],
Allocation[t][c],
Need[t][c],
Request[c];

int in;//用户选择的进程号
/*----------------------------------------------------------------*/
int main(int argc, char *argv[])
{
int i;
char ch='Y';
cout<<"初始化数据"<<endl;
Input();//输入相关数据函数
Print();//打印输出相关数据表函数
cout<<"初始化完成!..."<<endl<<endl<<endl;
do
{
if(ch=='Y'||ch=='y')
{
cout<<"欢迎进入实验!请稍后..."<<endl;
// Sleep(1000);
cout<<"已顺利进入实验..."<<endl;
cout<<"请输入发起请求的进程号(0-4):";
while(cin>>in)
{
if(!(0<=in&&in<=4))
{
cout<<"不存在该进程,请重新输入"<<endl;
}
else break;
};
cout<<"您输入的是 "<<"p["<<in<<"]"<<" 进程"<<endl;
cout<<"该进程需求量为: ";
for(i=0;i<c;i++)
cout<<Need[in][i]<<" ";
cout<<endl;
cout<<"请输入请求资源的数目:";//输入格式为 X
for(i=0;i<c;i++)
{
while(cin>>Request[i])
{
if(Request[i]<0) cout<<"错误!输入的数字无效."<<endl;
else
if(Request[i]>Need[in][i]) cout<<"错误!超出进程需求量"<<endl<<endl;
if(Request[i]>Available[i]) cout<<"错误!系统还没有足够的可用资源量满足进程需要"<<endl<<endl;
else break;
}
}
cout<<"输入成功,您输入的是:"<<Request[0]<<" "<<Request[1]<<" "<<Request[2];
cout<<endl;
cout<<"开始执行银行家算法,下面进行试分配..."<<endl;
tryfenpei(in);//分配函数
//Sleep(1000);
cout<<"试分配完成!"<<endl;
cout<<"进入安全性检测..."<<endl;
//Sleep(1000);
checksafe(in);//安全性检测函数
cout<<"需要继续实验吗?(y-继续 n终止)";
}
else
if(ch=='N'||ch=='n')
{
cout<<"感谢您的使用,祝您愉快!"<<endl<<"正在退出..."<<endl;
break;
}
else
cout<<"输入无效!请重新输入."<<endl;
}
while(cin>>ch);
return 0;
}/*---------------------main函数结束----------------------------------*/


/*-------------------------输出函数----------------------------------*/
void Print()
{
int i,j;
cout<<" 进程个数 : "<<t<<" 资源个数: "<<c<<endl;
cout<<"正在更新数据..."<<endl;
//Sleep(1500);
cout<<"|-----|----------|------------|----------|-----------|"<<endl;
cout<<"|----|最大需求矩阵|已分配矩阵-|-需求矩阵-可用资源向量|"<<endl;
cout<<"|\ 资源| Max | Allocation | Need | Available |"<<endl;
cout<<"| \ | A B C | A B C | A B C | A B C |"<<endl;
cout<<"|进程\ | | | | |"<<endl;
cout<<"|-----|----------|------------|----------|-----------|"<<endl;
for(i=0;i<5;i++)
{
cout<<"| p"<<i<<" | ";
for(j=0;j<3;j++)
{
cout<<Max[i][j]<<" ";
}
cout<<"|";
for(j=0;j<3;j++)
{
cout<<" "<<Allocation[i][j];
}
cout<<" |";
for(j=0;j<3;j++)
{
cout<<" "<<Need[i][j];
}
cout<<" |";
if(i==0)
{
for(j=0;j<3;j++)
{
cout<<" "<<Available[j];
}
cout<<" |";
}
if(i>0)
{
cout<<" |";
}
cout<<endl;
}
cout<<"|-----|----------|------------|----------|-----------|"<<endl;
}/*-------------------------输出函数结束--------------------------------*/


/*--------------------------输入函数----------------------------------*/
void Input()
{
for(int j=0;j<c;j++)
{
cout<<"请输入 Available["<<j<<"]:";
while(cin>>Available[j])
{
if(Available[j]<0)
cout<<"输入数字无效,请重新输入"<<endl;
else break;
};
}
for(int k=1;k<4;k++)//其他三个属性和一次打印输出表
{
for(int l=0;l<t;l++)//五个进程循环输入
{
for(int m=0;m<c;m++)//三个类资源ABC循环输入
{
if(k==1&&m<t)
{
cout<<"请输入 Max["<<l<<"]["<<m<<"]:";
while(cin>>Max[l][m])
{
if(Max[l][m]<0)
cout<<"输入数字无效,请重新输入"<<endl;
else break;
};
}
if(k==2&&m<t)
{
cout<<"请输入 Allocation["<<l<<"]["<<m<<"]:";
while(cin>>Allocation[l][m])
if(Allocation[l][m]<0)
cout<<"输入数字无效,请重新输入"<<endl;
else break;
//cout<<"Allocation["<<l<<"]["<<m<<"]="<<Allocation[l][m]<<endl;
}
if(k==3&&m<t)
Need[l][m]=Max[l][m]-Allocation[l][m];
}
}
}
}//*-------------------------输入函数结束----------------------------------*/

/*-------------------------试分配函数----------------------------------*/
void tryfenpei(int i)
{
for(int f=0;f<c;f++)
{
Available[f] = Available[f] - Request[f];
Allocation[i][f] = Allocation[i][f] + Request[f];
Need[i][f] = Need[i][f]-Request[f];
}
}/*-------------------------试分配函数结束----------------------------------*/

/*-------------------------恢复数据函数----------------------------------*/
void refenpei(int i)
{
for(int f=0;f<c;f++)
{
Available[f] = Available[f] + Request[f];
Allocation[i][f] = Allocation[i][f] - Request[f];
Need[i][f] = Need[i][f]+Request[f];
//cout<<Available[f]<<" "<<Allocation[i][f]<<" "<<Need[i][f]<<endl;
}
}/*-------------------------恢复数据函数结束----------------------------------*/

/*-------------------------安全检测函数----------------------------------*/
void checksafe(int s)
{
int Work,
flag,
temp[t],
i,j,l=0,k=0;
bool Finish[t];
for(i=0;i<t;i++)
Finish[i]=false;
for(j=0;j<3;j++)
{
Work=Available[j];//cout<<"Work="<<Work<<endl;
for(i=0;i<t;i++)
{
if(Finish[i]==true) l++;//用l是否达到5来判断这条进程A类资源或者B类资源是否通过安全检测,C类资源没有经过这里
}
if(l==5)//一共有三类资源A B C,一条进程下面的安全性检测只检测了A类。如果A类通过了,那么还要判断B类,C类。否则不用
{
for(i=0;i<t;i++) Finish[l]=false;//A类通过了,就把B类的Finish重置为false,C类类推

}
i=s;//s传递进来赋给i,s是用户输入的进程号(有主函数里的in传递进来)
while(i<t)
{

if (Finish[i]==false&&Need[i][j]<=Work)
{
Work=Work+Allocation[i][j];
Finish[i]=true;
temp[k]=i;//cout<<"temp="<<temp[k]<<endl;
k++;
i=(i+1)%t;//从用户选择的进程开始对每个进程都要检测
}
else i=(i++)%t;
}
}
for(i=0;i<t;i++)
{
if(Finish[i]==false)
{
flag=1;//标记
}
}
if(flag==1)
{
cout<<"系统不安全!!! 本次资源申请不成功!!!"<<endl;
cout<<"正在恢复原来的数据..."<<endl;
// Sleep(1000);
refenpei(in);
cout<<"恢复数据成功!正在打印输出..."<<endl;
// Sleep(1000);
Print();
}
else
{
cout<<"找到一个安全序列:";
for(i=0;i<t;i++)
cout<<"P"<<temp[i]<<"--->";
// Sleep(1000);
cout<<endl<<"已通过安全性测试!"<<endl;
cout<<"开始给第 "<<"p["<<in<<"]"<<"进程分配资源..."<<endl;
// Sleep(1000);
cout<<"分配完成!打印输出..."<<endl;
// Sleep(1000);
Print();
cout<<endl;
}
}



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/weiwei459989/archive/2009/10/18/4694382.aspx
本人转的,希望能帮上你!

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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