T0時刻系統狀態表:
最大資源需求量
已分配資源數量
A B C
A B C
P1
5 5 9
2 1 2
P2
5 3 6
4 0 2
P3
4 0 11
4 0 5
P4
4 2 5
2 0 4
P5
4 2 4
3 1 4
資源總量:A 17 B 5 C 20
安全性檢測的原則是:
1 進程申請資源可分布申請,但總量不應超過其最大需求量
2 每次申請的資源量必須小於系統可供使用的資源量
3 分配完成後,系統是安全的,即仍存在一個序列,可以運行完當前所有進程,這是關鍵
筆者寫了一個程序可以完整演示整個測試流程,看一下運行結果即可理解銀行家算法,代碼在vc6下測試完美通過。
附上完整代碼與注釋:
[cpp]
#include<iostream>
using namespace std;
#define M 5//進程數
#define N 3//資源數
int R[N]={17,5,20};//資源總數
int Maxall[N]={0};//被占用的資源數
int V[N]={0};//可用資源總數
int Max[M][N]={{5,5,9},{5,3,6},{4,0,11},{4,2,5},{4,2,4}};//各進程最大需求量
int Alloc[M][N]={{2,1,2},{4,0,2},{4,0,5},{2,0,4},{3,1,4}};//各進程已經分配的資源量
int Need[M][N]={0};//各進程還需要的資源量
int Appli[M][N]={0};//一次為某個進程申請的資源量
int i,j,n;//程序中用
int main()
{
void init();
void show();
int applicate(int,int,int,int);
void update(int,int,int,int);
void release(int,int,int,int);
int safecheck();
init();
show();
safecheck();//這裡安排顯示了按安全序列執行完畢前後的系統狀態
show();
return 0;
}
void init()//初始化狀態
{
/* cout<<"請依次輸入各進程對資源最大需求量:"<<endl;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
cout<<i<<"進程"<<j<<"資源:"<<endl;
cin>>Max[i][j];
}
cout<<"請依次輸入各進程已分配資源:"<<endl;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
{
cout<<i<<"進程"<<j<<"資源:"<<endl;
cin>>Alloc[i][j];
}
cout<<"請依次輸入各資源總數:"<<endl;
for(j=0;j<N;j++)
{
cout<<j<<"資源:"<<endl;
cin>>R[j];
}
*/
//本可以自行輸入的,此處為避免大量輸入,在程序中初始化
for(i=0;i<M;i++)
for(j=0;j<N;j++)
Need[i][j]=Max[i][j]-Alloc[i][j];
for(j=0;j<N;j++)
for(i=0;i<M;i++)
Maxall[j]+=Alloc[i][j];
for(j=0;j<N;j++)
V[j]=R[j]-Maxall[j];
}
void show()//顯示系統狀態
{
cout<<"Max:"<<endl;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
cout<<Max[i][j]<<" ";
cout<<endl;
}
cout<<endl;
cout<<"Alloc:"<<endl;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
cout<<Alloc[i][j]<<" ";
cout<<endl;
}
cout<<endl;
cout<<"Need:"<<endl;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
cout<<Need[i][j]<<" ";
cout<<endl;
}
cout<<endl;
cout<<"系統總資源:"<<endl;
for(n=0;n<N;n++)
cout<<R[n]<<" ";
cout<<endl;
cout<<"系統剩下的資源"<<endl;
for(j=0;j<N;j++)
{
cout<<V[j]<<" ";
}
cout<<endl;
}
int applicate(int i,int r1,int r2,int r3)//資源申請
{
Appli[i][0]=r1;
Appli[i][1]=r2;
Appli[i][2]=r3;
if((Appli[i][0]<=Need[i][0] && Appli[i][1]<=Need[i][1] && Appli[i][2]<=Need[i][2]) && (Appli[i][0]<=V[0] && Appli[i][1]<=V[1] && Appli[i][2]<=V[2]))
{
// cout<<"申請成功,但還未進行安全性檢測..."<<endl;
return 1;
}
else
{
// cout<<"申請失敗..."<<endl;
return 0;
}
}
void update(int i,int r1,int r2,int r3)//分配資源,注意保證數據的一致性
{
Alloc[i][0]+=r1; Alloc[i][1]+=r2; Alloc[i][2]+=r3;
Need[i][0]-=r1; Need[i][1]-=r2; Need[i][2]-=r3;
V[0]-=r1; V[1]-=r2; V[2]-=r3;
}
void release(int i,int r1,int r2,int r3)//釋放資源,注意保證數據的一致性
{
Alloc[i][0]-=r1; Alloc[i][1]-=r2; Alloc[i][2]-=r3;
Need[i][0]+=r1; Need[i][1]+=r2; Need[i][2]+=r3;
V[0]+=r1; V[1]+=r2; V[2]+=r3;
}
int safecheck()//檢測安全性,反復M次尋找一個可執行的進程,執行完後釋放資源,再往復下一步
{
int count=0;
cout<<endl<<endl;
cout<<"開始安全性測試:(此測試將改動數據,即執行完整個進程,正式的檢測應有備份數據,此處只演示檢測過程,為節省篇幅省略)"<<endl;
while(count<5)
{
for(int m=0;m<M;m++)
{
if(applicate(m,Need[m][0],Need[m][1],Need[m][2]) )
{
if(((Alloc[m][0]==0)&&(Alloc[m][1]==0)&&(Alloc[m][2]==0)))
continue;
update(m,Need[m][0],Need[m][1],Need[m][2]);
release(m,Alloc[m][0],Alloc[m][1],Alloc[m][2]);
cout<<"進程"<<m<<"順利結束"<<endl;
count++;
show();//這樣你可以觀察到每一個細致的變化
break;
}
}
}
cout<<"至此隊列執行結束!"<<endl<<endl<<endl;
return 1;
}
作者:goodcat12