#include <stdio.h>
#include <stdlib.h>
int m=3;//m个系统资源
int n=0;//n个并发进程
int Max[20][20];//={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //最大需求矩阵
int Available[20];//={10,3,2}; //可利用资源向量
int Allocation[20][20];//={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; //分配矩阵
int Need[20][20];//={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}}; //需求矩阵
int Request[20];
int queue[20]; //进程Pi的请求向量
//*******************************************************************************
int output() //显示各个矩阵资源分配情况
{
int k,l,t;t=65;
printf("\n**********************************************************\n");
printf(" MAX ");
for(l=0;l<m;l++) printf(" ");
printf("Allocation ");
for(l=0;l<m;l++) printf(" ");
printf("Need ");
for(l=0;l<m;l++) printf(" ");
printf("Available ");
for(l=0;l<m;l++) printf(" ");
printf("\n");
//printf(" A B C A B C A B C A B C ");
printf(" ");
for(l=0;l<4;l++)
{for(k=0;k<m;k++)
printf("%c ",65+k);
printf(" ");}
for(k=0;k<n;k++)
{
printf("\nP%d ",k);
for(l=0;l<m;l++)
printf("%d ",Max[k][l]);printf(" ");
for(l=0;l<m;l++)
printf("%d ",Allocation[k][l]);printf(" ");
for(l=0;l<m;l++)
printf("%d ",Need[k][l]);printf(" ");
for(l=0;l<m;l++)
printf("%d ",Need[k][l]);printf(" ");
if(k==0) {
for(l=0;l<m;l++)
printf("%d ",Available[l]);
}
}
return 1;
}
//*****************************************************************************
int input() //资源分配情况的录入。
{
int i,j;int t=65;
//printf("\n请输入系统的未分配资源数:");
// scanf("%d,%d,%d",Available,Available+1,Available+2);
//for(i=0;i<5;i++)
printf("\n 资源名称:");
for(i=0;i<m;i++) printf("%c ",t+i);
printf("\n请输入p%d的最大需求资源数:",n);
for(i=0;i<m;i++) {scanf("%d",Max[n]+i);}
printf("\n 资源名称:");
for(i=0;i<m;i++) printf("%c ",t+i);
printf("\n请输入p%d的已分配的资源数:",n);
for(i=0;i<m;i++) {scanf("%d",Allocation[n]+i);}
//for(i=0;i<n;i++)
for(j=0;j<m;j++)
Need[n][j]=Max[n][j]-Allocation[n][j];
for(i=0;i<m;i++)
{
Available[i]-=Allocation[n][i];
}
n++;
return 1;
}
//*****************************************************************************
int safe(){//安全性检查 返回1 表示安全 有安全队列 queue 返回0表示不安全
int done,apply=0;int t;
int i,j;int work[20];
int finish[20]={0};
for(j=0;j<m;j++) { work[j] = Available[j]; }
while(apply<n)
{
t=0;
for(i=0;i<n;i++)
{
done=0;
if(finish[i]!=0) {continue;}
for(j=0;j<m;j++)
{
if(Need[i][j] >work[j]) {done=1; break; }
}
if(done==0)
{
for(j=0;j<m;j++) work[j]=work[j]+Allocation[i][j];
finish[i]=1;
queue[apply]=i;apply++;t=1;
}
}
if(t==0) return 0;
}
return 1;
}
//***************************************************************
int dijkstra(int i,int Request[]) //请求资源
{
int t;
int j;
for(j=0;j<m;j++){
if(Request[j]>Need[i][j]) return 0;//出错
if(Request[j]>Available[j]) return 3; //资源不足 等待
else {Available[j] -= Request[j] ;
Allocation[i][j] += Request[j];
Need[i][j] -= Request[j];}}
t=safe();
if(!t)
{
for(j=0;j<m;j++)
{
Available[j] += Request[j];
Allocation[i][j] -= Request[j];
Need[i][j] += Request[j];
}
return 3; //资源不足 等待
}
//安全性检测
return 1;
}
//****************************************************************
int devide()
{
int k,tmp,i;int t=65;
printf("请输入请求资源的进程号:");
scanf("%d",&k);
printf("\n 资源名称:");
for(i=0;i<m;i++) printf("%c ",t+i);
printf("\n请输入请求系统资源的个数:");
for(i=0;i<m;i++) {scanf("%d",Request+i);}
tmp=dijkstra(k,Request);
if(tmp==0) printf("请求资源超过最大值出错\n。");
else if(tmp==3) printf("资源不足,P%d需等待\n",k);
else {printf("分配成功,分配后情况如下\n");
output();
printf("\n分配成功后具有安全队列:");
for(i=0;i<n;i++)
{
printf("P%d->",queue[i]);
}
printf("end\n");
}
return 1;
}
//****************************************************************
int Delete()
{
int t,i,j;
output();
printf("\n请输入要删除的进程号:");
scanf("%d",&t);
if (t>=n) printf("查无该进程号:");
else {
for(j=0;j<m;j++) {Available[j]+=Allocation[t][j];};
for(i=t;i<=n-1;i++)
{
for(j=0;j<m;j++)
{
Max[i][j]=Max[i+1][j];
Allocation[i][j]=Allocation[i+1][j];
Need[i][j]=Need[i+1][j];
}
}
printf("删除成功!\n");
}
n--;
return 1;
}
//****************************************************************
void main()
{
int k;int i,t=65;
int choise=1;
printf("第一次使用请先初始化 \n");
printf("请先输入系统资源个数:");
scanf("%d",&m);
printf("\n 资源名称:");
for(i=0;i<m;i++) printf("%c ",t+i);
printf("\n请输入各个系统资源的总数:");
for(i=0;i<m;i++) {scanf("%d",Available+i);}
while(choise)
{
system("cls");
printf("************************************************\n");
printf(" 20203101248 邵蕊 \n");
printf(" 银行家算法演示 \n");
printf(" 第一次使用请先初始化 \n");
printf("1、输入进程(自动编号)\n");
printf("2、分配资源\n");
printf("3、删除进程\n");
printf("4、显示资源分配情况\n");
printf("5、安全性检查\n");
printf("6、退出");
printf("*请选择功能:(1或2或3):");
scanf("%d",&k);
switch(k)
{
case 1: input();break;
case 2: devide();break;
case 3: Delete();break;
case 4: output();break;
case 5: if(safe())
{
printf("\n系统安全,具有安全队列:");
for(i=0;i<n;i++)
{
printf("P%d->",queue[i]);
}
printf("end\n");
}break;
case 6: choise =0;break;
default :printf("输入有误重新输入数字。");
}
getchar();getchar();
}
}

相寐
- 粉丝: 16
最新资源
- 现代企业物流管理信息化发展现状及创新研究.docx
- 区块链技术在国内外金融领域应用动态.docx
- 探索中职学校计算机教学中翻转课堂的实践应用.docx
- 全国计算机等级测验一级选择题(含答案).doc
- 高校网络管理体系与防护工作的优化设计方案与研究.doc
- 《软件工程基础》习题集-).doc
- 电气工程自动化发展中存在的问题及完善对策.docx
- 计算机通信与网络课程自主实践环节设计.docx
- 团购网站方案设计书与实现大学本科方案设计书大学本科方案设计书及其点评样稿实例模版.doc
- 浅析电气工程及其自动化的发展现状与展望.docx
- 面向对象软件工程方法学实践.docx
- 基于单片机的电子钟方案设计书02117.doc
- 经济学视角下网络色情蔓延的利益驱动分析.docx
- 大数据背景下高职Hadoop课程内容体系建设.docx
- 探析网络安全的重要性.docx
- rtmp推送aac音频流 Android将麦克风采集的数据推送到服务器(RTMPorRTSP) 采用AudioRecoder收集音频数据MediaCodeC编码AAC,推送到服务器
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



评论0