1 / 11

操作系统实验二: 银行家算法实验

操作系统实验二: 银行家算法实验. 银行家算法的数据结构 ◆ 可用资源向量 Available : 长度为 n 的数组表示系统中 n 类资源的当前可用数目。如果 Available[j]=k ,表示系统中现有 Rj 类资源为 k 个。 ◆ 最大需求矩阵 Max : m×n 矩阵定义 m 个进程对 n 类资源的最大需求量。如 Max[i,j]=k ,表示进程 Pi 运行期间最多需求 Rj 资源的数目为 k 个。

Download Presentation

操作系统实验二: 银行家算法实验

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 操作系统实验二:银行家算法实验

  2. 银行家算法的数据结构 ◆ 可用资源向量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],因而,这些数据结构的大小和值会随着时间而改变。 淮海工学院计算机科学系

  3. 银行家算法(资源分配算法) 设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等待,作废本次试探性分配,并且把资源分配状态恢复成③之前的情况。 淮海工学院计算机科学系

  4. 安全检查算法 • 设置两个向量:工作向量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都成立(找着安全序列),则系统处于安全状态;否则,系统处于不安全状态。 淮海工学院计算机科学系

  5. 银行家算法主要程序段 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];

  6. 银行家算法主要程序段 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};

  7. 银行家算法主要程序段 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; } };

  8. 银行家算法主要程序段 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]; } };

  9. 银行家算法主要程序段 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]; } };

  10. 银行家算法主要程序段 5、安全检查过程中判断进程需求资源是否大于现有资源 int compare(int need[ ],int work[ ]) { int j; for(j=0;j<N;j++) {   if(need[j]>work[j]) {    return FALSE;   }  } return TRUE; }

  11. 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) }

More Related