完整源代码:http://yuncode.net/code/c_50797f9ec7ad094
算法:
1.试分配
2.安全性测试
3.如果找到一个安全序列,过安全检测,分配完成; 否则不能过安全检测,系统已恢复试分配前状态
- #include<iostream>
- using namespace std;
- int avaResour[3]={3,3,2};
- int allocation[5][3]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}};
- int maxRequest[5][3]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}};
- int nneed[5][3]={{7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1}};
- void rrequest();
- bool safeTest();
- int main()
- {
- rrequest();
- return 0;
- }
- void rrequest()
- {
- int sqjc=0,i=0,l=0,a=0,b=0,c=0;
- char contn=0;
- cout<<endl<<"进程个数:5 资源个数:3"<<endl<<"可用资源向量Available:"<<endl;
- for(i=0;i<3;i++)
- cout<<avaResour[i]<<" ";
- cout<<endl<<"最大需求矩阵Max:"<<endl;
- for(i=0;i<5;i++)
- {
- for(l=0;l<3;l++)
- cout<<maxRequest[i][l]<<" ";
- cout<<endl;
- }
- cout<<"已分配矩阵Allocation:"<<endl;
- for(i=0;i<5;i++)
- {
- for(l=0;l<3;l++)
- cout<<allocation[i][l]<<" ";
- cout<<endl;
- }
- cout<<"需求矩阵Need:"<<endl;
- for(i=0;i<5;i++)
- {
- for(l=0;l<3;l++)
- cout<<nneed[i][l]<<" ";
- cout<<endl;
- }
- cout<<"输入发起请求的进程(0-4): ";
- cin>>sqjc;
- while(sqjc>4||sqjc<0)
- {
- cout<<endl<<"不要乱输! ^_^"<<endl;
- cout<<endl<<"输入发起请求的进程(0-4): ";
- cin>>sqjc;
- }
- cout<<"输入请求资源的数目,按照这样的格式输入 x x x: ";
- cin>>a>>b>>c;
- if(a<=nneed[sqjc][0] && b<=nneed[sqjc][1] && c<=nneed[sqjc][2])
- {
- cout<<endl<<"开始执行银行家算法..."<<endl;
- if(a<=avaResour[0] && b<=avaResour[1] && c<=avaResour[2])
- {
- avaResour[0]=avaResour[0]-a; avaResour[1]=avaResour[1]-b;
- avaResour[2]=avaResour[2]-c;
- allocation[sqjc][0]=allocation[sqjc][0]+a;
- allocation[sqjc][1]=allocation[sqjc][1]+b;
- allocation[sqjc][2]=allocation[sqjc][2]+c;
- nneed[sqjc][0]=nneed[sqjc][0]-a;
- nneed[sqjc][1]=nneed[sqjc][1]-b;
- nneed[sqjc][2]=nneed[sqjc][2]-c;
- cout<<endl<<"试分配完成..."<<endl;
- if(safeTest())
- {
- cout<<endl<<"开始给第"<<sqjc<<"个进程分配资源..."<<endl
- <<"分配完成,已更新Allocation_list.txt"<<endl;
- for(i=0;i<5;i++)
- if(nneed[i][0]==0 && nneed[i][1]==0 && nneed[i][2]==0)
- for(l=0;l<3;l++)
- {
- avaResour[l]=avaResour[l]+allocation[i][l];
- allocation[i][l]=0;
- }
- }
- else
- {
- cout<<endl<<"系统已恢复试分配前状态。"<<endl;
- avaResour[0]=avaResour[0]+a; avaResour[1]=avaResour[1]+b;
- avaResour[2]=avaResour[2]+c;
- allocation[sqjc][0]=allocation[sqjc][0]-a;
- allocation[sqjc][1]=allocation[sqjc][1]-b;
- allocation[sqjc][2]=allocation[sqjc][2]-c;
- nneed[sqjc][0]=nneed[sqjc][0]+a;
- nneed[sqjc][1]=nneed[sqjc][1]+b;
- nneed[sqjc][2]=nneed[sqjc][2]+c;
- }
- }
- else
- cout<<endl<<"试分配失败,系统无足够资源"<<endl;
- }
- else
- cout<<endl<<"Error!申请的资源大于需求值"<<endl;
- xz:
- cout<<"\n\n"<<"要继续吗?(y-继续;n-终止):";
- cin>>contn;
- switch(contn)
- {
- case 'y':rrequest();
- case 'n':break;
- default:cout<<"亲,不要乱输哦"<<endl;
- goto xz;break;
- }
- }
- bool safeTest()
- {
- int s=0,m=0,z=0,r[5]={0},y=0,wwork[3]={0};
- bool ffinish[5]={0};
- cout<<endl<<"进入安全性测试!"<<endl;
- for(s=0;s<3;s++)
- wwork[s]=avaResour[s];
- for(z=0;z<5;z++)
- {
- for(s=0;s<5;s++)
- if(ffinish[s]==0 && nneed[s][0]<=wwork[0] && nneed[s][1]<=wwork[1]
- && nneed[s][2]<=wwork[2])
- {
- for(m=0;m<3;m++)
- wwork[m]=wwork[m]+allocation[s][m];
- ffinish[s]=1;
- r[y]=s;
- y++;
- }
- }
- if(y==5)
- {
- cout<<endl<<"找到一个安全序列:";
- for(s=0;s<2;s++)
- cout<<"P"<<r[2*s]<<"--->"<<"P"<<r[2*s+1]<<"--->";
- cout<<"P"<<r[4]<<endl<<"已通过安全检测!"<<endl;
- return 1;
- }
- cout<<endl<<"没有找到安全序列!"<<endl<<"安全测试失败。"<<endl;
- return 0;
- }