操作系统课程设计银行家算法

来源:互联网 发布:提前还房贷 知乎 编辑:程序博客网 时间:2024/05/16 00:36
#include<iostream>#include<assert.h>using namespace std;typedef struct Arithmetic{char name;int Max[5];int Allocation[5];int Need[5];int OP;}ari;typedef struct In{ari a[5];int size;}in;int avi[5];//全局变量(当前进程)int arr[5];//全局变量//打印函数void my_printf(in &in, int &num){int i = 0;int j = 0;if (in.size == 0){cout << "空" << endl;return;}while (i<in.size){cout << "n:\t";cout << in.a[i].name << endl;cout << "M:\t";for (j = 0; j<num; j++){cout << in.a[i].Max[j] << "\t";}printf("\n");cout << "A:\t";for (j = 0; j<num; j++){cout << in.a[i].Allocation[j] << "\t";}printf("\n");cout << "N:\t";for (j = 0; j<num; j++){cout << in.a[i].Need[j] << "\t";}cout << "\n";i++;}printf("\n");cout << "V:\t";for (j = 0; j<num; j++){cout << avi[j] << "\t";}printf("\n");}//初始化函数void init(in &in, int &num){int i = 0;in.a[in.size].OP = 0;for (i = 0; i<num; i++){printf("请输入Max[%d]:>",i);scanf("%d", &in.a[in.size].Max[i]);printf("\n");}for (i = 0; i < num; i++){printf("请输入Allocation[%d]:>", i);scanf("%d", &in.a[in.size].Allocation[i]);printf("\n");avi[i] = arr[i] - in.a[in.size].Allocation[i];arr[i] = avi[i];}for (i = 0; i<num; i++){printf("Need[%d]:>", i);in.a[in.size].Need[i] = in.a[in.size].Max[i] - in.a[in.size].Allocation[i];printf("%d", in.a[in.size].Need[i]);printf("\n");}printf("请输入name:>");cin>>in.a[in.size].name;printf("\n");in.size++;}//判断函数(当前是否安全)void judge(in in, int &num, ari tmp = {0}){int work[5];int i = 0;int j = 0;int count = 0;for (i = 0; i < num; i++){work[i] = avi[i];}for (i = 0; i < in.size; i++){for (j = 0; j < num; j++){if (in.a[i].Need[j]>work[j])break;}if (j == num){for (j = 0; j < num; j++){work[j] += in.a[i].Allocation[j];}ari tmp = in.a[count];in.a[count] = in.a[i];in.a[i] = tmp;in.a[count].OP = 1;count++;i = count-1;}}for (i = 0; i < in.size; i++){if (in.a[i].OP != 1){printf("false!\n");for (j = 0; j < num; j++){avi[j] += tmp.Need[j];in.a[i].Need[j] += tmp.Need[j];}break;}}my_printf(in, num);}//请求函数(请求获得资源,判断是否可以分配资源)void requst(in &in,int &num){ari tmp;int value = 0;int i = 0;for (i = 0; i < num; i++){printf("请输入要请求的向量%d:>",i);scanf("%d", &tmp.Need[i]);}printf("请输入要请求资源的进程名:>");cin>>tmp.name;int count = in.size-1;while (count){if (tmp.name == in.a[count].name)break;count--;}for (i = 0; i < num; i++){if (tmp.Need[i]>in.a[count].Need[i] || tmp.Need[i] > avi[i]){printf("请求不成功!\n");break;}}if (i == num){printf("请求成功!\n");for (i = 0; i < num; i++){in.a[count].Need[i] -= tmp.Need[i];in.a[count].Allocation[i] += tmp.Need[i];avi[i] -= tmp.Need[i];if (in.a[count].Need[i] == 0){value++;}}if (value == num);{avi[i] += in.a[count].Allocation[i];in.a[count].Allocation[i] = 0;}judge(in, num,tmp);}}void Meue(){printf("*****************\n");printf("****1.init*******\n");printf("****2.printf*****\n");printf("****3.requst*****\n");printf("****4.judge******\n");printf("*****************\n");}int main(){in in;in.size = 0;int tmp = 0;int num = 0;int i = 0;printf("请输入资源总数:");scanf("%d", &num);for (i = 0; i<num; i++){printf("请输入资源总量%d:",i);scanf("%d", &arr[i]);}while (1){Meue();printf("请选择:〉");scanf(" %d", &tmp);switch (tmp){case 1:init(in, num);break;case 2:my_printf(in,num);break;case 3:requst(in,num);break;case 4:            judge(in, num);break;}}return 0;}

0 0