110 likes | 261 Views
操作系统实验二: 银行家算法实验. 银行家算法的数据结构 ◆ 可用资源向量 Available : 长度为 n 的数组表示系统中 n 类资源的当前可用数目。如果 Available[j]=k ,表示系统中现有 Rj 类资源为 k 个。 ◆ 最大需求矩阵 Max : m×n 矩阵定义 m 个进程对 n 类资源的最大需求量。如 Max[i,j]=k ,表示进程 Pi 运行期间最多需求 Rj 资源的数目为 k 个。
E N D
银行家算法的数据结构 ◆ 可用资源向量Available:长度为n的数组表示系统中n类资源的当前可用数目。如果Available[j]=k,表示系统中现有Rj类资源为k个。 ◆ 最大需求矩阵Max:m×n矩阵定义m个进程对n类资源的最大需求量。如Max[i,j]=k,表示进程Pi运行期间最多需求Rj资源的数目为k个。 ◆ 已分配资源矩阵Allocation:m×n矩阵定义了每个进程现在已分配到的各类资源的实际数目。如果Allocation [i,j]=k,表示进程Pi当前分到k个Rj类资源。 ◆ 需求矩阵Need:m×n矩阵表示每个进程还需要的各类资源的数目。如果Need [i, j]=k,表示进程Pi尚需k个Rj类资源才能完成其任务。很显然,Need[i,j]=Max[i,j] - Allocation[i,j],因而,这些数据结构的大小和值会随着时间而改变。 淮海工学院计算机科学系
银行家算法(资源分配算法) 设Requesti表示进程Pi的资源申请向量。如Requesti[j]= k,表示进程Pi动态申请k个Rj类资源。当进程Pi申请资源时,就执行下列动作(试探性分配): ① 若Requesti[j]>Need[i,j],产生出错条件,因为进程Pi对资源的请求量已超过其说明的最大数量;否则,转到步骤②。 ② 如果Requesti[j]>Available[j],则进程Pi必须等待,这是因为系统现在没有可用的资源;否则,转到步骤③。 ③ 如果系统可以给进程Pi分配所请求的资源,则应对有关数据结构进行修改: Available[j] = Available[j]-Requesti[j]; (j=1,2,……,n) Allocation[i,j] = Allocation[i,j]+ Requesti[j]; (i=1,2,……,m) Need[i,j] = Need[i,j] - Requesti[j]; ④ 系统执行安全性检查,查看此时系统状态是否安全。如果安全,就给进程Pi实际分配资源;否则,即系统是不安全的,则Pi等待,作废本次试探性分配,并且把资源分配状态恢复成③之前的情况。 淮海工学院计算机科学系
安全检查算法 • 设置两个向量:工作向量Work:表示系统可提供给进程继续运行所需要的各类资源数目,长度为n;进程完成标志向量Finish:长度为m,表示各个进程是否能够得到足够的资源并运行完成。两个向量初始化:Work=Available,Finish[i]=false (i=1,2,…m)。 • 从进程集合中搜寻满足下列条件的进程(找安全进程序列): Finish[i] ==false且Need[i,j]≤Work[j]。 如果找到这样的进程,执行③;否则,则转向步骤④。 • 修改数据值: Work[j]=Work[j] + Allocation[i,j](进程Pi释放所占的全部资源); Finish[i]=true; 返回步骤②; • 安全与不安全判定:如果所有进程的Finish[i] ==true都成立(找着安全序列),则系统处于安全状态;否则,系统处于不安全状态。 淮海工学院计算机科学系
银行家算法主要程序段 1、以书上用例初始化数据结构 #define M 5 #define N 3 int available[N]={3,3,2}; int max[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; int allocation[M][N]={{0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2}}; int need[M][N],p[M];
银行家算法主要程序段 1、以书上用例初始化数据结构 #define M 5 //总进程数 #define N 3 //总资源数 //M个进程对N类资源最大资源需求量 int MAX[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; //系统可用资源数 int AVAILABLE[N]={10,5,7}; //M个进程已经得到N类资源的资源量 int ALLOCATION[M][N]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}}; //M个进程还需要N类资源的资源量 int NEED[M][N]={{7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3}}; int Request[N]={0,0,0};
银行家算法主要程序段 2、现实资源分配情况 void displaydata() { int i,j; cout<<" 系统可用的资源数为:"<<endl<<endl; for (j=0;j<N;j++) cout<<" 资源"<<j<<": "<<AVAILABLE[j]; cout<<endl; cout<<" 各进程还需要的资源量:"<<endl<<endl; for (i=0;i<M;i++) { cout<<"进程"<<i<<":"; for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<NEED[i][j]; cout<<endl; } cout<<endl; cout<<" 各进程已经得到的资源量: "<<endl<<endl; for (i=0;i<M;i++) { cout<<"进程"<<i<<":"; for (j=0;j<N;j++)cout<<" 资源"<<j<<": "<<ALLOCATION[i][j]; cout<<endl; } };
银行家算法主要程序段 3、进程分配资源的数据更新 void changedata(int k) //为进程k分配请求的资源数量 { int j; for (j=0;j<N;j++) { AVAILABLE[j]=AVAILABLE[j]-Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j]; NEED[k][j]=NEED[k][j]-Request[j]; } };
银行家算法主要程序段 4、进程分配资源的数据更新 void restoredata(int k) //恢复已分配的数据为分配前状态{ int j; for (j=0;j<N;j++) { AVAILABLE[j]=AVAILABLE[j]+Request[j]; ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j]; NEED[k][j]=NEED[k][j]+Request[j]; } };
银行家算法主要程序段 5、安全检查过程中判断进程需求资源是否大于现有资源 int compare(int need[ ],int work[ ]) { int j; for(j=0;j<N;j++) { if(need[j]>work[j]) { return FALSE; } } return TRUE; }
6、安全检查程序段 int isSecurity(int available[],int need[][N],int allocation[][N]){ int i,j,k=0,flag,finish[M],work[N]; for(i=0;i<M;i++) { finish[i]=FALSE; } for(j=0;j<N;j++) { work[j]=available[j]; } while(TRUE) {//寻找安全进程序列 flag=FALSE; for(i=0;i<M;i++) { //每一趟循环将找到当前可分配资源的进程,并回收其已分配资源 if(finish[i]==FALSE&&compare(need[i],work)==TRUE) { for(j=0;j<N;j++) work[j]+=allocation[i][j]; finish[i]=TRUE; p[k++]=i; flag=TRUE; break; //结束FOR循环,表示WORK中资源满足某一进程的资源需求,并执行while}} if(flag==FALSE) { //只要有一个进程全部资源得到满足,则继续while(TRUE)循环for(i=0;i<M;i++) { if(finish[i]==FALSE) return FALSE; //遇到某一进程的finish[i]不成立,则不安全} return TRUE; //对所有进程检查后,finish[i]均为TRUE,则有安全序列}} //while(TRUE) }