银行家算法C语言模拟程序
来源:互联网 发布:linux前景怎么样 编辑:程序博客网 时间:2024/05/12 16:15
银行家算法C语言模拟程序
这个最简单的模拟程序,为了完成操作系统作业而做的。大家放心,绝对可以运行,呵呵!
有什么不完善的地方请提出!(在计数器的运用上比较乱,希望大家看的明白)
作者:luo卢丹)
源程序:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<stdlib.h>
#include<conio.h>
int Available[10]; //可使用资源向量
int Max[10][10]; //最大需求矩阵
int Allocation[10][10]={0}; //分配矩阵
int Need[10][10]={0}; //需求矩阵
int Work[10]; //工作向量
int Finish[10]; //状态标志
int Request[10][10]; //进程申请资源向量
int Pause[10];
int List[10];
int i,j;
int n; //系统资源总数
int m; //总的进程数
int a; //当前申请的进程号
int l,e; //计数器
int b=0,c=0,f=0,g; //计数器
int Max[10][10]; //最大需求矩阵
int Allocation[10][10]={0}; //分配矩阵
int Need[10][10]={0}; //需求矩阵
int Work[10]; //工作向量
int Finish[10]; //状态标志
int Request[10][10]; //进程申请资源向量
int Pause[10];
int List[10];
int i,j;
int n; //系统资源总数
int m; //总的进程数
int a; //当前申请的进程号
int l,e; //计数器
int b=0,c=0,f=0,g; //计数器
void mainenter()//主要的输入部分代码
{
printf("请输入系统总共有的资源数:");
scanf("%d",&n);
printf("请输入总共有多少个进程:");
scanf("%d",&m);
for(i=1;i<=n;i++)
{
printf("第%d类资源有的资源实例:",i);
scanf("%d",&Available[i]);
}
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
printf("进程P[%d]对第%d类资源的最大需求量:",i,j);
scanf("%d",&Max[i][j]);
Need[i][j]=Max[i][j];
}
}
}
{
printf("请输入系统总共有的资源数:");
scanf("%d",&n);
printf("请输入总共有多少个进程:");
scanf("%d",&m);
for(i=1;i<=n;i++)
{
printf("第%d类资源有的资源实例:",i);
scanf("%d",&Available[i]);
}
for(i=1;i<=m;i++)
{
for(j=1;j<=n;j++)
{
printf("进程P[%d]对第%d类资源的最大需求量:",i,j);
scanf("%d",&Max[i][j]);
Need[i][j]=Max[i][j];
}
}
}
void mainrequest() //进程提出新申请的代码部分
{
printf("请输入申请资源的进程:");
scanf("%d",&a);
for(i=1;i<=n;i++)
{
printf("请输入进程P[%d]对%d类资源的申请量:",a,i);
scanf("%d",&Request[a][i]);
if(Request[a][i]>Need[a][i])
printf("/n出错!进程申请的资源数多于它自己申报的最大量/n");
if(Request[a][i]>Available[i])
printf("/nP[%d]必须等待/n",a);
{
printf("请输入申请资源的进程:");
scanf("%d",&a);
for(i=1;i<=n;i++)
{
printf("请输入进程P[%d]对%d类资源的申请量:",a,i);
scanf("%d",&Request[a][i]);
if(Request[a][i]>Need[a][i])
printf("/n出错!进程申请的资源数多于它自己申报的最大量/n");
if(Request[a][i]>Available[i])
printf("/nP[%d]必须等待/n",a);
//以下是试探性分配
Available[i]=Available[i]-Request[a][i];
Allocation[a][i]=Allocation[a][i]+Request[a][i];
Need[a][i]=Need[a][i]-Request[a][i];
Work[i]=Available[i];
}
for(i=1;i<=m;i++)
{
Pause[i]=Available[i];//Pause[i]只是一个暂时寄存的中间变量,为防止在下面
Allocation[a][i]=Allocation[a][i]+Request[a][i];
Need[a][i]=Need[a][i]-Request[a][i];
Work[i]=Available[i];
}
for(i=1;i<=m;i++)
{
Pause[i]=Available[i];//Pause[i]只是一个暂时寄存的中间变量,为防止在下面
//安全性检查时修改到Available[i]而代替的一维数组
Finish[i]=false;
}
for(g=1;g<=m;g++)
{
for(i=1;i<=m;i++)
{
b=0; //计数器初始化
for(j=1;j<=n;j++)
{
if(Need[i][j]<=Pause[j])
{
b=b+1;
}
if(Finish[i]==false&&b==n)
{
for(l=1;l<=n;l++)
{
Pause[l]=Pause[l]+Allocation[i][l];
}
Finish[i]=true;
printf("$$ %d ",i);//依次输出进程安全序列之一中每个元素
}
}
}
}
printf("/n");
for(i=1;i<=m;i++)
{
if(Finish[i]==true) f=f+1;//统计Finish[i]==true的个数
}
if (f==m)
{
printf("safe static");
f=0;//将计数器f重新初始化,为下一次提出新的进程申请做准备
}
else
{
printf(" unsafe static ");//以下代码为当系统被判定为不安全状态时
Finish[i]=false;
}
for(g=1;g<=m;g++)
{
for(i=1;i<=m;i++)
{
b=0; //计数器初始化
for(j=1;j<=n;j++)
{
if(Need[i][j]<=Pause[j])
{
b=b+1;
}
if(Finish[i]==false&&b==n)
{
for(l=1;l<=n;l++)
{
Pause[l]=Pause[l]+Allocation[i][l];
}
Finish[i]=true;
printf("$$ %d ",i);//依次输出进程安全序列之一中每个元素
}
}
}
}
printf("/n");
for(i=1;i<=m;i++)
{
if(Finish[i]==true) f=f+1;//统计Finish[i]==true的个数
}
if (f==m)
{
printf("safe static");
f=0;//将计数器f重新初始化,为下一次提出新的进程申请做准备
}
else
{
printf(" unsafe static ");//以下代码为当系统被判定为不安全状态时
//返回提出申请前的状态
for(i=1;i<=n;i++)
{
Available[i]=Available[i]+Request[a][i];
Allocation[a][i]=Allocation[a][i]-Request[a][i];
Need[a][i]=Need[a][i]+Request[a][i];
}
}
}
void mainprint()
{
printf("当前的系统状态/n");
printf(" 目前占有量 最大需求量 尚需要量 /n进程");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
printf(" %d类",j);
}
for(i=1;i<=m;i++)
{
printf("/nP[%d]",i);
for(j=1;j<=n;j++)
{
printf(" %d ",Allocation[i][j]);
}
for(j=1;j<=n;j++)
{
printf(" %d ",Max[i][j]);
}
for(j=1;j<=n;j++)
{
printf(" %d ",Need[i][j]);
}
}
printf("/n/n系统剩余资源量: ");
for(i=1;i<=n;i++)
{
printf(" %d ",Available[i]);
}
printf("/n");
}
for(i=1;i<=n;i++)
{
Available[i]=Available[i]+Request[a][i];
Allocation[a][i]=Allocation[a][i]-Request[a][i];
Need[a][i]=Need[a][i]+Request[a][i];
}
}
}
void mainprint()
{
printf("当前的系统状态/n");
printf(" 目前占有量 最大需求量 尚需要量 /n进程");
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
printf(" %d类",j);
}
for(i=1;i<=m;i++)
{
printf("/nP[%d]",i);
for(j=1;j<=n;j++)
{
printf(" %d ",Allocation[i][j]);
}
for(j=1;j<=n;j++)
{
printf(" %d ",Max[i][j]);
}
for(j=1;j<=n;j++)
{
printf(" %d ",Need[i][j]);
}
}
printf("/n/n系统剩余资源量: ");
for(i=1;i<=n;i++)
{
printf(" %d ",Available[i]);
}
printf("/n");
}
void main()
{ int k,h=1;
while(h)
{ system("cls");
{
printf("/n/n ★ 欢迎使用本程序 ★/n");
printf("/n/n 1:输入系统的资源数、申请进程数、每个类资源的实例数");
printf("/n 2:…………………………………… 输入进程的资源申请");
printf("/n 3:…………………………………………… 输出系统状态");
printf("/n 4:………………………………………………… 退出程序");
printf("/n/n please choose ");
scanf("%d",&k);
}
switch(k)
{
case 1:mainenter(); break;
case 2:mainrequest(); break;
case 3:mainprint(); break;
case 4:h=0; break;
}
printf("/n");
system("pause");
}
system("cls");
printf("/n/n 谢谢使用 /n");
printf("/n/n See you next time!!!/n/n/n");
}
{ int k,h=1;
while(h)
{ system("cls");
{
printf("/n/n ★ 欢迎使用本程序 ★/n");
printf("/n/n 1:输入系统的资源数、申请进程数、每个类资源的实例数");
printf("/n 2:…………………………………… 输入进程的资源申请");
printf("/n 3:…………………………………………… 输出系统状态");
printf("/n 4:………………………………………………… 退出程序");
printf("/n/n please choose ");
scanf("%d",&k);
}
switch(k)
{
case 1:mainenter(); break;
case 2:mainrequest(); break;
case 3:mainprint(); break;
case 4:h=0; break;
}
printf("/n");
system("pause");
}
system("cls");
printf("/n/n 谢谢使用 /n");
printf("/n/n See you next time!!!/n/n/n");
}
以下是程序运行截图:
以此输入每个进程对各类资源的需求量;
所有进程输入完成后系统的当前状态
进程P[2]再次提出申请,系统为安全状态;
对进程P[2]分配后的系统状态;
进程P[1]再次提出资源申请,分配后系统为不安全状态,则不提供资源分配;
由于P[1]分配后系统状态不安全,则退回到前一状态;
- 银行家算法C语言模拟程序
- 银行家算法c模拟
- 银行家算法模拟-----c++语言(其实质也是c语言)
- c语言银行家算法
- 银行家算法 C语言
- 编程序模拟银行家算法
- C语言实现银行家算法
- C语言实现银行家算法
- 【c语言/vs2010】银行家算法
- C语言实现操作系统银行家算法
- C语言实现 操作系统 银行家算法
- 银行家算法的C语言实现
- 操作系统–银行家算法c语言代码
- 银行家算法的模拟
- 银行家算法模拟
- 多线程模拟银行家算法
- 模拟银行家算法
- python模拟银行家算法
- F*CK vista,xp,windows just need U
- 08欧杯荷兰
- [string] 1
- .net中前台javascript与后台c#相互调用
- 从Hibernate的映射谈编程思想
- 银行家算法C语言模拟程序
- assert断言的使用
- 安装并配置eclipse环境 流程
- 金融工程简介(转自百度百科)
- (转)GetResponse()获取错误时处理方式
- Ajax.Net高效分页(全选 反选行等)
- 无法打开路径中带有空格的图片
- 程序员的论坛修养
- Scrum in 5 minutes