《能运行的银行家算法》由会员分享,可在线阅读,更多相关《能运行的银行家算法(5页珍藏版)》请在金锄头文库上搜索。
1、#includestdio.h#define FALSE 0#define TRUE 1#define W 10#define R 20int M ; /*总进程数*/int N ; /*资源种类*/int ALL_RESOURCEW;/*各种资源的数目总和*/int MAXWR; /*M个进程对N类资源最大资源需求量*/int AVAILABLER; /*系统可用资源数*/int ALLOCATIONWR; /*M个进程已经得到N类资源的资源量*/int NEEDWR; /*M个进程还需要N类资源的资源量*/int REQUESTR; /*请求资源个数*/*函数名:output*功能:输出资
2、源分配情况*/void output()int i,j;printf(All Resource:n);for(j = 0 ; j N ;j+)printf(R%d:%dn, j , ALL_RESOURCEj);printf(Resource Available:n);for(j = 0 ; j N ; j+)printf(R%d:%dn, j , AVAILABLEj);printf(Process Resource Needed:n);printf(| PID |);for(j = 0 ; j N ; j+)printf( R%d |, j);printf(n);for(i = 0 ; i
3、 M ; i+)for(i = 0 ; i M ; i+)printf(|%-5d|, i);for(j = 0 ; j N ; j+)printf(%-4d|, NEEDij);printf(n);printf(Process Resource Allocated:n);printf(| PID |);for(j = 0 ; j N ; j+)printf( R%d |, j);printf(n);for(i = 0 ; i M ; i+) printf(|%-5d|, i);for(j = 0 ; j N ; j+)printf(%-4d|, ALLOCATIONij); printf(n
4、);/*output*/*函数名 :modify*功能:改变可用资源和已经拿到资源和还需要的资源的值*参数:int k 修改编号为K的P的数据*/void modify(int k)int j;for(j = 0 ; j N ; j+)/*修改数据*/ AVAILABLEj = AVAILABLEj - REQUESTj;/*修改可用资源*/ ALLOCATIONkj = ALLOCATIONkj + REQUESTj;/*修改分配资源*/ NEEDkj = NEEDkj - REQUESTj;/*修改资源需求*/*函数名:undo*功能:还原可用资源和已经拿到资源和还需要的资源的值*参数:参
5、数:int k 修改编号为K的P的数据*/void undo(int k)int j;for(j = 0 ; j N ; j+)/*修改数据*/ AVAILABLEj = AVAILABLEj + REQUESTj; /*修改可用数据*/ ALLOCATIONkj = ALLOCATIONkj - REQUESTj; /*修改分配的资源*/ NEEDkj = NEEDkj + REQUESTj;/*修改资源需求*/ /*函数名:chkerr*功能:检查修改操作是否安全*/int chkerr(int s)int WORK , FINISHW;int i , j;for(i = 0 ; i M
6、; i+)/*清空FINISH*/FINISHi = FALSE;for(j = 0 ; j N ; j+)/*逐一检查*/WORK = AVAILABLEj;i = s;doif(FINISHi = FALSE & NEEDij = WORK)/*符合条件?*/WORK = WORK + ALLOCATIONij;FINISHi = TRUE;i = 0;elsei+;while(iM);for(i = 0 ; i M ; i+)/*只要一个不满足,不安全*/if(FINISHi = FALSE)printf(Error : UnSafe Allocation!n);return 1; pr
7、intf(OK : Allocation OKn);return 0;/*函数名:bank*功能 :银行家算法的实现*/void bank()int i , j;int flag = TRUE;printf(Use Ctrl+C break.n);while(TRUE)i = -1;while(i = M)printf(Input Process to Allocat PID=); scanf(%d, &i); if(i = M)printf(Error: Invalid Input!n);printf(Input Resource Needn); for (j = 0 ; j NEEDij)
8、/*请求的资源数大于请求资源*/printf(Error: Invalid Input!n);flag = FALSE;elseif(REQUESTjAVAILABLEj)/*若请求的资源数大于可用资源数*/printf(Error: Invalid Input!n);flag = FALSE;/*else*/ /*for*/ if(flag) modify(i); /*修改资源数*/if(chkerr(i)/*安全?*/undo(i); /*恢复资源数*/output();/*输出*/elseoutput(); /*输出*/ elseoutput();/*while*/*bank*/*主函数
9、*/int main()int i , j , p;printf(Input Process Numbers M=);/*进程数量*/scanf(%d, &M);printf(Input Resource Category N=);/*资源种类*/scanf(%d, &N);printf(Input Number of All Resource each Category:n);/*资源数目*/for(i = 0 ; i N ; i+)scanf(%d, &ALL_RESOURCEi);printf(Input Max Resource Process Need:n);/*最大资源需求*/fo
10、r (i = 0 ; i M ; i+)for (j = 0 ; j ALL_RESOURCEj)/*大于最大可用?*/printf(nError: Invalid Input!n); while (MAXij ALL_RESOURCEj); /*for*/printf(Input Resource Process Allocated:n);for (i = 0 ; i M ; i+)for (j = 0 ; j MAXij)/*大于最大需求?*/printf(nError: Invalid Input!n);while (ALLOCATIONij MAXij); /*for*/for(j =
11、 0 ; j N ; j+)p = ALL_RESOURCEj;for(i = 0 ; i M ; i+)p -= ALLOCATIONij;/*减去已经分配资源*/AVAILABLEj = p;if(AVAILABLEj0)AVAILABLEj = 0;/*清理数据*/*for*/ /*for*/for (i = 0 ; i M ; i+)for(j = 0 ; j N ; j+)NEEDij = MAXij - ALLOCATIONij;/*求还需要的资源*/output();bank();/*银行家算法*/return 0;/*main*/电视墙也就是电视背景装饰墙,是居室装饰特别是大户型居室的重点之一,在装修中占据相当重要的地位,电视墙通常是为了弥补客厅中电视机背景墙面的空旷,同时起到修饰客厅的作用。因为电视墙是家人目光注视最多的地方,长年累月地看也会让人厌烦,所以其装修就尤为讲究