操作系统银行家算法源代码
银行家算法(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;}}。
操作系统实验3 银行家算法附代码
《操作系统》实验三内容要求09软一 0925114047 杨秦香【实验题目】:预防进程死锁的银行家算法【实验学时】:4学时【实验目的】通过这次实验,加深对进程死锁的理解,进一步掌握进程资源的分配、死锁的检测和安全序列的生成方法。
【实验内容】问题描述:设计程序模拟预防进程死锁的银行家算法的工作过程。
假设有系统中有n个进程P1, …,P n,有m类可分配的资源R1, …,R m,在T0时刻,进程P i分配到的j类资源为Allocation ij个,它还需要j类资源Need ij个,系统目前剩余j类资源Work j个,现采用银行家算法进行进程资源分配预防死锁的发生。
程序要求如下:1)判断当前状态是否安全,如果安全,给出安全序列;如果不安全给出理由。
2)对于下一个时刻T1,某个进程P k会提出请求Request(R1, … ,R m),判断分配给P k进程请求的资源之后。
3)输入:进程个数n,资源种类m,T0时刻各个进程的资源分配情况(可以运行输入,也可以在程序中设置);4)输出:如果安全输出安全的进程序列,不安全提示信息。
实现提示:用C++语言实现提示:1)程序中进程调度时间变量描述如下:int Available[MaxNumber];int Max[MaxNumber][MaxNumber];int Allocation[MaxNumber][MaxNumber];int Need[MaxNumber][MaxNumber];int Request[MaxNumber];int SafeOrder[MaxNumber];2)进程调度的实现过程如下:➢变量初始化;➢接收用户输入n,m,(输入或者默认的)Allocation ij,Need ij;➢按照银行家算法判断当前状态安全与否,安全给出安全序列,不安全给出提示;➢如果安全,提示用户输入下一时刻进程P k的资源请求Request(R1, … ,R m);➢如果不安全或者无新请求则退出。
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");}}```。
#操作系统课程设计-银行家算法(流程图 源代码 设计报告)
操作系统课程设计-银行家算法(流程图+源代码+设计报告)一、实验目的:熟悉银行家算法,理解系统产生死锁的原因及避免死锁的方法,加深记意。
二、实验要求:用高级语言编写和调试一个描述银行家算法的程序。
三、实验内容:1、设计一个结构体,用于描述每个进程对资源的要求分配情况。
包括:进程名——name[5],要求资源数目——command[m](m类资源),还需要资源数目——need[m],已分配资源数目——allo[m]。
2、编写三个算法,分别用以完成:①申请资源;②显示资源;③释放资源。
(动态完成)四、程序流程图五、源程序:最新版本:bk5.c/*bk2.c::可以自定义进程及资源数目,可选择读文件或创建新文件,但不超过10,5*//*可修改# define NP 10*//* # define NS 5 */ /*资源种类*//*bk3.c::可以继续分配资源(〉2)*//*bk4.c::可保存分析结果*//*bk5.c::除以上功能外,对暂时不能分配的可以进行另外一次尝试,并恢复已分配的资源*//*四、程序流程图:五、源程序:最新版本:bk5.c/*bk2.c::可以自定义进程及资源数目,可选择读文件或创建新文件,但不超过10,5*//*可修改#define NP10*//* #define NS5*//*资源种类*//*bk3.c::可以继续分配资源(〉2)*//*bk4.c::可保存分析结果*//*bk5.c::除以上功能外,对暂时不能分配的可以进行另外一次尝试,并恢复已分配的资源*/ #include "string.h"#include "stdio.h"#include"dos.h"#include"conio.h"#define MOVEIN1#define GUIYUE2#define ACC3#define OK1#define ERROR0#define MAXSH7#define MAXSHL10#define MAXINPUT50#define maxsize 100int act;int ip=0;int line=0; /*line为要写的行号,全局变量*/int writeok;int right;char wel[30]={"Welcome To Use An_Li System"};char ente[76]={" 警告:未经作者同意不得随意复制更改!"};char rights[40]={"Copyright (c)2002"};struct date today;sssssssssssss;ttttttttttttt{int data[maxsize];int top;}stack;int emptystack(stack*S){if(S->top==48&&S->data[S->top]==35)return(1); /*35is'#'*/else return(0);}int push(stack*S,int x){if(S->top>=maxsize-1)return(-1);else{S->top++;S->data[S->top]=x;return(0);}int gettop(stack*S){return S->data[S->top];}int pop(stack*S){if(emptystack(S)){printf("the stack is empty\n");exit(1);}else S->top--;return S->data[S->top+1];}void initstack(stack*S){int i;S->top=0;S->data[S->top]=35;}/*****模拟打字机的效果*********/delay_fun(){int i;void music();for(i=0;;i++){if(wel!='\0'){delay(1000);textcolor(YELLOW);gotoxy(26+i,8);cprintf("%c",wel);printf("谢谢");printf("网络");music(1,60);}else break;}delay(500000);for(i=0;;i++){if(ente!='\0'){delay(1000);textcolor(RED);/*显示警告及版权*/gotoxy(2+i,11);cprintf("%c",ente);}else break;}delay(40000);for(i=0;;i++){if(rights!='\0'){delay(1000);textcolor(YELLOW);gotoxy(30+i,14);cprintf("%c",rights);music(1,60);}elsebreak;}getch();}/*********登陆后的效果**********/ logined(){int i;clrscr();gotoxy(28,10);textcolor(YELLOW);cprintf("程序正在载入请稍候....."); gotoxy(35,12);for(i=0;i<=50;i++){gotoxy(40,12);delay(8000);cprintf("%02d%已完成",i*2);gotoxy(i+15,13);cprintf("\n");cprintf("|");}main0();}/*********对PC扬声器操作的函数****/void music(int loop,int f)/*f为频率*/ {int i;for(i=0;i<30*loop;i++){sound(f*20);}int analys(int s,int a){int hh,pos;switch(a){case(int)'i':hh=0;break;case(int)'+':hh=1;break;case(int)'*':hh=2;break;case(int)'(':hh=3;break;case(int)')':hh=4;break;case(int)'#':hh=5;break;case(int)'E':hh=6;break;case(int)'T':hh=7;break;case(int)'F':hh=8;break;default:{printf("\n analys()分析发现不该有的字符%c!(位置:%d)",a,ip+1); writeerror('0',"\n............分析出现错误!!!");writeerror(a,"\n 错误类型: 不该有字符");printf("谢谢");printf("网");return ERROR;}}pos=(s-48)*10+hh;switch(pos){case3:case43:case63:case73:act=4;return MOVEIN;case0:case40:case60:case70:act=5;return MOVEIN;case11:case81:act=6;return MOVEIN;case92:case22:act=7;return MOVEIN;case84:act=11;return MOVEIN;/*-------------------------------------------*/case91:case94:case95:act=1;return GUIYUE;case21:act=2;return GUIYUE;case101:case102:case104:case105:act=3;return GUIYUE;case31:case32:case34:case35:act=4;return GUIYUE;case111:case112:case114:case115:act=5;return GUIYUE;case51:case52:case54:case55:act=6;return GUIYUE;/*+++++++++++++++++*/case15:return ACC;/*******************************/case6:return1;case7:case47:return2;case8:case48:case68:return3;case46:return8;case67:return9;case78:return10;default:{if(a=='#')printf("");else printf("\n analys() 分析发现字符%c 不是所期望的!(位置:%d)",a,ip+1);writeerror('0',"\n...........分析出现错误!!!");writeerror(a,"\n 错误类型: 字符");writeerror('0'," 不是所期望的!");printf("谢谢");printf("网");return ERROR;}}}int writefile(int a,char*st){FILE*fp;fp=fopen("an_slr.txt","a");{fprintf(fp,"%s",st); /*若a==-1则为添加的注释*/}else if(a==-2){getdate(&today);gettime(&now);fprintf(fp,"\n测试日期:%d-%d-%d",today.da_year,today.da_mon,today.da_day);测试时间:%02d:%02d:%02d",now.ti_hour,now.ti_min,now.ti_sec); fprintf(fp,"}else if(a>=0)fprintf(fp,"\n step:%02d,%s",a,st);writeok=1;fclose(fp);}return writeok;}int writeerror(char a,char*st) /*错误类型文件*/{FILE*fpp;fpp=fopen("an_slr.txt","a");if(fpp==0){printf("\nwrite error!!");writeok=0;}else{if(a=='0')fprintf(fpp,"%s",st); /*若a=='0' 则为添加的注释*/else fprintf(fpp,"%s\'%c\'(位置:%d)",st,a,ip+1);writeok=1;fclose(fpp);}return writeok;}/*^^^^^^^^^^^^^^^^^^^^^^*/main0(){int an,flag=1,action,lenr;char a,w[MAXINPUT];int len,s,ss,aa,ana;stack*st;char r[MAXSH][MAXSHL];/*初始化产生式*/strcpy(r[0],"S->E");strcpy(r[1],"E->E+T");strcpy(r[2],"E->T");strcpy(r[3],"T->T*F");strcpy(r[4],"T->F");strcpy(r[5],"F->(E)");strcpy(r[6],"F->i");clrscr();printf("\nplease input analyse string:\n");gets(w);len=strlen(w);w[len]='#';w[len+1]='\0';push(st,48); /*(int)0 进栈*/writefile(-1,"\n------------------------SLR(1)词法分析器-------------------------"); writefile(-1,"\n计本003 安完成于2003.01.1214:04"); writefile(-1,"\n谢谢");writefile(-1,"网");writefile(-1,"\n 以下为串");writefile(-1,w);writefile(-1,"('#'为系统添加)的分析结果:");writefile(-2,"");do{s=gettop(st);aa=(int)w[ip];action=analys(s,aa);if(action==MOVEIN){ss=48+act;push(st,aa);push(st,ss); /*if ss=4int=52*/ip++;}else if(action==GUIYUE){lenr=strlen(r[act])-3;for(an=0;an<=2*lenr-1;an++)pop(st); /*#0 */s=gettop(st); /*s=0*/push(st,(int)r[act][0]);/*将产生式左端F 进栈*/ana=analys(s,(int)r[act][0])+48;if(ana>59)printf("\分析出错:ana>59!!!");push(st,ana);/*analys(s,aa)即为goto(s',aa)*/if((line+1)%20==0){printf("\nThis screen is full,press any key to continue!!!");getche();clrscr();}printf("step%02d: %s\n",line++,r[act]);writefile(line,r[act]);}else if(action==ACC){flag=0;right=1;}else if(action==ERROR){flag=0;right=0;}/*接受成功*/else{flag=0;right=0;}/* 出错*/}while(flag==1);if(right==1)printf("\nok,输入串%s 为可接受串!!",w);if(right==0)printf("\nsorry,输入串%s 分析出错!!",w);if(writeok==1){printf("\nAnWin soft have wrote a file an_slr.txt");if(right==1)writefile(-1,"\n最终结果:输入串为可接受串!");}}main() /*主函数*/{clrscr();delay_fun();logined();}六、测试报告-操作系统课程设计-银行家算法(流程图+源代码+设计报告)六、测试报告:(测试结果保存于系统生成的an.txt 文件中)以下为课本上的实例::-------------------------------------------------------------------------------------========================银行家算法测试结果=========================-------------------------------------------------------------------------------------T0 时刻可用资源(Available)A:3,B:3,C:2测试日期:2003-6-28请求分配时间:14:07:29经测试,可为该进程分配资源。
银行家算法代码
1交互层的实现交互层被直接设计成main函数:int main(){_Resource r;r.init();_Control c(r);vector<_Process> p;bool is=false;while(true){int x;cout<<endl;cout<<"1.创建进程"<<endl;cout<<"2.执行一个进程"<<endl;cout<<"3.退出"<<endl;while(true){/*输入数据合法性检查*/cin>>x;if(cin.fail()){cout<<"您输入的数据不合法,请重新输入!"<<endl;cin.clear();cin.sync();continue;}else{if(x<=0){cout<<"您输入的数据不合法,请重新输入!"<<endl;cin.clear();cin.sync();continue;}cin.clear();cin.sync();break;}}switch(x){case 1:p=create(r,c),is=true;break;case 2:if(is)run(p,r,c);else{cout<<"您还未创建进程!"<<endl;}break;case 3:exit(0);default:cout<<"输入数据不合法,请重新输入!"<<endl;}//输出各矩阵的状态out(p,r,c);}return 0;}2交互逻辑层的实现1. vector<_Process> create(_Resource &r,_Control &c)(创建进程)的实现。
java银行家算法代码实现
java银行家算法代码实现=================一、算法简介------银行家算法是一种用于避免系统发生死锁的算法,它通过分析系统资源分配情况,判断系统是否处于安全状态,从而避免死锁的发生。
Java银行家算法是一种基于Java语言的实现,它通过模拟系统资源分配情况,判断系统是否处于安全状态。
二、算法实现------以下是一个简单的Java银行家算法代码实现:```javapublicclassBankerAlgorithm{//资源数量和最大需求量privateint[]resource=newint[10];//例如:包括x,y,z三种资源,分别对应i-x1-x2-z...-xi-yi-zi...privateint[]maxDemand=newint[10];privateint[]available=newint[10];//当前可用资源数量privateint[]allocation=newint[10];//当前已分配资源数量privateint[]need=newint[10];//当前进程需求量privateint[]saved=newint[10];//已保存的安全序列中最后一个进程的资源需求量privateint[]process=newint[5];//进程集合,包括进程编号和进程所需资源量privateint[]processMax=newint[5];//进程最大需求量集合privateint[]systemSafe=0;//系统是否处于安全状态的标志位privateinttotalSystemSafe=0;//总共是否有足够资源可以安全运行的标志位//初始化资源分配信息publicvoidinitialize(int[][]allocationMatrix){for(inti=0;i<allocationMatrix.length;i++){process[i]=allocationMatrix[i][0];//进程编号processMax[i]=allocationMatrix[i][1];//进程最大需求量available[i]=allocationMatrix[i][2];//当前可用资源数量need[i]=allocationMatrix[i][3];//当前进程需求量maxDemand[i]=allocationMatrix[i][4];//当前进程最大需求量}systemSafe=true;//系统默认处于安全状态totalSystemSafe=true;//总共是否有足够资源可以安全运行的标志位默认设置为true}//检查系统是否处于安全状态,并返回检查结果和可能的执行序列(从开始到结束)publicboolean[]checkAndPrintSafePath(){intcurrentSystemSafe=false;//检查后的系统是否处于安全状态的标志位boolean[]safePath=newboolean[process.length];//安全序列for(inti=0;i<process.length;i++){if(need[i]<=available[i]){//如果当前进程需要的资源小于等于当前可用资源数量,则可以继续执行下去safePath[i]=true;//将当前进程标记为已执行过,并加入到安全序列中available[i]-=need[i];//将当前可用资源数量减去当前进程的已分配量,表示系统多出来的资源数量为已分配的减去需求的currentSystemSafe=true;//将当前系统的安全状态标记为true,因为已经有至少一个进程能够执行下去了}else{//如果当前进程需要的资源大于当前可用资源数量,则需要检查系统是否有足够的资源可以继续执行下去intavailableSum=0;//系统剩余的可用资源数量之和for(intj=0;j<process.length;j++){//将所有可用资源的数量累加起来availableSum+=available[j];}if(availableSum>=processMax[i]){//如果系统剩余的可用资源数量之和大于等于当前进程的最大需求量,则系统可以继续执行下去,否则需要重新分配资源并返回结果重新开始执行安全序列为null;如果为空说明不满足要求否则输出一个安全的执行序列,开始输出可执行的进程数以及所分配的资源和后续的系统安全状态标记等信息totalSystemSafe=false;//将当前系统安全状态的标志位置为false,因为此时不满足安全状态的要求,需要重新开始执行程序,且此次循环的完整性和执行性需要考虑已经完成过的安全序列重新考虑这些因素的修改可能会被重用)确保安全性序列不再更改);再次输出完整的信息需要重新考虑这些因素以确保安全性序列不再更改)并返回结果;如果为true则说明系统已经处于安全状态并输出一个安全的执行序列;如果为false则说明。
银行家算法java代码
银行家算法java代码银行家算法是一种用于避免死锁的算法,它可以保证系统在分配资源时不会陷入死锁状态。
在操作系统中,银行家算法被广泛应用于进程调度和资源管理中。
本文将介绍银行家算法的原理和实现,并提供Java代码示例。
一、银行家算法原理银行家算法是基于资源分配图的理论基础上发展而来的。
资源分配图是描述进程和资源之间关系的一种图形表示方法。
在资源分配图中,每个进程和每个资源都表示为一个节点,进程需要的资源和已经被占用的资源之间连接一条边。
银行家算法通过模拟进程请求和释放资源的过程来判断是否会出现死锁。
当一个进程请求某些资源时,如果系统能够满足其请求,则该进程可以继续执行;否则,该进程必须等待直到有足够的资源可用。
当一个进程释放掉已经占用的某些资源时,系统会将这些资源重新分配给其他需要它们的进程。
为了避免死锁,银行家算法采取了预防措施:在分配任何一个新任务之前,先检查该任务所需求各类资料是否超过了系统现有的资料总量,如果超过了,则不予分配。
否则,再检查该任务所需求各类资料是否超过了系统现有的未分配资料总量,如果超过了,则不予分配。
二、银行家算法实现银行家算法的实现需要考虑以下几个方面:1.资源分配图的表示方法:可以使用邻接矩阵或邻接表来表示资源分配图。
2.进程请求和释放资源的模拟:可以使用数组来存储进程占用和需要的资源数量,并通过对数组的修改来模拟进程请求和释放资源的过程。
3.死锁检测:可以使用安全序列或银行家算法来判断是否会出现死锁。
下面是一个基于银行家算法实现的简单Java代码示例:public class BankerAlgorithm {// 进程数private int n;// 资源数private int m;// 各进程已占用资源数量private int[][] allocation;// 各进程尚需资源数量private int[][] need;// 系统剩余可用资源数量private int[] available;/*** 构造函数* @param n 进程数* @param m 资源数* @param allocation 各进程已占用资源数量* @param need 各进程尚需资源数量* @param available 系统剩余可用资源数量*/public BankerAlgorithm(int n, int m, int[][] allocation, int[][] need, int[] available) {this.n = n;this.m = m;this.allocation = allocation;this.need = need;this.available = available;}/*** 模拟进程请求资源* @param pid 进程ID* @param request 请求的资源数量* @return 是否满足请求*/public boolean requestResources(int pid, int[] request) { // 检查请求是否超过进程所需的资源数量for (int i = 0; i < m; i++) {if (request[i] > need[pid][i]) {return false;}}// 检查请求是否超过系统剩余的资源数量for (int i = 0; i < m; i++) {if (request[i] > available[i]) {return false;}}// 模拟进程占用资源的过程for (int i = 0; i < m; i++) {available[i] -= request[i];allocation[pid][i] += request[i];need[pid][i] -= request[i];}return true;}/*** 模拟进程释放资源* @param pid 进程ID* @param release 释放的资源数量*/public void releaseResources(int pid, int[] release) { // 模拟进程释放资源的过程for (int i = 0; i < m; i++) {available[i] += release[i];allocation[pid][i] -= release[i];need[pid][i] += release[i];}}/*** 判断系统是否安全* @return 是否安全*/public boolean isSafe() {// 初始化工作数组int[] work = new int[m];for (int i = 0; i < m; i++) {work[i] = available[i];}boolean[] finish = new boolean[n]; for (int i = 0; i < n; i++) {finish[i] = false;}// 查找可用的进程int count = 0;while (count < n) {boolean found = false;for (int i = 0; i < n; i++) {if (!finish[i]) {boolean canRun = true;for (int j = 0; j < m; j++) { if (need[i][j] > work[j]) { canRun = false;break;}}if (canRun) {finish[i] = true;found = true;count++;for (int j = 0; j < m; j++) {work[j] += allocation[i][j];}}}}if (!found) {return false;}}return true;}}三、总结银行家算法是一种重要的避免死锁的算法,它可以在系统分配资源时避免出现死锁状态。
银行家算法程序代码
银行家算法程序代码#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;}}}八.运行结果。
操作系统银行家算法代码
附录:源代码#include <iostream>using namespace std;#define MAXPROCESS 100 //最大进程数#define MAXRESOURCE 100 //最大资源数int totalAllot[100];int totalAvail[100];int Available[100]; //可用资源数组int Max[100][100]; //最大需求矩阵int Allocation[100][100]; //分配矩阵int Need[100][100]; //需求矩阵int Request[100][100]; //进程需要资源数int Work[100]; //工作数组bool Finish[100]; //系统是否有足够的资源分配int p[100]; //记录序列int m,n; //m个进程,n个资源void Init();bool Safe();void Bank();void showsafe();int main(){Init();Safe();Bank();return true;}void Init() //初始化算法{int i,j;printf("请输入进程的数目:");scanf("%d",&m);printf("请输入资源的种类:");scanf("%d",&n);printf("请输入各个资源现有的数目:\n"); for(i=0;i<n;i++){scanf("%d",&totalAvail[i]);}printf("请输入每个进程最多所需的各资源数,按照mxn矩阵输入\n"); for(i=0;i<m;i++)for(j=0;j<n;j++){scanf("%d",&Max[i][j]);}printf("请输入每个进程已分配的各资源数,也按照mxn矩阵输入\n"); for(i=0;i<m;i++)for(j=0;j<n;j++){scanf("%d",&Allocation[i][j]);Need[i][j]=Max[i][j]-Allocation[i][j];if(Need[i][j]<0){printf("您输入的第i+1个进程所拥有的第j+1个资源数错误,请重新输入:");j--;continue;}}for(i=0;i<n;i++){for(j=0;j<m;j++){totalAllot[i]+=Allocation[j][i];}Available[i]=totalAvail[i]-totalAllot[i];}printf("系统目前可用的资源:\n");for(j=0;j<n;j++)printf("%d ",Available[j]);printf("\n已有进程分配情况"); //输出初始化结果printf("\n进程号Max Allocation Need Available"); for(i=0;i<m;i++){printf("\n%d ",i);for(j=0;j<n;j++){printf("%d ",Max[i][j]);}printf(" ");for(j=0;j<n;j++){printf("%d ",Allocation[i][j]);}printf(" ");for(j=0;j<n;j++){printf("%d ",Need[i][j]);}printf(" ");for(j=0;j<n;j++){ printf("%d ",Available[j]);}}}void Bank() //银行家算法{int i,jc;int flag;while(1){printf("请输入要申请资源的进程号0--n-1\n"); scanf("%d",&jc);printf("请输入进程所请求的各资源的数量\n"); for(i=0;i<n;i++){scanf("%d",&Request[jc][i]);}for(i=0;i<n;i++){if(Request[jc][i]>Need[jc][i]){printf("您输入的请求数超过进程的需求量!请重新输入!\n"); continue;}if(Request[jc][i]>Available[i]){printf("您输入的请求数超过系统有的资源数!请重新输入!\n"); continue;}}for(i=0;i<n;i++){Available[i]-=Request[jc][i]; Allocation[jc][i]+=Request[jc][i]; Need[jc][i]-=Request[jc][i];}if(Safe()){printf("同意分配请求!");}else{printf("您的请求被拒绝!");for(i=0;i<n;i++){Available[i]+=Request[jc][i]; Allocation[jc][i]-=Request[jc][i]; Need[jc][i]+=Request[jc][i];}}for(i=0;i<m;i++){Finish[i]=false;}printf("您还想再次请求分配吗?是请按1,否请0\n"); scanf("%d",&flag);if(flag==1){continue;}break;}}bool Safe() //安全性算法{int i,j,k,l=0;for(i=0;i<n;i++)Work[i]=Available[i]; for(i=0;i<m;i++){Finish[i]=false;}for(i=0;i<m;i++){if(Finish[i]==true) {continue;}else{for(j=0;j<n;j++){if(Need[i][j]>Work[j]){break;}}if(j==n){Finish[i]=true;p[l++]=i;showsafe();for(k=0;k<n;k++){Work[k]+=Allocation[i][k]; }i=-1;}else{continue;}}if(l==m){printf("\n系统是安全的\n"); printf("\n安全序列:");for(i=0;i<l;i++){printf("%d",p[i]);if(i!=l-1){printf("-->");}}printf("\n");return true;}}printf("系统是不安全的\n");return false;}void showsafe(){int i,j;printf("\n进程号Work Need Allocation Work+Allocation finish\n"); for(i=0;i<m;i++){printf("\n%d ",p[i]);for(j=0;j<n;j++){printf("%d ",Work[j]);}printf(" ");for(j=0;j<n;j++){printf("%d ",Need[p[i]][j]);}printf(" ");for(j=0;j<n;j++){printf("%d ",Allocation[p[i]][j]);}printf(" ");for(j=0;j<n;j++){printf("%d ",Work[j]+Allocation[p[i]][j]); }printf(" ");printf("%d",Finish[p[i]]);}}。
操作系统银行家算法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*/。
银行家算法python实现代码
银行家算法python实现代码以下是银行家算法的Python实现代码:def banker_algorithm(available, max_resources, allocated_resources, need_resources):n_resources = len(available)n_processes = len(max_resources)safe_sequence = []work = available.copy()finish = [False] * n_processeswhile False in finish:is_safe = Falsefor i in range(n_processes):if not finish[i] and all(need_resources[i][j] <= work[j] for j in range(n_resources)):work = [work[j] + allocated_resources[i][j] for j in range(n_resources)]finish[i] = Trueis_safe = Truesafe_sequence.append(i)if not is_safe:return Nonereturn safe_sequence该函数的参数如下:- available: 一个列表,表示可用的各类资源数量- max_resources: 一个二维列表,max_resources[i][j]表示进程i请求第j类资源的最大数量- allocated_resources: 一个二维列表,allocated_resources[i][j]表示进程i 已分配第j类资源的数量- need_resources: 一个二维列表,need_resources[i][j]表示进程i还需要第j 类资源的数量返回值为一个列表,表示安全的执行顺序,如果不存在安全的执行顺序,则返回None。
操作系统银行家算法C语言实现源代码
for(l=0;l<n;l++)
{max[l]=(int*)malloc(m*sizeof(int));
request[l]=(int*)malloc(m*sizeof(int));
allocation[l]=(int*)malloc(m*sizeof(int));
printf("->P%d",success[i]);
return 1;}
else return 0;
manue();
}
}
k=check();
if(k==0)//不予分配,恢复
{printf("系统不安全,资源分配失败\n");
for(j=0;j<m;j++)
{available[j]=available[j]+request[i][j];
allocation[i][j]=allocation[i][j]-request[i][j];
{int i,j,k;
printf("按提示输入相应信息\n");
printf("输入提出资源请求的进程\n");
scanf("%d",&i);
printf("提出资源请求的进程是P%d\n",i);
for(j=0;j<m;j++)
{printf("需要资源R%d的数量为:",j);
scanf("%d",&request[i][j]);
银行家算法源代码
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;
操作系统实验---银行家算法代码
程序代码:#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为否。
C语言实现银行家算法
{
init(&pcount,&scount,Allocation,Need,Available); //调用初始化函数
print(pcount,scount,Allocation,Need,Available); //调用打印函数
int isreque = requs(scount,&number,Request,Allocation,Need,Available); //调用是否请求函数
for(j=0;j<s;j++)
{
scanf("%d",&Allocation[i][j]);
}
}
printf("Need\n");
for(i=0;i<p;i++)
{
printf("P%d:",i);
for(j=0;j<s;j++)
{
scanf("%d",&Need[i][j]);
}
}
printf("Available:");
C语言实现银行家算法(源码、运行结果)
一、源码
/*
银行家算法 10-22
*/
#include<stdio.h>
//函数声明
void init(int * pcount,int * scount,int Allocation[10][10],int Need[10][10],int Available[10]);
{
int p,s;
int i,j;
printf("进程数:");
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
import java.awt.*;import java.awt.event.*;import javax.swing.*;public class mybanker extends JFrame implements ActionListener{JTable table1;Object[][] data;JPanel p0,p1,p11,p12,p13,p14,p2,p3,p31,p32,p33,p34,p4;JLabel t1,t2,t3,t4,t5,t6,t7,t8,t9;//t10输出安全序列省去JButton b1,b2,b3,b6,b5;TextField text01,text02,text03,text5,text6;JTextField[] text1,text2,text3,text4;JTextArea text7;String s1,s2=new String();int M,N,i,j,count=0,flag=0;int[][] Max,Need,Allocation;int[] Available,Work,Request,Temp;public mybanker(){super("banker");p0=new JPanel();p1=new JPanel();p11=new JPanel();p12=new JPanel();p13=new JPanel();p14=new JPanel();p2=new JPanel();p3=new JPanel();p31=new JPanel();p32=new JPanel();p33=new JPanel();p34=new JPanel();p4=new JPanel();p0.setLayout(new GridLayout(4,1));p1.setLayout(new GridLayout(4,1));p3.setLayout(new GridLayout(4,1));p1.add(p11);p1.add(p12);p1.add(p13);p1.add(p14);p3.add(p31);p3.add(p32);p3.add(p33);p3.add(p34);p0.add(p1);p0.add(p2);p0.add(p3);p0.add(p4);t1=new JLabel("进程数");t2=new JLabel("资源数");t3=new JLabel("进程号");t4=new JLabel("已分配资资源:"); t5=new JLabel("资源最大需求:"); t6=new JLabel("可用资源:");t7=new JLabel("请求资源进程号"); t8=new JLabel("请求资源为");t9=new JLabel("安全检测");//t10=new JLabel("安全序列");b1=new JButton("确定");b2=new JButton("添加");b3=new JButton("确定");b5=new JButton("请求");b6=new JButton("安全检测");text1=new JTextField[6];text2=new JTextField[6];text3=new JTextField[6];text4=new JTextField[6];for(int i=0;i<6;i++){text1[i]=new JTextField(4);text2[i]=new JTextField(4);text3[i]=new JTextField(4);text4[i]=new JTextField(4);}text01=new TextField(4);text02=new TextField(4);text03=new TextField(4);text5=new TextField(4);text6=new TextField(50);String[] columnNames1= {"进程号", "资源最大需求","已分配的资源","需要的资源","可利用的资源"};data =new Object[100][5];table1 = new JTable (data, columnNames1);table1.setPreferredScrollableViewportSize(new Dimension(550, 100));table1.setRowHeight (20);table1.doLayout ();JScrollPane pane1 = new JScrollPane (table1);text7 = new JTextArea("",6,40);JScrollPane pane2 = new JScrollPane(text7);text7.setEditable(false);p11.add(t1);p11.add(text01);p11.add(t2);p11.add(text02);p11.add(b1);p12.add(t3);p12.add(text03);p12.add(b2);p13.add(t4);for(int i=0;i<6;i++)p13.add(text1[i]);p14.add(t5);for(int i=0;i<6;i++)p14.add(text2[i]);p2.add (pane1);p31.add(t6);for(int i=0;i<6;i++)p31.add(text3[i]);p31.add(b3);p32.add(t7);p32.add(text5);p32.add(t8);for(int i=0;i<6;i++)p32.add(text4[i]);p33.add(b6);p33.add(b5);p34.add(t9);p34.add(text6);//p4.add(t10);p4.add(pane2);b1.addActionListener(this);b2.addActionListener(this);b3.addActionListener(this);b5.addActionListener(this);b6.addActionListener(this);p0.setBackground (Color.lightGray);setContentPane (p0);this.setVisible(true);this.pack();//setSize(600,600);}public void diguisafe(int k,int n) //递归求解安全序列函数{int m,a;if(k==n){for(int j=0;j<N;j++)Work[j] = Available[j];if(safe()==1){for(a=0;a<M-1;a++)s1 += Temp[a]+"->";s1 +=Temp[a]+""+"\n";count++;for(int j=0;j<N;j++)Work[j] = Available[j];}}elsefor(int i=k;i<=n;i++) //n全排列{m=Temp[k];Temp[k]=Temp[i];Temp[i]=m;diguisafe(k+1,n);m=Temp[k];Temp[k]=Temp[i];Temp[i]=m;}}public int safe()//求是否安全序列{int i;for(i=0;i<M;i++){if(Small(Temp[i]-1)==1){CountWork(Temp[i]-1);continue;}else break;}if(i==M) return 1;else return 0;}public void CountWork(int i)//计算工作向量函数{for(int j=0;j<N;j++)Work[j] = Work[j]+Allocation[i][j];}public int Small(int i)//判断是否满足需求函数{int flag=0;for(int j=0;j<N;j++){if(Need[i][j]<=Work[j]) flag=1;else{flag=0;break;}}return flag;}public int Req_need()//判断是否满足需要资源函数{int flag=0;for(int i=0;i<N;i++){if(Need[j-1][i]>=Request[i]) flag=1;else{flag=0;break;}}return flag;}public int Req_ava()//判断是否满足可用资源函数{int flag=0;for(int i=0;i<N;i++){if(Available[i]>=Request[i]) flag=1;else{flag=0;break;}}return flag;}public void Changedata()//预分配函数{String s_available=new String();for(int i=0;i<N;i++){Available[i] = Available[i]-Request[i];Allocation[j-1][i] = Allocation[j-1][i]+Request[i];Need[j-1][i] = Need[j-1][i]-Request[i];s_available += Available[j]+" ";}data[0][4] = s_available;table1.repaint();text6.setText("");text7.setText("");}public void qingqiu()//资源请求函数{count=0;if(Req_need()==1&&Req_ava()==1) //不满足需求{Changedata(); //预分配}else{s2 ="不能分配";text6.setText(s2);}}public void actionPerformed(ActionEvent e){if(e.getSource()==b1){M = Integer.parseInt(text01.getText());N = Integer.parseInt(text02.getText());Max = new int[M][N];Allocation = new int[M][N];Need = new int[M][N];Available = new int[N];Request = new int[N];Work = new int[N];Temp = new int[M];}if(e.getSource()==b2){i = Integer.parseInt(text03.getText());int max,allocation;String s_max,s_need,s_allocation;s_max = new String();s_need = new String();s_allocation = new String();for(j=0;j<N;j++){allocation = Integer.parseInt(text1[j].getText());max = Integer.parseInt(text2[j].getText());Max[i-1][j] = max;Allocation[i-1][j] = allocation;Need[i-1][j] = Max[i-1][j]-Allocation[i-1][j];}Temp[i-1] = i;for(int j=0;j<N;j++){s_max += Max[i-1][j]+" ";s_allocation += Allocation[i-1][j]+" ";s_need += Need[i-1][j]+" ";}data[i-1][0] = ""+i;data[i-1][1] = s_max;data[i-1][2] = s_allocation;data[i-1][3] = s_need;table1.repaint();}if(e.getSource()==b3){int available;String s_available=new String();for(int j=0;j<N;j++){available = Integer.parseInt(text3[j].getText());Available[j] = available;s_available += Available[j]+" ";}data[0][4] = s_available;table1.repaint();}if(e.getSource()==b5){flag =1; //请求int request;text6.setText("");text7.setText("");j=Integer.parseInt(text5.getText());for(int i=0;i<N;i++){request = Integer.parseInt(text4[i].getText());Request[i] = request;}qingqiu();}if(e.getSource()==b6) //安全序列{s1=new String();count=0;diguisafe(0,M-1);if(count==0&&flag==0){s2 ="系统处于不安全状态,不能请求";}else if(count==0&&flag==1){s2 ="系统处于不安全状态,不能分配";}elses2="有"+count+"个安全序列,";text7.setText(s1);text6.setText(s2);flag =0;}/*if(e.getSource()==b4) //清空{count = 0;s1 ="";s2 ="";text6.setText(s1);text7.setText(s2);text01.setText("");text02.setText("");text03.setText("");text05.setText("");this.repaint();}*/}public static void main (String[] args){new mybanker();}}。