银行家算法C语言代码

合集下载

银行家算法c语言流程图代码全

银行家算法c语言流程图代码全
操作系统教程
——银行家算法
院系 班级 学号 姓名
计算机与软件学院 08 软件工程 2 班
20081344066 何丽茗
一、实验目的
银行家算法是避免死锁的一种重要方法。通过编写一个模拟动态资源分配的银行家算法 程序�进一步深入理解死锁、产生死锁的必要条件、安全状态等重要概念�并掌握避免死锁 的具体实施方法。
四、实验代码以及运行示例
1. 源代码�
#include<iostream>
#include<string.h>
#include<stdio.h>
#define False 0
#define True 1
using namespace std;
intMax[100][100]={0};//各进程所需各类资源的最大需求
for(j=0;j<N;j++)
cout<<Allocation[i][j]<<" ";
cout<<" ";
for(j=0;j<N;j++)
cout<<Need[i][j]<<" ";
cout<<endl;
}
}
intchangdata(inti)//进行资源分配 {
int j; for (j=0;j<M;j++) {
Y
i加1
提示 错误 重新 输入
所有进程运行 都结束
结束
初始化 need 矩阵 Y Need 矩阵为 0
N
任选一个进程作为当前进程
Need 向量为 0 N

银行家算法(C代码)

银行家算法(C代码)

#include<stdio.h>int MaxNeed[5][3];int Allocation[5][3];int Need[5][3];int All[1][3];int Available[1][3];void Head()//开始{int i=0;int j=0;for(i=0;i<15;i++){printf(" \020");}printf("\n");printf(" 欢迎使用银行家算法!\n");for(j=0;j<15;j++){printf(" \020");}printf("\n");}void InitArray()//各个数组初始化{int i;int j;for(i=0;i<5;i++){int l=i+1;printf("请输入P%d进程最大需求的信息:\n",l);printf(" A资源,B资源,C资源:");scanf("%d%d%d",&MaxNeed[i][0],&MaxNeed[i][1],&MaxNeed[i][2]);}for(j=0;j<5;j++){int l=j+1;printf("请输入P%d进程已获得资源的信息:\n",l);printf(" A资源,B资源,C资源:");scanf("%d%d%d",&Allocation[j][0],&Allocation[j][1],&Allocation[j][2]);}printf("请输入总资源的信息:\n");printf(" A资源,B资源,C资源:");scanf("%d%d%d",&All[0][0],&All[0][1],&All[0][2]);void CalculateAvailable()//计算可利用的资源{int i=0;int a=0;int b=0;int c=0;for(i=0;i<5;i++){a=a+Allocation[i][0];b=b+Allocation[i][1];c=c+Allocation[i][2];}Available[0][0]=All[0][0]-a;Available[0][1]=All[0][1]-b;Available[0][2]=All[0][2]-c;}void CalculateNeed()//计算每个进程还需要的资源{int i=0;int j=0;for(i=0; i<5; i++){for(j=0;j<3;j++){Need[i][j]=MaxNeed[i][j]-Allocation[i][j] ;}}}void PrintMaxNeed()//打印每个进程的最大需求量{int i=0;int j=0;for(i=0; i<5; i++){for(j=0;j<3;j++){printf("%5d", MaxNeed[i][j]);}printf("\n");}printf("\n");}void PrintAllocation()//打印每个进程已分配的资源{int i=0;for(i=0; i<5; i++){for(j=0;j<3;j++){printf("%5d", Allocation[i][j]);}printf("\n");}printf("\n");}void PrintNeed()//打印每个进程还需要的资源数量{int i=0;int j=0;for(i=0; i<5; i++){for(j=0;j<3;j++){printf("%5d", Need[i][j]);}printf("\n");}printf("\n");}void PrintAll()//打印总共资源数量{int i=0;for(i=0; i<3; i++){printf("%5d", All[0][i]);}printf("\n");}void PrintAvailable()//打印还可利用的资源数量{int i=0;for(i=0; i<3; i++){printf("%5d", Available[0][i]);}printf("\n");}void JudgeSafeCondition()//判断安全状态{int i=0;int j=0;int k=0;int count=0;int SafeSequence[5]={7,7,7,7,7};for(i=0;i<5;i++)int a;for(j=0;j<5;j++){a=((Available[0][0]>=Need[j][0])&&(Available[0][1]>=Need[j][1])&&(Available[0][2]>=Need[j] [2]));if(a==1&&j!=SafeSequence[0]&&j!=SafeSequence[1]&&j!=SafeSequence[2]&&j!=SafeSequenc e[3]&&j!=SafeSequence[4]){count=count+1;SafeSequence[i]=j;Available[0][0]=Allocation[j][0]+Available[0][0];Available[0][1]=Allocation[j][1]+Available[0][1];Available[0][2]=Allocation[j][2]+Available[0][2];printf("调用进程P%d后的Available资源:",j+1);PrintAvailable();printf("\n");break;}}}if(count==5){printf("存在安全序列:\n");for(k=0;k<5;k++){printf("P%d ",SafeSequence[k]+1);}printf("\n");}else{printf("查找安全序列失败!\n");}}void ApplySource()//T0时刻申请资源{int pro;//请求资源进程数int s_a,s_b,s_c;//请求资源的数量printf("请选择要请求资源的进程数[1,2,3,4,5]:");scanf("%d",&pro);printf("请输入还需要的A,B,C的资源数:");Available[0][0]=Available[0][0]-s_a;Available[0][1]=Available[0][1]-s_b;Available[0][2]=Available[0][2]-s_c;Allocation[pro-1][0]=Allocation[pro-1][0]+s_a;Allocation[pro-1][1]=Allocation[pro-1][1]+s_b;Allocation[pro-1][2]=Allocation[pro-1][2]+s_c;CalculateNeed();}void main(){char app_source;Head();InitArray();CalculateAvailable();CalculateNeed();printf("MaxNeed:\n");PrintMaxNeed();printf("Allocation:\n");PrintAllocation();printf("Need:\n");PrintNeed();printf("All:\n");PrintAll();printf("Available:\n");PrintAvailable();printf("是否有进程要申请资源[y/n]:");fflush(stdin);scanf("%c",&app_source);switch(app_source){case 'y':{ApplySource();printf("Allocation:\n");PrintAllocation();printf("Need:\n");PrintNeed();printf("All:\n");PrintAll();printf("Available:\n");PrintAvailable();JudgeSafeCondition();break;}case 'n':break;}}。

c++银行家算法代码

c++银行家算法代码

c++银行家算法代码银行家算法是一种用于避免死锁的资源分配算法,它是由艾德加·戴克斯特拉和E. W. 佩策于1965年提出的。

该算法基于银行家的思想,即银行家要避免贷款给那些不可能还款的人。

在计算机科学中,这种思想被应用于避免系统中的资源不足而导致的死锁。

以下是一个基于C++语言实现的银行家算法代码示例:```cpp#include<iostream>using namespace std;int main(){int n, m, i, j, k;cout<<'请输入进程数:'<<endl;cin>>n;cout<<'请输入资源数:'<<endl;cin>>m;int available[m];int allocation[n][m];int max[n][m];int need[n][m];int work[m];int finish[n];for(i=0;i<m;i++){cout<<'请输入第'<<i+1<<'个资源的可用数:'<<endl; cin>>available[i];work[i]=available[i];}for(i=0;i<n;i++){cout<<'请输入进程'<<i+1<<'的分配矩阵:'<<endl;for(j=0;j<m;j++){cin>>allocation[i][j];}}for(i=0;i<n;i++){cout<<'请输入进程'<<i+1<<'的最大需求矩阵:'<<endl; for(j=0;j<m;j++){cin>>max[i][j];need[i][j]=max[i][j]-allocation[i][j];}finish[i]=0;}int flag=0;for(k=0;k<n;k++){for(i=0;i<n;i++){if(finish[i]==0){int flag1=0;for(j=0;j<m;j++){if(need[i][j]>work[j]) {flag1=1;break;}}if(flag1==0){finish[i]=1;flag=1;for(j=0;j<m;j++){work[j]=work[j]+allocation[i][j]; }}}}if(flag==0){break;}}if(flag==0){cout<<'系统不安全!'<<endl;}else{cout<<'系统安全!'<<endl;}return 0;}```以上代码实现了银行家算法的核心功能,即判断系统是否安全。

c语言银行家算法

c语言银行家算法

c语言银行家算法在C语言中实现银行家算法,首先需要了解该算法的基本概念和原理。

银行家算法是一种避免死锁的资源分配算法,它模拟了银行贷款的过程。

当一个进程请求资源时,系统先检查分配后是否安全,如果是,则分配资源。

否则,进程必须等待,直到足够的资源可用。

以下是一个简单的银行家算法的C语言实现:```c#include <stdio.h>#define MaxProcs 5#define MaxResources 3int Allocation[MaxProcs][MaxResources] = {0};int Max[MaxProcs][MaxResources] = {0};int Allocation[MaxProcs][MaxResources] = {0};int Available[MaxResources] = {0};int Need[MaxProcs][MaxResources] = {0};int Work[MaxResources] = {0};int safeSeq[MaxProcs] = {0};int count = 0;void calcNeed() {for (int p = 0; p < MaxProcs; p++) {for (int r = 0; r < MaxResources; r++) {Need[p][r] = Max[p][r] - Allocation[p][r];}}}void checkSafe() {int finish[MaxProcs] = {0};int k, j;for (k = 0; k < MaxProcs; k++) {safeSeq[k] = -1;}while (count < MaxProcs) {for (k = 0; k < MaxProcs; k++) {if (finish[k] == 0) {for (j = 0; j < MaxResources; j++) {if (Need[k][j] > Work[j]) {break;}}if (j == MaxResources) {for (j = 0; j < MaxResources; j++) {Work[j] += Allocation[k][j];safeSeq[count++] = k;finish[k] = 1;}}}}}if (count == MaxProcs) {printf("系统是安全的\n");} else {printf("系统是不安全的\n");}}```。

操作系统实验报告--C语言实现银行家算法

操作系统实验报告--C语言实现银行家算法

实验报告程序源代码:#include <stdio.h>#include <stdlib.h>#include <conio.h># define m 50int no1; //进程数int no2; //资源数int r;int allocation[m][m],need[m][m],available[m],max[m][m];char name1[m],name2[m]; //定义全局变量void main(){void check();void print();int i,j,p=0,q=0;char c;int request[m],allocation1[m][m],need1[m][m],available1[m];printf("**********************************************\n");printf("* 银行家算法的设计与实现 *\n");printf("**********************************************\n");printf("请输入进程总数:\n");scanf("%d",&no1);printf("请输入资源种类数:\n");scanf("%d",&no2);printf("请输入Max矩阵:\n");for(i=0;i<no1;i++)for(j=0;j<no2;j++)scanf("%d",&max[i][j]); //输入已知进程最大资源需求量printf("请输入Allocation矩阵:\n");for(i=0;i<no1;i++)for(j=0;j<no2;j++)scanf("%d",&allocation[i][j]); //输入已知的进程已分配的资源数for(i=0;i<no1;i++)for(j=0;j<no2;j++)need[i][j]=max[i][j]-allocation[i][j]; //根据输入的两个数组计算出need矩阵的值printf("请输入Available矩阵\n");for(i=0;i<no2;i++)scanf("%d",&available[i]); //输入已知的可用资源数print(); //输出已知条件check(); //检测T0时刻已知条件的安全状态if(r==1) //如果安全则执行以下代码{do{q=0;p=0;printf("\n请输入请求资源的进程号(0~4):\n");for(j=0;j<=10;j++){scanf("%d",&i);if(i>=no1){printf("输入错误,请重新输入:\n");continue;}else break;}printf("\n请输入该进程所请求的资源数request[j]:\n");for(j=0;j<no2;j++)scanf("%d",&request[j]);for(j=0;j<no2;j++)if(request[j]>need[i][j]) p=1;//判断请求是否超过该进程所需要的资源数if(p)printf("请求资源超过该进程资源需求量,请求失败!\n");else{for(j=0;j<no2;j++)if(request[j]>available[j]) q=1;//判断请求是否超过可用资源数if(q)printf("没有做够的资源分配,请求失败!\n");else //请求满足条件{for(j=0;j<no2;j++){available1[j]=available[j];allocation1[i][j]=allocation[i][j];need1[i][j]=need[i][j];//保存原已分配的资源数,仍需要的资源数和可用的资源数available[j]=available[j]-request[j];allocation[i][j]+=request[j];need[i][j]=need[i][j]-request[j];//系统尝试把资源分配给请求的进程}print();check(); //检测分配后的安全性if(r==0) //如果分配后系统不安全{for(j=0;j<no2;j++){available[j]=available1[j];allocation[i][j]=allocation1[i][j];need[i][j]=need1[i][j];//还原已分配的资源数,仍需要的资源数和可用的资源数}printf("返回分配前资源数\n");print();}}}printf("\n你还要继续分配吗?Y or N ?\n");//判断是否继续进行资源分配c=getche();}while(c=='y'||c=='Y');}}void check() //安全算法函数{int k,f,v=0,i,j;int work[m],a[m];bool finish[m];r=1;for(i=0;i<no1;i++)finish[i]=false; // 初始化进程均没得到足够资源数并完成for(i=0;i<no2;i++)work[i]=available[i];//work[i]表示可提供进程继续运行的各类资源数k=no1;do{for(i=0;i<no1;i++){if(finish[i]==false){f=1;for(j=0;j<no2;j++)if(need[i][j]>work[j])f=0;if(f==1) //找到还没有完成且需求数小于可提供进程继续运行的资源数的进程{finish[i]=true;a[v++]=i; //记录安全序列号for(j=0;j<no2;j++)work[j]+=allocation[i][j]; //释放该进程已分配的资源}}}k--; //每完成一个进程分配,未完成的进程数就减1 }while(k>0);f=1;for(i=0;i<no1;i++) //判断是否所有的进程都完成{if(finish[i]==false){f=0;break;}}if(f==0) //若有进程没完成,则为不安全状态{printf("系统处在不安全状态!");r=0;}else{printf("\n系统当前为安全状态,安全序列为:\n");for(i=0;i<no1;i++)printf("p%d ",a[i]); //输出安全序列}}void print() //输出函数{int i,j;printf("\n");printf("*************此时刻资源分配情况*********************\n");printf("进程名/号 | Max | Allocation | Need |\n"); for (i = 0; i < no1; i++){printf(" p%d/%d ",i,i);for (j = 0; j < no2; j++){printf("%d ",max[i][j]);}for (j = 0; j < no2; j++){printf(" %d ",allocation[i][j]);}for (j = 0; j < no2; j++){printf(" %d ",need[i][j]);}printf("\n");}printf("\n");printf("各类资源可利用的资源数为:");for (j = 0; j < no2; j++){printf(" %d",available[j]);}printf("\n");}程序运行调试结果:1、程序初始化2、检测系统资源分配是否安全结果。

银行家算法C语言版

银行家算法C语言版

银行家算法C语言版#include "stdio.h" #define M 50 //总进程数#define N 30 //总资源数#define FALSE 0#define TRUE 1int m,n;//系统可用资源数int AVAILABLE[N]; //M个进程已经得到N类资源的资源量 int ALLOCATION[M][N]; //M个进程还需要N类资源的资源量int NEED[M][N];int Request[N];main(){int i=0,j=0;int flag=1;void showdata();void changdata(int);void rstordata(int);int chkerr(int);printf("输入进程总数m:");scanf("%d", &m);printf("输入资源种类总数n:");scanf("%d", &n);printf("输入已分配资源数\n");for(i=0;i<m; i++)for(j=0;j<n; j++)scanf("%d", &ALLOCATION[i][j]);printf("输入还需要的资源数\n");for (i=0;i<m; i++)for(j=0;j<n; j++){scanf("%d",&NEED [i][j]);}printf("\n输入可利用的资源数\n");for (i=0;i<n; i++)scanf("%d", &AVAILABLE[i]);showdata();while(flag){i=-1;while(i<0||i>=m){printf("请输入需申请资源的进程号(从0到m-1,否则重输入!):"); scanf("%d",&i);if(i<0||i>=m)printf("输入的进程号不存在,重新输入!\n");}printf("请输入进程%d申请的资源数\n",i);for (j=0;j<n;j++){printf("资源%d: ",j);scanf("%d",&Request[j]);if(Request[j]>NEED[i][j]){printf("进程%d申请的资源量大于%d还需要%d类资源的资源量!",i,i,j);printf("申请不合理,出错!请重新选择\n!");flag=0;break;}else{if(Request[j]>AVAILABLE[j]){printf("进程%d申请的资源数大于系统可用%d类资源的资源量!",i,j);printf("申请不合理,出错!请重新选择!\n");flag=0;break;}}}if(flag){changdata(i);if(chkerr(i)){rstordata(i);}}elseshowdata();printf("\n");printf("是否继续银行家算法演示,按1键继续,按0键退出演示: \n"); scanf("%d",&flag);}return 0;}void showdata(){int i,j;printf("系统可用的资源数为:\n");for (j=0;j<n;j++)printf("资源%d:%d ",j,AVAILABLE[j]);printf("\n");printf("各进程已经得到的资源量:\n ");for (i=0;i<m;i++){printf("进程%d:",i);for (j=0;j<n;j++)printf("资源%d:%d ",j,ALLOCATION[i][j]); printf("\n");}printf("\n");printf("各进程还需要的资源量:\n");for (i=0;i<m;i++){printf("进程%d:",i);for (j=0;j<n;j++)printf("资源%d:%d ",j,NEED[i][j]);printf("\n");}printf("\n");}void changdata(int k){int j;for (j=0;j<n;j++){AVAILABLE[j]=AVAILABLE[j]-Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j];NEED[k][j]=NEED[k][j]-Request[j];}};void rstord{int j;for (j=0;j<n;j++){AVAILABLE[j]=AVAILABLE[j]+Request[j];ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j];NEED[k][j]=NEED[k][j]+Request[j];}};int chkerr(int s){int WORK,FINISH[M],temp[M];int i,j,k=0;for(i=0;i<m;i++)FINISH[i]=FALSE;//将每一个进程的finish值初始化为false for(j=0;j<n;j++){WORK=AVAILABLE[j];i=s;while(i<m){if (FINISH[i]==FALSE&&NEED[i][j]<=WORK){WORK=WORK+ALLOCATION[i][j];FINISH[i]=TRUE;temp[k]=i;k++;i=0;}elsei++;}for(i=0;i<m;i++)if(FINISH[i]==FALSE){printf("\n");printf(" 系统不安全!!! 本次资源申请不成功!!!"); printf("\n");return 1;}}printf("\n");printf("经安全性检查,系统安全,本次分配成功。

操作系统银行家算法C语言代码

操作系统银行家算法C语言代码

操作系统银行家算法C语言代码
银行家算法是保证系统安全的重要算法之一,它主要用于在多进程环境下避免死锁发生。

下面是银行家算法的C语言实现:
```c
#include <stdio.h>
#include <stdbool.h>
printf("请输入进程数和资源数,以空格分隔:");
scanf("%d%d", &m, &n);
printf("请输入各进程所需的最大资源数量:\n");
for (i = 0; i < m; i++)
{
printf("请输入第%d个进程的最大资源数量,以空格分隔:", i);
for (j = 0; j < n; j++)
scanf("%d", &max[i][j]);
}
for (i = 0; i < m; i++)
finish[i] = false;
printf("系统不是安全的,申请不能分配。

\n");
}
}
else
printf("申请不能满足,申请不能分配。

\n");
return 0;
}
```
该代码的输入包括:进程数、资源数、各进程所需的最大资源数、各进程已分配的资源数、系统中剩余的资源数,以及申请资源的进程编号和资源数量。

输出为判断系统是否安全以及申请资源是否成功分配的结果。

若系统是安全的,输出申请已经成功分配;若系统不是安全的,输出申请不能分配。

银行家算法程序代码

银行家算法程序代码

银行家算法程序代码#include<stdio.h>#include<conio.h>#include<iostream>using namespace std;typedef struct Max1 // 资源的最大需求量{int m_a;int m_b;int m_c;}Max;typedef struct Allocation1 //已分配的资源数{int a_a;int a_b;int a_c;}Allocation;typedef struct Need1 //还需要的资源数{int n_a;int n_b;int n_c;}Need;struct Available1 //可利用的资源量{int av_a;int av_b;int av_c;} q;struct pr //定义一个结构{char name;Max max;Allocation allocation;Need need;int finishflag;}p[5];char na[5];//******************************************** void init() //读入文件"1.txt"{cout<<"各进程还需要的资源数NEED:"<<endl;FILE *fp;fp=fopen("1.txt","r+"); // 打开文件"1.txt"for(int i=0;i<5;i++){fscanf(fp,"%c,%d,%d,%d,%d,%d,%d\n",&p[i].name,&p[i].max.m_a,&p[i].max.m_b, &p[i].max.m_c,&p[i].allocation.a_a,&p[i].allocation.a_b,&p[i].allocation.a_c);p[i].need.n_a=p[i].max.m_a-p[i].allocation.a_a;p[i].need.n_b=p[i].max.m_b-p[i].allocation.a_b;p[i].need.n_c=p[i].max.m_c-p[i].allocation.a_c;cout<<p[i].name<<": "<<p[i].need.n_a<<" "<<p[i].need.n_b<<" "<<p[i].need.n_c<<endl;}fclose(fp); //关闭文件}//***********************************************int fenpei()//分配资源{cout<<"Available:";cout<<q.av_a<<" "<<q.av_b<<" "<<q.av_c<<endl;int finishcnt=0,k=0,count=0;for(int j=0;j<5;j++)p[j].finishflag=0;while(finishcnt<5){for(int i=0;i<5;i++){if(p[i].finishflag==0&&q.av_a>=p[i].need.n_a&&q.av_b>=p[i].need.n_b&&q.av_c>=p[i].ne ed.n_c){q.av_a+=p[i].allocation.a_a;q.av_b+=p[i].allocation.a_b;q.av_c+=p[i].allocation.a_c;p[i].finishflag=1;finishcnt++;na[k++]=p[i].name;break;}}count++;//禁止循环过多if(count>5)return 0;}return 1;}//****************************************************int shq() //申请资源{int m=0,i=0,j=0,k=0; //m为进程号; i,j,k为申请的三类资源数cout<<"请输入进程号和请求资源的数目!"<<endl;cout<<"如:进程号资源A B C"<<endl;cout<<" 0 2 0 2"<<endl;cin>>m>>i>>j>>k;if(i<=p[m].need.n_a&&j<=p[m].need.n_b &&k<=p[m].need.n_c){if(i<=q.av_a&&j<=q.av_b&&k<=q.av_c){p[m].allocation.a_a+=i;p[m].allocation.a_b+=j;p[m].allocation.a_c+=k;p[m].need.n_a=p[m].max.m_a-p[m].allocation.a_a;p[m].need.n_b=p[m].max.m_b-p[m].allocation.a_b;p[m].need.n_c=p[m].max.m_c-p[m].allocation.a_c;cout<<"各进程还需要的资源数NEED:"<<'\n';for(int w=0;w<5;w++)cout<<p[w].name<<": "<<p[w].need.n_a<<" "<<p[w].need.n_b<<" "<<p[w].need.n_c<<endl;return 1;}elsecout<<"Request>Available让进程"<<m<<"等待......"<<endl;}elsecout<<"Request>Need,让进程"<<m<<"等待......"<<endl;return 0;}//********************************************void main(){int flag;char c;cout<<" /******** 银行家算法********/ "<<endl;cout<<"确认已经在\"1.txt\"文档中正确输入各进程的有关信息后按回车键"<<endl;getch();init();q.av_a=10; //各种资源的数量q.av_b=5;q.av_c=7;while(flag){for(int i=0;i<5;i++){q.av_a-= p[i].allocation.a_a;q.av_b-= p[i].allocation.a_b;q.av_c-= p[i].allocation.a_c;}if(fenpei()){cout<<"这样配置资源是安全的!"<<endl;cout<<"其安全序列是:";for(int k=0;k<5;k++)cout<<"-->"<<na[k];cout<<endl;cout<<"有进程发出Request请求向量吗?(Enter y or Y)"<<endl;cout<<endl;c=getch();if(c=='y'||c=='Y'){if(shq())continue;else break;}else flag=0;}else{flag=0;cout<<"不安全!!!"<<endl;}}}八.运行结果。

银行家算法C语言代码

银行家算法C语言代码

for(int i=0;i<SMAX;++i)
{
cout<<Available[i]<<"\t";
}
cout<<"\n\n未执行进程目前已得到的资源[Allocation]:"<<endl;
for(i=0;i<PMAX;++i)
{
cout<<"\n进程["<<i<<"] : ";
void SourceRequest(); //资源请求
void FreeSource(); // 资源释放
void ShowProcess(); // 显示已执行进程的顺序
void GrantSource(int i); // 进程i资源分配
bool IsSafe();
bool FindS(int i); //进程i已经是false 现在需要确认每个资源 是不是满足Need[i][j] <= Work[j]
{
cout<<"需要的资源大于资源总量,请重新输入\n";
--j;
continue;
}
cout<<"输入进程["<<i<<"]已经拥有资源["<<j<<"]的数量 :";
cin>>Allocation[i][j];
if(Allocation[i][j] > AvailableTemp[j])
#include <iostream>

操作系统银行家算法C语言代码实现

操作系统银行家算法C语言代码实现

操作系统银⾏家算法C语⾔代码实现 计算机操作系统课设需要,写了两个下午的银⾏家算法(陷在bug⾥出不来耽误了很多时间),参考计算机操作系统(汤⼦瀛) 实现过程中不涉及难度较⼤的算法,仅根据银⾏家算法的思想和步骤进⾏实现。

以下为详细步骤: 定义:max1[ ][ ] : 最⼤需求矩阵,max1[i][j]为第i条进程的第j项资源的最⼤需求数⽬; allocation[ ][ ] : 分配矩阵,allocation[i][j]为第i条进程已分得的第j项资源的数⽬; need[ ][ ] : 需求矩阵,need[i][j]为第i条进程尚需要的第j项资源的数⽬; available[ ] : 可利⽤资源量,available[i]为系统中第i项资源的可分配数⽬; request[ ][ ] : 请求矩阵,request[i][j]表⽰第i条进程对第j项资源的请求数⽬;//可以改成⼀维数组 int safe (int n,int m,int work) : n条进程,m项进程,返回值为1时当前状态安全,否则不安全; 程序流程: 1. 键盘输⼊max1矩阵,allocation矩阵,available数组,计算出need矩阵。

2. 判断当前时刻系统的状态是否安全。

true 转向3,false转向7 3. 判断当前时刻request<=need。

true 转向4,false 转向7 4. 判断当前时刻request<=available。

true 转向5,false 转向75. 进⾏安全性算法检测。

true 转向6,false 转向76. 系统分配资源并继续等待指令。

7. 系统不予分配资源并输出原因。

安全性算法:每次从第⼀个进程开始检测,如遇到所有的m项资源都可以满⾜时,work+=allocation,否则转⼊下⼀个进程的检测。

两种情况跳出第20⾏的循环。

1. 所有finish均为1,i⽆法置为-1 ,i==N时跳出循环2. 存在为0的finish,但直⾄i==N时,仍未有新的work<need出现(从最近的⼀次i==-1算起),i==N时跳出循环 第50⾏进⾏检测区分上述两种情况,如安全返回1,否则返回0;以下为完整的代码实现:(另附测试数据)1 #include<bits/stdc++.h>2int max1[1000][1000]= {0};3int allocation[1000][1000]= {0};4int need[1000][1000]= {0};5int finish[1000]= {0};6int available[1000]= {0};7int request[1000][1000]= {0};8int waitq[1000]= {0};9int waitnum=0;10int safeq[1000]= {0};11int safe (int N , int M ,int work[])12 {13int s=0;14 memset(finish,0,1000*sizeof(int));15for(int i=0; i<M; i++)16 {17 work[i]=available[i];18 }19int flag=1;20for(int i=0; i<N; i++)21 {22 flag=1;23if(!finish[i])24 {25for(int j=0; j<M; j++)26 {27if(need[i][j]>work[j])28 {29 flag=0;30break;31 }32 }33if(flag)34 {35for(int j=0; j<M; j++)36 {37 work[j]+=allocation[i][j];38 printf(" %d ",work[j]);39 }40for(int j=0; j<3; j++)41 printf("%d ",available[j]);42 printf("program %d\n",i);43 safeq[s++]=i;44 finish[i]=1;45 i=-1;46 }47 }48 }49int te=1;50for(int i=0; i<5; i++)51if(!finish[i])52 te=0;53return te;54 }55void print(int pn,int yn)56 {57 printf("current status\n");58char a='A';59int i2=0;60for(i2=0; i2<4; i2++)61 {62switch(i2)63 {64case0:65 printf("Max:");66for(int i=0; i<yn-1; i++)67 printf("");68 printf("");69break;70case1:71 printf("Allocation:");72for(int i=0; i<yn-3; i++)73 printf("");74 printf("");75break;76case2:77 printf("Need:");78for(int i=0; i<yn-1; i++)79 printf("");80break;81case3:82 printf("Available:");83for(int i=0; i<yn-2; i++)84 printf("");85 printf("");86 printf("\n");87break;88 }89 }90for(i2=0; i2<4; i2++)91 {92switch(i2)93 {94case0:95for(int j=0; j<yn; j++)96 printf("%c ",a+j);97break;98case1:99for(int j=0; j<yn; j++)100 printf("%c ",a+j);101break;102case2:103for(int j=0; j<yn; j++)104 printf("%c ",a+j);105break;106case3:107for(int j=0; j<yn; j++)108 printf("%c ",a+j);109break;110111 }112 }113 printf("\n");114for(int i=0; i<pn; i++)115 {116for(int j=0; j<yn; j++)117 {118 printf("%d ",max1[i][j]);119 }120for(int j=0; j<yn; j++)121 {122 printf("%d ",allocation[i][j]);123 }124for(int j=0; j<yn; j++)125 {126 printf("%d ",need[i][j]);127 }128if(i==0)129for(int j=0; j<yn; j++)130 printf("%d ",available[j]);131 printf("\n");132 }133 }134int main()135 {136int work[1000]= {0};137int pn,yn;138 printf("Please input the number of the program\n");139 scanf("%d",&pn);140 printf("Please input the number of the element\n");141 scanf("%d",&yn);142 printf("Please input Max and Allocation of the program \n");143for(int i=0; i<pn; i++)144 {145for(int j=0; j<yn; j++)146 {147 scanf("%d",&max1[i][j]);148 }149for(int j=0; j<yn; j++)150 {151 scanf("%d",&allocation[i][j]);152 }153for(int j=0; j<yn; j++)154 {155 need[i][j]=max1[i][j]-allocation[i][j];156 }157 }158 printf("Please input the Available \n");159for(int i=0; i<yn; i++)160 {161 scanf("%d",&available[i]);162 work[i]=available[i];163 }164165if(safe(pn,yn,work))166 {167 printf("it is safe now \n");168for(int i=0; i<pn; i++)169 printf("%d ",safeq[i]);170 printf("\n");171 printf("is the one of the safe sequence \n");172 }173else174 printf("it is not safe now\n");175176177if(safe(pn,yn,work))178 {179while(1)180 {181int num;182int ex;183int judge=1;184 printf("if you want to exit , please input 0 else input 1 \n"); 185 scanf("%d",&ex);186if(!ex)187break;188 printf("Please input the number of the request program \n"); 189 scanf("%d",&num);190 printf("Please input the Request \n");191for(int i=0; i<yn; i++)192 {193 scanf("%d",&request[num][i]);194if(request[num][i]>need[num][i])195 {196 judge=0;197 printf("error!\n");198break;199 }200 }201if(judge)202 {203int wait=0;204for(int i=0; i<yn; i++)205 {206if(request[num][i]>available[i])207 {208 wait=1;209 printf("wait because request>available!\n"); 210break;211 }212 }213if(!wait)214 {215216for(int j1=0; j1<yn; j1++)217 {218 available[j1]-=request[num][j1];219 allocation[num][j1]+=request[num][j1]; 220 need[num][j1]-=request[num][j1];221 }222if(safe(pn,yn,work))223 {224 printf("it is safe now \n");225for(int i=0; i<pn; i++)226 printf("%d ",safeq[i]);227 printf("\n");228 printf("is the one of the safe sequence \n"); 229 printf("complete !!!!!!!\n");230 }231else232 {233for(int j1=0; j1<yn; j1++)234 {235 available[j1]+=request[num][j1];236 allocation[num][j1]-=request[num][j1]; 237 need[num][j1]+=request[num][j1];238 }239 printf("wait because it is not safe \n"); 240 }241 }242243 }244 }245 }246 print(pn,yn);247 }248249/*250525132527 5 3 0 1 02533 2 2 2 0 02549 0 2 3 0 22552 2 2 2 1 12564 3 3 0 0 22573 3 2258125912601 0 2261126242633 3 0264126502660 2 02670268269270*/。

C语言实现银行家算法

C语言实现银行家算法
x[k] = i;
k++;
//释放该进程后,可利用资源数Work+Allocation
for(j=0;j<scount;j++)
{
printf("%3d",Work[j]);
}printf("\t 1");
printf("\n");
}
}
}
//如果可用资源不能满足任何进程的需要 跳出循环
//例如n=1 done<1则跳出
int requs(int scount,int * Requestnumber,int Request[10],int Allocation[10][10],int Need[10][10],int Available[10])
{
//判断是否有进程提出请求
bool isrequest;
int i,j;
while(true)
{
init(&pcount,&scount,Allocation,Need,Available); //调用初始化函数
print(pcount,scount,Allocation,Need,Available); //调用打印函数
int isreque = requs(scount,&number,Request,Allocation,Need,Available); //调用是否请求函数
C语言实现银行家算法(源码、运行结果)
一、源码
/*
银行家算法 10-22
*/
#include<stdio.h>
//函数声明
void init(int * pcount,int * scount,int Allocation[10][10],int Need[10][10],int Available[10]);

银行家算法源代码

银行家算法源代码
{
printf("there isn't enough resource!\n");
cout<<"wait please........."<<endl;
goto loop;
}
p[nprocess].allacation.A=p[nprocess].allacation.A+req.A;
p[nprocess].allacation.B=p[nprocess].allacation.B+req.B;
p[2].max.A=9;
p[2].max.B=0;
p[2].max.C=2;
p[3].max.A=2;
p[3].max.B=2;
p[3].max.C=2;
p[4].max.A=4;
p[4].max.B=3;
p[4].max.C=3;
p[0].allacation.A=0;
p[0].allacation.B=1;
printf("please input the number of the requesting resource of the process:\n");
printf("resource A:");
cin>>x1;
printf("resource B:");
cin>>x2;
printf("resource C:");
}
resource availableresource(process *p)
{
resource a;
a.A=10-p[0].allacation.A-p[1].allacation.A-p[2].allacation.A-p[3].allacation.A-p[4].allacation.A;

银行家算法的代码(c语言)

银行家算法的代码(c语言)

银行家算法的代码(c语言)#include#include#include# define m 50# define true 1# define false 0int no1; //进程数int no2; //资源数int r;int allocation[m][m],need[m][m],available[m],max[m][m]; char name1[m],name2[m]; //定义全局变量void main(){void check();void print(); //提前声明int i,j,p=0,q=0;char c;int request[m],allocation1[m][m],need1[m][m],available1[m]; printf("**********************************************\n"); printf("* 银行家算法的设计与实现 *\n");printf("**********************************************\n");printf("请输入进程总数:\n");scanf("%d",&no1);printf("请输入资源种类数:\n");scanf("%d",&no2);printf("请输入Max矩阵:\n");for(i=0;i<no1;i++)for(j=0;j<no2;j++)scanf("%d",&max[i][j]); //输入已知进程最大资源需求量printf("请输入Allocation矩阵:\n");for(i=0;i<no1;i++)for(j=0;j<no2;j++)scanf("%d",&allocation[i][j]); //输入已知的进程已分配的资源数for(i=0;i<no1;i++)for(j=0;j<no2;j++)need[i][j]=max[i][j]-allocation[i][j]; //根据输入的两个数组计算出need矩阵的值printf("请输入Available向量\n");for(i=0;i<no2;i++)scanf("%d",&available[i]); //输入已知的可用资源数print(); //输出已知条件check(); //检测T0时刻已知条件的安全状态if(r==1) //如果安全则执行以下代码{do{q=0;p=0;printf("\n请输入请求资源的进程号:\n");for(j=0;j<=10;j++){scanf("%d",&i);if(i>=no1){printf("输入错误,请重新输入:\n");continue;}else break;}printf("\n请输入该进程所请求的资源数request[j]:\n"); for(j=0;j<no2;j++)scanf("%d",&request[j]);for(j=0;j<no2;j++)if(request[j]>need[i][j]) p=1;//判断请求是否超过该进程所需要的资源数if(p)printf("请求资源超过该进程资源需求量,请求失败!\n"); else{for(j=0;j<no2;j++)if(request[j]>available[j]) q=1;//判断请求是否超过可用资源数if(q)printf("没有做够的资源分配,请求失败!\n");else //请求满足条件{for(j=0;j{available1[j]=available[j];allocation1[i][j]=allocation[i][j];need1[i][j]=need[i][j];//保存原已分配的资源数,仍需要的资源数和可用的资源数available[j]=available[j]-request[j];allocation[i][j]+=request[j];need[i][j]=need[i][j]-request[j];//系统尝试把资源分配给请求的进程}print();check(); //检测分配后的安全性i</no2;j++)</no2;j++)</no2;j++)</no2;i++)</no2;j++)</no1;i++)</no2;j++)</no1;i++)</no2;j++)</no1;i++)f(r==0) //如果分配后系统不安全{for(j=0;j<no2;j++){available[j]=available1[j];allocation[i][j]=allocation1[i][j];need[i][j]=need1[i][j];//还原已分配的资源数,仍需要的资源数和可用的资源数}printf("返回分配前资源数\n");print();}}}printf("\n你还要继续分配吗?Y or N ?\n");//判断是否继续进行资源分配c=getche();}while(c=='y'||c=='Y');}}void check() //安全算法函数{int k,f,v=0,i,j;int work[m],a[m];int finish[m];r=1;for(i=0;i<no1;i++)finish[i]=false; // 初始化进程均没得到足够资源数并完成for(i=0;i<no2;i++)work[i]=available[i]; //work[i]表示可提供进程继续运行的各类资源数k=no1;do{for(i=0;i<no1;i++){if(finish[i]==false){f=1;for(j=0;j<no2;j++)if(need[i][j]>work[j])f=0;if(f==1) //找到还没有完成且需求数小于可提供进程继续运行的资源数的进程{finish[i]=true;a[v++]=i; //记录安全序列号for(j=0;j<no2;j++)work[j]+=allocation[i][j]; //释放该进程已分配的资源}}}k--; //每完成一个进程分配,未完成的进程数就减1}while(k>0);f=1;for(i=0;i{if(finish[i]==false){f=0;break;}if(f==0) //若有进程没完成,则为不安全状态{printf("系统处在不安全状态!");r=0;}else{printf("\n系统当前为安全状态,安全序列为:\n");for(i=0;i<no1;i++)printf("p%d ",a[i]); //输出安全序列}}void print() //输出函数{int i,j;printf("\n");printf("*************此时刻资源分配情况**********************\n");printf("进程名 | Max | Allocation | Need |\n");for (i = 0; i < no1; i++){printf(" p%d/%d ",i,i);for (j = 0; j < no2; j++){printf("%d ",max[i][j]);}for (j = 0; j < no2; j++){printf(" %d ",allocation[i][j]);}for (j = 0; j < no2; j++){printf(" %d ",need[i][j]);}printf("\n");}printf("\n");printf("各类资源可利用的资源数为:"); for (j = 0; j < no2; j++){printf(" %d",available[j]);}printf("\n");}</no1;i++)</no2;j++)</no2;j++)</no1;i++)</no2;i++)</no1;i++)</no2;j++)。

操作系统实验---银行家算法代码

操作系统实验---银行家算法代码

程序代码:#include<iostream.h>#include<stdlib.h>#include<string.h>#include<conio.h>#define NULL 0class PCB{public:PCB();PCB(char n[10],int f,int time);//初始化函数void calPCB(int t);//进程调度void waitPCB();//进程等待int statePCB();//返回PCB进程状态void rewritePCB(char n[10],int i,int j);//重置PCB信息void print();void reduce();int f;//优先级int state;//进程状态就绪状态为1,完成状态为0void prin();private:char name[10];int rtime;//需要运行时间int utime;//已运行时间// PCB* next;//链表指针};PCB::PCB(){name[10]='\0';f=0,rtime=0,utime=0,state=0;}PCB::PCB(char n[10],int f,int time){strcpy(name,n);f=f;rtime=time;utime=0;state=1;//初始化进程状态为就绪// next=NULL;}void PCB::calPCB(int t){utime=utime+t;if(utime==rtime)state=0;}void PCB::waitPCB(){f++;//进程等待,优先级+1}int PCB::statePCB(){return state;}void PCB::rewritePCB(char n[10],int i,int j) {strcpy(name,n);f=i;rtime=j;utime=0;state=1;}void PCB::print(){cout<<"此次运行进程"<<name<<" "<<endl;//进程调度输出}void PCB::reduce(){f--;}void PCB::prin(){cout<<name<<" "<<f<<" "<<utime<<" "<<rtime<<" ";if(state==0)cout<<"完成"<<endl;elsecout<<"就绪"<<endl;}//class Squeue{public:Squeue(int num);void EnSqueue(int i);//第i个PCB块void DelSqueue(int i);void sort();int NumSqueue();int Empty();int maxPCB();void operate(int max);PCB* A;private:int front;int rear;char b[100];};Squeue::Squeue(int num){front=0;rear=-1;A=new PCB[num+1];EnSqueue(1);}void Squeue::EnSqueue(int i){char a[10];int m,n;cout<<"输入:第"<<i<<"个进程的名称、优先级和运行时间(以回车键区分):"<<endl;cin>>a>>m>>n;rear++;A[rear].rewritePCB(a,m,n);}void Squeue::sort(){int i,j;PCB X("x",0,0);for(i=front;i<rear;i++){for(j=i+1;j<=rear;j++){if(A[j].f>A[i].f){X=A[i];A[i]=A[j];A[j]=X;}}}}int Squeue::NumSqueue(){return (rear-front+1);}void Squeue::DelSqueue(int i){PCB X("x",0,0);X=A[i];A[i]=A[front];A[front]=X;front++;}int Squeue::Empty(){if(rear!=front-1)return 1;elsereturn 0;//0表示为空队列}int Squeue::maxPCB(){int i=0;int max=0;int maxs=0;for(i=front;i<=rear;i++)if(max<A[i].f){max=A[i].f;maxs=i;}return maxs;//返回优先权最高的PCB块的位置}void Squeue::operate(int max){int i=0;A[max].calPCB(1);A[max].print();A[max].reduce();for(i=front;i<=rear;i++)A[i].waitPCB();PCB X("x",0,0);X=A[max];A[max]=A[rear];A[rear]=X;cout<<"进程名优先级已运行时间需运行时间运行状态"<<endl;//输出所有进程信息for(i=front;i<=rear;i++){A[i].prin();cout<<endl;}}//主程序main(){int t,i,n;cout<<"输入进程总数:"<<endl;cin>>t;Squeue Q(t);for(i=2;i<=t;i++)Q.EnSqueue(i);Q.sort();cout<<"进程调度序列:"<<endl;do{t=Q.NumSqueue();for(i=1;i<=t;i++){if(Q.Empty()){n=Q.maxPCB();Q.operate(n);if(Q.A[n].statePCB()==0)Q.DelSqueue(n);}}}while(t!=0);cout<<"队为空!结束进程"<<endl;}运行结果:输入进程总数:3输入:第1个进程的名称、优先级和运行时间(以回车键区分):p122输入:第2个进程的名称、优先级和运行时间(以回车键区分):p214输入:第3个进程的名称、优先级和运行时间(以回车键区分):p333进程调度序列:此次运行进程p3进程名优先级已运行时间需运行时间运行状态p2 2 0 4 就绪p1 3 0 2 就绪p3 3 1 3 就绪此次运行进程p1进程名优先级已运行时间需运行时间运行状态p2 3 0 4 就绪p3 4 1 3 就绪p1 3 1 2 就绪此次运行进程p3进程名优先级已运行时间需运行时间运行状态p2 4 0 4 就绪p1 4 1 2 就绪p3 4 2 3 就绪此次运行进程p2进程名优先级已运行时间需运行时间运行状态p3 5 2 3 就绪p1 5 1 2 就绪p2 4 1 4 就绪此次运行进程p3进程名优先级已运行时间需运行时间运行状态p2 5 1 4 就绪p1 6 1 2 就绪p3 5 3 3 完成此次运行进程p1进程名优先级已运行时间需运行时间运行状态p2 6 1 4 就绪p3 6 3 3 完成p1 6 2 2 完成此次运行进程p2进程名优先级已运行时间需运行时间运行状态p1 7 2 2 完成p2 6 2 4 就绪此次运行进程p2进程名优先级已运行时间需运行时间运行状态p2 6 3 4 就绪此次运行进程p2进程名优先级已运行时间需运行时间运行状态p2 6 4 4 完成队为空!结束进程Press any key to continue。

银行家算法全部代码

银行家算法全部代码

#include<iostream.h>#include<string.h>#include<stdio.h>#define False 0#define True 1int Max[100][100]={0};//各进程所需各类资源的最大需求int Avaliable[100]={0};//系统可用资源char name[100]={0};//资源的名称int Allocation[100][100]={0};//系统已分配资源int Need[100][100]={0};//还需要资源int Request[100]={0};//请求资源向量int temp[100]={0};//存放安全序列int Work[100]={0};//存放系统可提供资源int M=100;//作业的最大数为int N=100;//资源的最大数为//显示资源矩阵void showdata(){int i,j;cout<<"系统目前可用的资源[Avaliable]:"<<endl;for(i=0;i<N;i++)cout<<name[i]<<" ";cout<<endl;for (j=0;j<N;j++)cout<<Avaliable[j]<<" ";//输出分配资源cout<<endl;cout<<" Max Allocation Need"<<endl; cout<<"进程名 ";for(j=0;j<3;j++){for(i=0;i<N;i++)cout<<name[i]<<" ";cout<<" ";}cout<<endl;for(i=0;i<M;i++){cout<<" "<<i<<" ";for(j=0;j<N;j++)cout<<Max[i][j]<<" ";cout<<" ";for(j=0;j<N;j++)cout<<Allocation[i][j]<<" ";cout<<" ";for(j=0;j<N;j++)cout<<Need[i][j]<<" ";cout<<endl;}}//安全性算法int safe(){int k=0;int i,m,j;int Finish[100]={0};int pro;int pflag=0;//进程标志int Request[100];int rf=1;//请求标志//初始workWork[0]=Avaliable[0];Work[1]=Avaliable[1];Work[2]=Avaliable[2];cout<<"输入请求资源的进程名:"<<endl;do{pflag = 0;cin>>pro;cout<<"\n";if(pro<0&&pro>=M){pflag = 1;cout<<"输入的进程名有误,重新输入...[0..."<<M<<"]";}}while(pflag);cout<<"输入所各类资源请求的数量:例(2 3 4)"<<endl;for(int h=0;h<N;h++){cin>>Request[h];}/*在finish = false情况下request <= needrequest <= available*/int brf = 0; //第一次资源请求是否堵塞int count = 0; //记录已经进行了几次int apply =0;//记录进程被堵塞的次数int pass = 0;//进程通过的次数i=pro;while(count<M){rf = 1; //每次循环默认是能通过的//判断finish 若为false说明还没进行判断true 判断过了,if(Finish[i]==False){//若不是第一次则把请求的数变成是各个进程的NEED值if(count != 0){for(j=0;j<N;j++){Request[j] = Need[i][j];cout<<"Request["<<j<<"]"<<Request[j]<<endl;}}for(j=0;j<N;j++){int r = Request[j];int n = Need[i][j];int w = Work[j];if((r>n)||(r>w)){apply++;//堵塞一次+1rf = 0;cout<<"rf="<<rf<<endl;//请求资源的进程被堵塞了,直接跳出循环到等待。

银行家算法附代码

银行家算法附代码

#include <iostream.h>#include <string.h>#define M 3 //资源的种类数#define N 5 //进程的个数int i ,j;void output(int iMax[N][M],int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]); //统一的输出格式bool safety(int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]);bool banker(int iAllocation[N][M],int iNeed[N][M],int iAvailable[M],char cName[N]);bool tr[N]={false,false,false,false,false};int iMax[N][M]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};int main(){//当前可用每类资源的资源数int iAvailable[M]={3,3,2};//系统中N个进程中的每一个进程对M类资源的最大需求//iNeed[N][M]每一个进程尚需的各类资源数//iAllocation[N][M]为系统中每一类资源当前已分配给每一进程的资源数int iNeed[N][M],iAllocation[N][M]={{0,1,1},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};//进程名char cName[N]={'a','b','c','d','e'};bool bExitFlag=true; //退出标记char ch; //接收选择是否继续提出申请时传进来的值bool bSafe; //存放安全与否的标志//计算iNeed[N][M]的值for(i=0;i<N;i++)for(j=0;j<M;j++)iNeed[i][j]=iMax[i][j]-iAllocation[i][j];//输出初始值output(iMax,iAllocation,iNeed,iAvailable,cName);//判断当前状态是否安全bSafe=safety(iAllocation,iNeed,iAvailable,cName);//是否继续提出申请while(bExitFlag){cout<<"\n"<<"继续提出申请?\ny为是;n为否。

银行家算法代码及运行结果

银行家算法代码及运行结果

#include<iostream.h>#include<string.h>#include<stdio.h>#define False 0#define True 1int Max[100][100]={0};int Avaliable[100]={0};char Name[100]={0};int Allocation[100][100]={0};int Need[100][100]={0};int Request[100]={0};int Temp[100]={0};int Work[100]={0};int M=100;int N=100;//预定义void show()//显示资源矩阵{int i,j;cout<<"当前系统可用的资源[Avaliable]:"<<endl;for(i=0;i<N;i++){cout<<Name[i]<<" ";}cout<<endl;for (j=0;j<N;j++){cout<<Avaliable[j]<<" ";}//输出分配资源cout<<endl;cout<<" Max Allocation Need"<<endl;cout<<"进程名";for(j=0;j<3;j++){for(i=0;i<N;i++){cout<<Name[i]<<" ";}cout<<" ";}cout<<endl;for(i=0;i<M;i++){cout<<" "<<i<<" ";for(j=0;j<N;j++){cout<<Max[i][j]<<" ";}cout<<" ";for(j=0;j<N;j++){cout<<Allocation[i][j]<<" ";}cout<<" ";for(j=0;j<N;j++){cout<<Need[i][j]<<" ";}cout<<endl;}}int change(int i)//进行资源分配{int j;for (j=0;j<M;j++) {Avaliable[j]=Avaliable[j]-Request[j];Allocation[i][j]=Allocation[i][j]+Request[j];Need[i][j]=Need[i][j]-Request[j];}return 1;}int safe()//安全性算法{int i,k=0,m,a,Finish[100]={0};int j;int flag=0;Work[0]=Avaliable[0];Work[1]=Avaliable[1];Work[2]=Avaliable[2];for(i=0;i<M;i++){a=0;for(j=0;j<N;j++){if (Finish[i]==False&&Need[i][j]<=Work[j]){a++;if(a==N){for(m=0;m<N;m++){Work[m]=Work[m]+Allocation[i][m];}//变分配数Finish[i]=True;Temp[k]=i;i=-1;k++;flag++;}}}}for(i=0;i<M;i++){if(Finish[i]==False){cout<<"系统不安全!"<<endl;return -1;}}cout<<"系统是安全的!"<<endl;//如果安全,输出成功cout<<"分配的序列为:";for(i=0;i<M;i++){//输出运行进程数组cout<<Temp[i];if(i<M-1){cout<<"->";}}cout<<endl;return 0;}void share()//利用银行家算法对申请资源进行判定{char ch;int i=0,j=0;ch='y';cout<<"请输入要求分配的资源进程号(0-"<<M-1<<"):";cin>>i;cout<<"请输入进程"<<i<<" 申请的资源:"<<endl;for(j=0;j<N;j++){cout<<Name[j]<<":";cin>>Request[j];}for (j=0;j<N;j++){if(Request[j]>Need[i][j]){//判断申请是否大于需求,若大于则出错cout<<"进程"<<i<<"申请的资源大于它需要的资源";cout<<" 分配不合理,不予分配!"<<endl;ch='n';break;}else {if(Request[j]>Avaliable[j]){//判断申请是否大于当前资源,若大于则出错cout<<"进程"<<i<<"申请的资源大于系统现在可利用的资源";cout<<" 分配出错,不予分配!"<<endl;ch='n';break;}}}if(ch=='y') {change(i);//根据进程需求量变换资源show();//根据进程需求量显示变换后的资源safe();//根据进程需求量进行银行家算法判断}}void add(){//添加资源int n,flag;cout<<"请输入需要添加资源种类的数量:";cin>>n;flag=N;N=N+n;for(int i=0;i<n;i++){cout<<"名称:";cin>>Name[flag];cout<<"数量:";cin>>Avaliable[flag++];}show();safe();}void delR(){//删除资源char ming;int i,flag=1;cout<<"请输入需要删除的资源名称:";do{cin>>ming;for(i=0;i<N;i++)if(ming==Name[i]){flag=0;break;}if(i==N){cout<<"该资源名称不存在,请重新输入:";} }while(flag);for(int j=i;j<N-1;j++){Name[j]=Name[j+1];Avaliable[j]=Avaliable[j+1];}N=N-1;show();safe();}void changeR(){//修改资源cout<<"系统目前可用的资源[Avaliable]:"<<endl;for(int i=0;i<N;i++){cout<<Name[i]<<":"<<Avaliable[i]<<endl;}cout<<"输入系统可用资源[Avaliable]:"<<endl;cin>>Avaliable[0]>>Avaliable[1]>>Avaliable[2];cout<<"经修改后的系统可用资源为"<<endl;for (int k=0;k<N;k++){cout<<Name[k]<<":"<<Avaliable[k]<<endl;}show();safe();}void addP(){//添加作业int flag=M;M=M+1;cout<<"请输入该作业的最大需求量[Max]"<<endl;for(int i=0;i<N;i++){cout<<Name[i]<<":";cin>>Max[flag][i];Need[flag][i]=Max[flag][i]-Allocation[flag][i];}show();safe();}int main(){int i,j,number,choice,m,n,flag;char ming;cout<<"*****************资源管理系统的设计与实现*****************"<<endl;cout<<"请首先输入系统可供资源种类的数量:";cin>>n;N=n;for(i=0;i<n;i++){cout<<"资源"<<i+1<<"的名称:";cin>>ming;Name[i]=ming;cout<<"资源的数量:";cin>>number;Avaliable[i]=number;}cout<<endl;cout<<"请输入作业的数量:";cin>>m;M=m; cout<<"请输入各进程的最大需求量("<<m<<"*"<<n<<"矩阵)[Max]:"<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++){cin>>Max[i][j];}do{flag=0;cout<<"请输入各进程已经申请的资源量("<<m<<"*"<<n<<"矩阵)[Allocation]:"<<endl;for(i=0;i<m;i++)for(j=0;j<n;j++){cin>>Allocation[i][j];if(Allocation[i][j]>Max[i][j]){flag=1;}Need[i][j]=Max[i][j]-Allocation[i][j];}if(flag){cout<<"申请的资源大于最大需求量,请重新输入!\n";} }while(flag);show();//显示各种资源safe();//用银行家算法判定安全性while(choice){cout<<"**************银行家算法的演示***************"<<endl;cout<<" 1:增加资源2:删除资源"<<endl;cout<<" 3:修改资源4:分配资源"<<endl;cout<<" 5:增加作业0:离开"<<endl;cout<<"*******************************************"<<endl;cout<<"请选择功能号:";cin>>choice;switch(choice){case 1: add();break;case 2: delR();break;case 3: changeR();break;case 4: share();break;case 5: addP();break;case 0: choice=0;break;default: cout<<"请正确选择功能号(0-5)!"<<endl;break;}}return 1;}。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include "malloc.h"#include "stdio.h"#include "stdlib.h"#define alloclen sizeof(struct allocation)#define maxlen sizeof(struct max)#define avalen sizeof(struct available)#define needlen sizeof(struct need)#define finilen sizeof(struct finish)#define pathlen sizeof(struct path)struct allocation{int value;struct allocation *next;};struct max{int value;struct max *next;};struct available /*¿ÉÓÃ×ÊÔ´Êý*/{int value;struct available *next;};struct need /*ÐèÇó×ÊÔ´Êý*/{int value;struct need *next;};struct path{int value;struct path *next;};struct finish{int stat;struct finish *next;};int main(){int row,colum,status=0,i,j,t,temp,processtest;struct allocation *allochead,*alloc1,*alloc2,*alloctemp;struct max *maxhead,*maxium1,*maxium2,*maxtemp;struct available *avahead,*available1,*available2,*workhead,*work1,*work2,*worktemp ,*worktemp1;struct need *needhead,*need1,*need2,*needtemp;struct finish *finihead,*finish1,*finish2,*finishtemp;struct path *pathhead,*path1,*path2;printf("\nplease input the kinds of resourse:");scanf("%d",&colum);printf("please input the total number of the progress in the memory:");scanf("%d",&row);printf("please input the matrix of resourses that has allocated :\n"); for(i=0;i<row;i++){for (j=0;j<colum;j++){printf("Please input the number of system resources %c that has been allocated to process p%d:",'A'+j,i);if(status==0){allochead=alloc1=alloc2=(structallocation*)malloc(alloclen);alloc1->next=alloc2->next=NULL;scanf("%d",&allochead->value);status++;}else{alloc2=(struct allocation *)malloc(alloclen);scanf("%d,%d",&alloc2->value);if(status==1){allochead->next=alloc2;status++;}alloc1->next=alloc2;alloc1=alloc2;}}}alloc2->next=NULL;status=0;printf("please input the matrix of progress' maximumrequests:\n");for(i=0;i<row;i++){for (j=0;j<colum;j++){printf("Please input process p%d's maximum requests of system resources %c:",i,'A'+j);if(status==0){maxhead=maxium1=maxium2=(struct max*)malloc(maxlen); maxium1->next=maxium2->next=NULL;scanf("%d",&maxium1->value);status++;}else{maxium2=(struct max *)malloc(maxlen);scanf("%d,%d",&maxium2->value);if(status==1){maxhead->next=maxium2;status++;}maxium1->next=maxium2;maxium1=maxium2;}}}maxium2->next=NULL;status=0;printf("ÇëÊäÈëÏÖʱϵͳʣÓàµÄ×ÊÔ´¾ØÕó:\n");for (j=0;j<colum;j++){printf("ÖÖÀà %c µÄϵͳ×ÊÔ´Ê£Óà:",'A'+j);if(status==0){avahead=available1=available2=(structavailable*)malloc(avalen);workhead=work1=work2=(structavailable*)malloc(avalen);available1->next=available2->next=NULL;work1->next=work2->next=NULL;scanf("%d",&available1->value);work1->value=available1->value;status++;}else{available2=(struct available*)malloc(avalen); work2=(struct available*)malloc(avalen);scanf("%d,%d",&available2->value);work2->value=available2->value;if(status==1){avahead->next=available2;workhead->next=work2;status++;}available1->next=available2;available1=available2;work1->next=work2;work1=work2;}}available2->next=NULL;work2->next=NULL;status=0;alloctemp=allochead;maxtemp=maxhead;for(i=0;i<row;i++)for (j=0;j<colum;j++){if(status==0){needhead=need1=need2=(structneed*)malloc(needlen);need1->next=need2->next=NULL;need1->value=maxtemp->value-alloctemp->value; status++;}else{need2=(struct need *)malloc(needlen);need2->value=(maxtemp->value)-(alloctemp->value);if(status==1){needhead->next=need2;status++;}need1->next=need2;need1=need2;}maxtemp=maxtemp->next;alloctemp=alloctemp->next;}need2->next=NULL;status=0;for(i=0;i<row;i++){if(status==0){finihead=finish1=finish2=(structfinish*)malloc(finilen);finish1->next=finish2->next=NULL;finish1->stat=0;status++;}else{finish2=(struct finish*)malloc(finilen);finish2->stat=0;if(status==1){finihead->next=finish2;status++;}finish1->next=finish2;finish1=finish2;}}finish2->next=NULL; /*Initialization compleated*/ status=0;processtest=0;for(temp=0;temp<row;temp++){alloctemp=allochead;needtemp=needhead;finishtemp=finihead;worktemp=workhead;for(i=0;i<row;i++){worktemp1=worktemp;if(finishtemp->stat==0){for(j=0;j<colum;j++,needtemp=needtemp->next,worktemp=worktemp->nex t)if(needtemp->value<=worktemp->value)processtest++;if(processtest==colum){for(j=0;j<colum;j++){worktemp1->value+=alloctemp->value;worktemp1=worktemp1->next;alloctemp=alloctemp->next;}if(status==0){pathhead=path1=path2=(structpath*)malloc(pathlen);path1->next=path2->next=NULL;path1->value=i;status++;}else{path2=(struct path*)malloc(pathlen);path2->value=i;if(status==1){pathhead->next=path2;status++;}path1->next=path2;path1=path2;}finishtemp->stat=1;}else{for(t=0;t<colum;t++)alloctemp=alloctemp->next;finishtemp->stat=0;}}elsefor(t=0;t<colum;t++){needtemp=needtemp->next;alloctemp=alloctemp->next; }processtest=0;worktemp=workhead;finishtemp=finishtemp->next;}}path2->next=NULL;finishtemp=finihead;for(temp=0;temp<row;temp++){if(finishtemp->stat==0){printf("\nϵͳ´¦ÓÚ·Ç°²È«×´Ì¬!\n"); exit(0);}finishtemp=finishtemp->next;}printf("\nϵͳ´¦ÓÚ°²È«×´Ì¬.\n");printf("\n°²È«ÐòÁÐΪ: \n");do{printf("p%d ",pathhead->value);}while(pathhead=pathhead->next);printf("\n");return 0;}。

相关文档
最新文档