(1)利用银行家算法设计系统,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。
(2)设计用银行家算法和随机分配算法,实现资源分配的两个资源分配程序,应具有显示或打印各进程依次要求申请的资源数以及依次分配资源的情况。
(3)确定一组各进程依次申请资源数的序列,在相同的情况下分别运行上述两种资源分配程序,观察运行结果。
#include <iostream> #include <time.h> #include <vector> #include <windows.h> using namespace std; int r[3]={3,3,2};//系统拥有的资源 int r0=0,r1=0,r2=0;//记录申请资源 class pcb { public: int id; bool state; int max[3]; int alc[3]; int need[3]; pcb() { } void init() { state=false; cout<<"请输入进程的id,各个资源总需求量和已占用资源"<<endl; cin>>id; cout<<"a,b,c三种资源的最大使用量"<<endl; cin>>max[0]>>max[1]>>max[2]; cout<<"a,b,c三种资源的已占有量"<<endl; cin>>alc[0]>>alc[1]>>alc[2]; } int rd(int n) { return rand()%(n+1); } int request() { // Sleep(1000); r0=rd(max[0]-alc[0]); r1=rd(max[1]-alc[1]); r2=rd(max[2]-alc[2]); cout<<"进程"<<id<<"申请资源a"<<" "<<r0<<" 申请资源b"<<" "<<r1<<" 申请资源c"<<" "<<r2<<endl; if(r0>r[0]||r1>r[1]||r2>r[2]) { cout<<"没有那么多资源!!!"<<endl; return 0; } if((r0==(max[0]-alc[0]))&&r1==(max[1]-alc[1])&&r2==(max[2]-alc[2])) { r[0]=r[0]+alc[0]; r[1]=r[1]+alc[1]; r[2]=r[2]+alc[2]; return 1; } return 2; } }; bool safe(vector <pcb> temp,int i) { int u=r[0]-r0,k=r[1]-r1,l=r[2]-r2; for(int j=i;j<temp.size()-1;j++) temp[j]=temp[j+1]; temp.pop_back(); int size=temp.size();//记录下容器内还有多少个进程 // int range[size];//记录下队列 int x=0;//计数器 while(!temp.empty()) { static int j=0; if((temp[j].max[0]-temp[j].alc[0])<=u&&(temp[j].max[1]-temp[j].alc[1])<=k&& (temp[j].max[2]-temp[j].alc[2])<=l)//判断是否能运行完 { cout<<"运行"<<temp[j].id<<endl; u=u+temp[j].alc[0]; k=k+temp[j].alc[1]; l=l+temp[j].alc[2]; for(int e=j;e<temp.size()-1;e++) temp[e]=temp[e+1]; temp.pop_back(); if(j>=temp.size()) j=0; } else { j++; if(j>=temp.size()) j=0; } x++; if(x==(size*size)) { cout<<"没有安全队列,以上情况不成立"<<endl; cout<<endl; return false; } } return true; } int main() { srand(time(0)); pcb p[5]; vector <pcb> vp; for(int i=0;i<5;i++) { p[i].init(); vp.push_back(p[i]); } int x=0;//计算器 int c; cout<<"请选择分配资源方法:1.银行家算法 2.随机算法"<<endl; cin>>c; switch(c) { case 1: while(!vp.empty()) { int a; static int i=0; if((a=vp[i].request())!=0) { if(a==1) { cout<<"进程"<<vp[i].id<<"已经结束"<<endl; for(int j=i;j<vp.size()-1;j++) { vp[j]=vp[j+1]; } vp.pop_back(); if(i>=vp.size()) i=0; cout<<"a资源还剩"<<r[0]<<" b资源还剩"<<r[1]<<" c资源还剩"<<r[2]<<endl; cout<<endl; } else { if(safe(vp,i)) { cout<<"存在安全队列"<<endl; cout<<endl; vp[i].alc[0]=vp[i].alc[0]+r0; vp[i].alc[1]=vp[i].alc[1]+r1; vp[i].alc[2]=vp[i].alc[2]+r2; r[0]=r[0]-r0; r[1]=r[1]-r1; r[2]=r[2]-r2; cout<<"a资源还剩"<<r[0]<<" b资源还剩"<<r[1]<<" c资源还剩"<<r[2]<<endl; cout<<endl; } i++; if(i>=vp.size()) i=0; } } else i++; if(i>=vp.size()) i=0; x++; if(x>=200) { cout<<"初始化的表不安全"<<endl; return 0; } } cout<<"进程已经全部结束"<<endl; break; case 2: while(!vp.empty()) { int a2; static int i2=0; if((a2=vp[i2].request())!=0) { if(a2==1) { cout<<"进程"<<vp[i2].id<<"已经结束"<<endl; for(int j=i2;j<vp.size()-1;j++) { vp[j]=vp[j+1]; } vp.pop_back(); if(i2>=vp.size()) i2=0; cout<<"a资源还剩"<<r[0]<<" b资源还剩"<<r[1]<<" c资源还剩"<<r[2]<<endl; cout<<endl; } else { vp[i2].alc[0]=vp[i2].alc[0]+r0; vp[i2].alc[1]=vp[i2].alc[1]+r1; vp[i2].alc[2]=vp[i2].alc[2]+r2; r[0]=r[0]-r0; r[1]=r[1]-r1; r[2]=r[2]-r2; cout<<"a资源还剩"<<r[0]<<" b资源还剩"<<r[1]<<" c资源还剩"<<r[2]<<endl; cout<<endl; i2++; if(i2>=vp.size()) i2=0; } } else i2++; if(i2>=vp.size()) i2=0; x++; if(x>=200) { cout<<"产生死锁"<<endl; return 0; } } cout<<"进程已经全部结束"<<endl; break; default: cout<<"选择错误"<<endl; break; } return 1; }
运行时显示过长,估计理解起来比较费劲,请谨慎参考。