您的位置:首页 > 编程语言 > C语言/C++

VC++实现 操作系统 死锁的避免--银行家算法

2009-10-18 18:06 585 查看
这两天熬夜,从开始写代码的顺利到后来调试时候的繁琐。我都坚持下来了,上一次做生产者消费者的时候,我最终没有坚持自己独立编写代码,在网上找了一部分的代码作参考。但是这次,我下定决心要自己独立完成。终于,完成了。很欣慰,虽然有点小题大做,但是我觉得学习就得这样。从基本做起,脚踏实地。不会就自己钻研。再不会也要坚持思考。直到你真的坚持不下来的时候,往往你就能想出解决方法了。
代码写完了,异常处理没怎么去做(已经修改了部分代码,并且增加了低级异常处理。)
。也暂时不想了。水平只能先暂时到这儿。代码贴上来,水平有限,欢迎批评指正。就算被喷口水我也愿意听。初始化数据需要键入的有(按顺序输入):
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;
}
}
/*-------------------------安全检测函数结束----------------------------------*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: