首页 > 编程知识 正文

用银行家算法推测下述资源分配情况,在银行家算法中,对某时刻的资源分配

时间:2023-05-06 05:01:15 阅读:179128 作者:307

实验主题:银行家算法和随机算法下资源分配实验原理:

银行家算法的分配资源是指,假设某个进程请求资源时,首先分配了资源,然后查找各进程的剩余请求,通过进程的分配,系统的剩余资源量是否出现系统死锁如果可能,让进程等待,否则使进程的假分配为真分配。

随机分配算法的分配原则:当进程请求资源时,如果进程的现有资源数量能够满足进程的当前请求数量,则为进程分配资源,否则为等待。 这样,随机算法就有可能引起死锁。

银行家代码:

#includestdio.h//结构struct PCB{char name[10]; int Max[3]; int Allocation[3]; int Need[3]; 插入标签; int finish; int work[3]; int wAllocation[3]; (; int ss=1; //进程符合系统要求voidready(PCB*p,int x,int *Available ) if ) available(0)-p (x ).need )0)=0available(1)-0 //进程完成后,资源返回voidadd(PCB*p、int x、int *Available ) ) for ) intI=0; i3; I () {p[x].work[i]=Available[i]; available [ I ]=p [ x ].allocation [ I ]; p [ x ].w allocation [ I ]=available [ I ]; p[x].finish=ss; }//所有进程的确定和资源处理voidstart(PCB*p,int *Available ) for ) intI=0; i5; I )就绪(p,I,Available ); if(p[I].label==0p[I].finish==0) add(p,I,Available ); }//按结束时间对进程进行排序的voidsort(PCB*p ) {PCB temp; for(intI=0; i4; I ) for(intj=I; j5; j () if ) p[I].finishp[j].finish ) {temp=p[i]; p[i]=p[j]; p[j]=temp; }//输出结果,如果没有死锁,则按照资源的优先顺序进行voidprint(PCB*p ) { int temp=0; for(intI=0; i5; I ) if(p[I].Finish==0) temp=1; if(temp==0) sort ) p; printf(n安全序列是n ); for(intI=0; i5; I ) printf('%3s ',p[i].name ); 打印((n ); printf((n )安全序列矩阵是(n ) ); printf (进程工作进程); for(intI=0; i5; I () printf ) (%4smmmmmmmmmmm(n ),p[i].name,p[i].work[0],p[i].work[1],p[i].work[2]。 p[i].Allocation[1]、p[i].Allocation[2]、p[i].wAllocation[0]、p[i].wAllocation[1]、p[I] }elseif(temp==1) printf )死锁! n '; //比较所有进程和系统,以获得voidfin(PCB*p,int *Available ) {int k=0; //for(intk=0; k5; k () while ) k5 ) ) for ) intI=0; i5; I ) if(p(I ).Finish==0) ) start ) p,Available; 黑; (k; (打印) p; //输入资源的初始状态voidinput(PCB*p,int *Available ) ({printf )进程名称MAX Allocation Needn ); file*r=fopen('2-1.txt ',' r ' ); for(intI=0; i5; I () Fscanf(r,' %4s=======(n ),p[i].name,p[i].Max[0],p[i].Max[1],p[i].Max[1]

amp;p[i].Need[2]);printf("%4s%3d%3d%3d%6d%3d%3d%6d%3d%3dn",p[i].name,p[i].Max[0],p[i].Max[1],p[i].Max[2],p[i].Allocation[0],p[i].Allocation[1],p[i].Allocation[2],p[i].Need[0],p[i].Need[1],p[i].Need[2]);} fclose(r);for(int i=0;i<5;i++){p[i].label=0;p[i].finish=0;}printf("nAvailable:");for(int i=0;i<3;i++)printf("%3d",Available[i]);printf("n"); } //发出请求信号的初始化 void Request(PCB *q,int *nAvailable){int pp;int request[3];printf("输出需要请求的资源:n");scanf("%d",&pp);printf("输入request:n");for(int i=0;i<3;i++)scanf("%d",&request[i]); if(q[pp].Need[0]>=request[0]&&q[pp].Need[1]>=request[1]&&q[pp].Need[2]>=request[2]){for(int i=0;i<3;i++){nAvailable[i]=nAvailable[i]-request[i];q[pp].Allocation[i]=q[pp].Allocation[i]+request[i];q[pp].Need[i]=q[pp].Need[i]-request[i];}Fin(q,nAvailable);}else printf("ERROR!");}//主函数 int main(){PCB p[5];PCB q[5];int Available[3]={3,3,2};int nAvailable[3];input(p,Available);for(int i=0;i<5;i++)q[i]=p[i];for(int i=0;i<3;i++)nAvailable[i]=Available[i];Fin(p,Available);Request(q,nAvailable);}


随机算法代码:

#include<stdio.h>//定义一个结构体 struct PCB{char name[10];int Max[3];int Allocation[3];int Need[3];int label;int finish;int work[3]; int wAllocation[3];};int ss=1;//判断进程是否满足系统需求 void Ready(PCB *p,int x,int *Available){if(Available[0]-p[x].Need[0]>=0&&Available[1]-p[x].Need[1]>=0&&Available[2]-p[x].Need[2]>=0)p[x].label=0;else p[x].label=1;}//进程完成后资源释放 void add(PCB *p,int x,int *Available){for(int i=0;i<3;i++){p[x].work[i]=Available[i];Available[i]+=p[x].Allocation[i];p[x].wAllocation[i]=Available[i];p[x].finish=ss++;}}//对所有进程进行判断和资源处理 void start(PCB *p,int *Available){for(int i=0;i<5;i++){Ready(p,i,Available);if(p[i].label==0&&p[i].finish==0)add(p,i,Available);}}//对进程按照结束时间进行排序 void sort(PCB *p){PCB temp;for(int i=0;i<4;i++)for(int j=i;j<5;j++){if(p[i].finish>p[j].finish){temp=p[i];p[i]=p[j];p[j]=temp;}}}//对结果进行输出,若无死锁,按照资源先后顺序输出 void print(PCB *p){ int temp=0; for(int i=0;i<5;i++)if(p[i].finish==0)temp=1;if(temp==0){sort(p);printf("n安全序列为:n"); for(int i=0;i<5;i++)printf("%3s",p[i].name);printf("n");}else if(temp==1){printf("出现死锁!n"); printf("已完成进程为:n");for(int i=0;i<5;i++)if(p[i].finish!=0)printf("%3s",p[i].name);}}//将所有进程和系统进行比较 void Fin(PCB *p,int *Available){int k=0;//for(int k=0;k<5;k++){while(k<5){for(int i=0;i<5;i++)if(p[i].finish==0){start(p,Available); break; } k++; } print(p);}//输入资源初始状态void input(PCB *p,int *Available){printf("进程名 MAX Allocation Needn"); FILE *r=fopen("2-1.txt","r");for(int i=0;i<5;i++){ fscanf(r,"%4s%3d%3d%3d%3d%3d%3d%3d%3d%3dn",p[i].name,&p[i].Max[0],&p[i].Max[1],&p[i].Max[2],&p[i].Allocation[0],&p[i].Allocation[1],&p[i].Allocation[2],&p[i].Need[0],&p[i].Need[1],&p[i].Need[2]);printf("%4s%3d%3d%3d%6d%3d%3d%6d%3d%3dn",p[i].name,p[i].Max[0],p[i].Max[1],p[i].Max[2],p[i].Allocation[0],p[i].Allocation[1],p[i].Allocation[2],p[i].Need[0],p[i].Need[1],p[i].Need[2]);} fclose(r);for(int i=0;i<5;i++){p[i].label=0;p[i].finish=0;}printf("nAvailable:");for(int i=0;i<3;i++)printf("%3d",Available[i]);printf("n"); } //主函数 int main(){PCB p[5];int Available[3]={0,1,1};input(p,Available);Fin(p,Available);}

代码当中初始化内容中读入文件内容如下:

实验结果如下:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。