社区
C++ 语言
帖子详情
操作系统 银行家算法 c++如何实现?
lovesoftchina
2009-12-03 08:28:09
鄙人是新手 今遇银行家算法不知如何实现 请高人指点 c++编程高手进 万分感谢
...全文
1691
2
打赏
收藏
操作系统 银行家算法 c++如何实现?
鄙人是新手 今遇银行家算法不知如何实现 请高人指点 c++编程高手进 万分感谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
本人转的,希望能帮上你!
操作系统
银行家算法
C++
通过实例模拟
银行家算法
实现
死锁预防,即输入实例数据后,能够使用
银行家算法
判断资源分配后是否存在安全序列。
操作系统
c++
银行家算法
额,这个是
操作系统
的课程设计,这个是用
c++
语言写的,想参考一下的就下来看看吧
操作系统
-
银行家算法
c++
实现
操作系统
-
银行家算法
c++
实现
。
操作系统
银行家算法
c++
C++
实现
的
银行家算法
; if(request[i][j]<=need[i][j]) { if(request[i][j]<=available[j]) { available[j]=available[j]-request[i][j]; allocation[i][j]=allocation[i][j]+request[i][j]; need[i][j]=need[i][j]-request[i][j]; safe();
操作系统
银行家算法
的
C++
实现
银行家算法
是一种最有代表性的避免死锁的算法。在避免死锁方法中允许进程动态地申请资源,但系
银行家算法
统在进行资源分配之前,应先计算此次分配资源的安全性,若分配不会导致系统进入不安全状态,则分配,否则等待。为
实现
银行家算法
,系统必须设置若干数据结构。
C++ 语言
64,654
社区成员
250,484
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章