操作系统实验,用C或者C++实现银行家算法

来源:互联网 发布:什么是数据挖掘技术 编辑:程序博客网 时间:2024/05/29 15:30

实验内容与要求

用C或C++语言实现下列要求,并写出实验报告,报告内容包括:题目、目的、内容和要求、程序清单、运行情况(输入、输出)、总结。 系统中有进程P0、P1、P2、P3、P4,三种资源数量分别为 A=10、 B=5、C=7,T0时刻资源情况如下:

分析T0时刻安全性,输出分析结果,若安全输出安全序列。

输入P1提出请求 :Request1(1,0,2)用银行家算法分析这个请求是否可满足,输出分析结果。若可满足,输出系统安全序列

 #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("\t\t**********************************************\n");printf("\t\t*           银行家算法的设计与实现           *\n");    printf("\t\t**********************************************\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");}

原创粉丝点击