📄 银行家算法实现系统资源管理.cpp
字号:
#include<stdio.h>
#define m 4//资源种类
#define n 5//进程个数
int i,j, pr[n];//pr[n]进程编号
struct process //将进程定义为结构体类型,便于引用
{
int allocation[n][m];//已分配的资源数量
int need[n][m];//还需要申请的资源数
int available[m];//可用资源数
int add[m];//添加资源时,用于输入
int del[m];//删除资源时用
}p;
void Input()//输入功能
{ printf("已分配的资源量:\n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
scanf("%d",&p.allocation[i][j]);
}
printf("\n请输入资源需求量:\n");
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
scanf("%d",&p.need[i][j]);
}
printf("可用的资源:");
for(i=0;i<m;i++)
scanf("%d",&p.available[i]);
}
void Output()//显示系统资源
{
printf("显示系统资源使用分配情况: \n");
printf("已分配的资源数量 ");
printf("还需要申请的资源数");
printf("\n");
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)//已分配的资源数量
{
printf("%d ",p.allocation[i][j]);
}
printf(" ");
for(j=0;j<m;j++)//还需要申请的资源数
{
printf("%d ",p.need[i][j]);
}
printf("\n");
}
printf("\n可用资源数:");//可用的资源
for(i=0;i<m;i++)
printf("%d ",p.available[i]);
printf("\n");
}
bool Safe(process g)//安全性算法
{
int flag=1;
int r=0,l=0;//r标明所有进程的安全状态,l进程编号
int work[m];//工作向量,标明系统可提供给进程继续运行所需的各类资源数
bool finsh[n],rest=true;//rest 用于标记是否为1,1代表安全
for(i=0;i<n;i++)//为每个进程的finish赋值为false
finsh[i]=false;
for(i=0;i<m;i++)
work[i]=g.available[i];//可用资源标记为work 防止修改时混乱
do
{
for(i=0;i<n;i++)
{
if(finsh[i]==false)
{
for(j=0;j<m;j++)//work<need 说明资源不充足,逐类资源进行验算
{
if(work[j]<g.need[i][j])
{
flag=0;//不安全置为0
break;
}
}
if(j>=m) //如果j>=m说明work >=need资源充足,逐类资源进行验算
{
flag=1;//表明安全
finsh[i]=true;
pr[l]=i;//标记进程号
l++;
for (j=0;j<m;j++)
work[j]=work[j]+g.allocation[i][j];
}
}
}
r=r+1;//共循环次数 直到所有进程都安全 或不安全为止
}while(r<n);
if(flag==0)
rest=false;//不安全
return rest; //返回rest的值判断是否安全
}
void Safe()//输出安全序列
{
if (Safe(p))
{
for(i=0;i<n;i++)
printf("p%d ",i);
printf("在该时刻的安全序列是");
for(i=0;i<n;i++)
printf("p%d ",pr[i]);
}
else
printf("\n在该时刻不安全!\n\n");
}
void add( )//添加资源
{
printf("添加可用的资源:");
int add[m];
for(i=0;i<m;i++)
scanf("%d",&p.add[i]);
for(i=0;i<m;i++)
p.available[i]=p.available[i]+p.add[i];
printf("\n此时可用资源为: ");
for(i=0;i<m;i++)
printf("%d ",p.available[i]);
}
void del()//删除资源
{
printf("删除可用的资源:");
int add[m];
for(i=0;i<m;i++)
scanf("%d",&p.del[i]);
for(i=0;i<m;i++)
p.available[i]=p.available[i]-p.del[i];
printf("\n此时可用资源为: ");
for(i=0;i<m;i++)
printf("%d ",p.available[i]);
}
void request(int request[],int k)//第K个进程申请资源
{
bool bj=false;//初始值为false
for(i=0;i<m;i++)
if (request[i]>p.need[k][i]) bj=true;
if (bj==true)
{
printf("请求资源大于需要的资源!可选择添加资源");
return;
}
for(i=0;i<m;i++)
if(request[i]>p.available[i]) bj=true;
if (bj==true)
{
printf("需要添加资源,可用资源不充足!");
return;
}
int a[m],b[m],c[m],d[m];
for(i=0;i<m;i++)//当bj不等于true时,对m种资源进行更新
{
a[i]=p.available[i]=p.available[i]-request[i];
b[i]=p.need[k][i]=p.need[k][i]-request[i];
c[i]=p.allocation[k][i]=p.allocation[k][i]+request[i];
}
if (Safe(p))
{
printf("分配成功,安全序列是");
for(i=0;i<n;i++)
printf("%d ",pr[i]);
printf("\n\n第%d个进程当前资源为:\n",k);
printf("已分配资源 需要资源 请求的资源\n");
for (i=0;i<m;i++)//输出当前进程的请求情况及资源情况
printf("%d ",c[i]);
printf(" ");
for (i=0;i<m;i++)
printf("%d ",b[i]);
printf(" ");
for (i=0;i<m;i++)
printf("%d ",request[i]);
printf("\n可用资源为:");
for (i=0;i<m;i++)//退出前还原为初始状态
{
d[i]=a[i]+c[i];
printf("%d ",d[i]);
}
for(i=0;i<m;i++)//还原
{
p.available[i]=p.available[i]+request[i];
p.need[k][i]=p.need[k][i]+request[i];
p.allocation[k][i]=p.allocation[k][i]-request[i];
}
return;
}
printf("\n结果如下:系统不安全,分配失败");
printf("\n\n回收完毕!");
for(i=0;i<m;i++)//还原
{
p.available[i]=p.available[i]+request[i];
p.need[k][i]=p.need[k][i]+request[i];
p.allocation[k][i]=p.allocation[k][i]-request[i];
}
printf("第%d个进程当前资源为:\n",k);
printf("已分配资源 需要资源 请求的资源\n");
for (i=0;i<m;i++)//输出当前进程的请求情况及资源情况
printf("%d ",p.allocation[k][i]);
printf(" ");
for (i=0;i<m;i++)
printf("%d ",p.need[k][i]);
printf(" ");
for (i=0;i<m;i++)
printf("%d ",request[i]);
}
void main()//主程序
{
while(1)
{
printf("\n************欢迎使用系统资源管理(用银行家算法实现)************");
printf("\n 设计者:05多媒体1班 梁燕 \n");
printf("\n 1 初始化系统资源 2 添加资源 ");
printf("\n 3 删除资源 4 申请资源 ");
printf("\n 5 银行家算法 6 显示系统资源 ");
printf("\n 7 退出资源管理系统 \n");
printf("\n**************************谢谢使用****************************\n\n");
printf("\n请输入你的选择:");
int p;
scanf("%d",&p);
if(p>0&&p<=7)
{
switch(p)
{ case 1: Input();
Output();
break;
case 2: add() ;break;
case 3: del() ;break;
case 4:
printf("\n请输入申请资源的进程号:p");
int q;
scanf("%d",&q);
if (q>n)
printf("不存在该进程!\n");
else
{ int a[m];
printf("请输入进程申请各类资源的数量:");
for(i=0;i<m;i++)
scanf("%d",&a[i]);
request(a,q);
};
break;
case 5: Output();
Safe();break;
case 6: Output();
break;
case 7: printf("退出成功!\n");return;
}
}
else printf("输入错误,请重新输入!");
}
}
/*测试数据:Allocation Need Available
p0 0032 0012 1622
p1 1000 1750
p2 1354 2356
p3 0332 0652
p4 0014 0656
p2提出请求:1 2 2 2*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -