闲言少叙,直接上代码
#include <bits/stdc++.h>
using namespace std;
const int maxn=1001;
int Max[maxn][maxn],Allocation[maxn][maxn],Need[maxn][maxn];
int Available[maxn],Work[maxn],Request[maxn],process;
bool Finish[maxn];
int n,m;
vector<int> safeList;
void init(){//初始化函数
printf("输入进程数n与资源种数m:");
scanf("%d%d",&n,&m);//(1)初始化进程数与资源种数
printf("输入最大需求矩阵Max[n][m]:");
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&Max[i][j]);//(2)初始化最大需求矩阵
}
}
printf("输入分配矩阵Allocation[n][m]:");
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&Allocation[i][j]);//(3)初始化分配矩阵
Need[i][j]=Max[i][j]-Allocation[i][j];//(4)初始化Need矩阵
}
}
printf("输入可用资源数组Available[m]:");
for(int i=0;i<m;i++){
scanf("%d",&Available[i]);//(5)初始化可用资源数组
}
printf("输入申请资源的进程process:");
scanf("%d",&process);//(7)初始化申请资源的进程
printf("输入申请资源数组Request[m]:");
for(int i=0;i<m;i++){
scanf("%d",&Request[i]);//(8)初始化申请资源数组
}
}
bool isSmaller(int pro){//比较向量大小
for(int i=0;i<m;i++){
if(Work[i]<Need[pro][i])
return false;
}
return true;
}
bool isSafe(){//安全性算法(核心算法)
memcpy(Work,Available,sizeof(Available));
memset(Finish,false,sizeof(Finish));
while(1){
bool flag=false;
for(int i=0;i<n;i++){
if(Finish[i]==false&&isSmaller(i)){
flag=true;
for(int j=0;j<m;j++){
Work[j]+=Allocation[i][j];
}
Finish[i]=true;
safeList.push_back(i);
break;
}
}
if(flag==false){
for(int i=0;i<m;i++){
if(Finish[i]==false){
printf("不安全状态\n");
return false;
}
}
printf("安全状态\n");
printf("其中一个安全序列为:");
for(auto i:safeList)
printf("%d ",i);
return true;
}
}
}
bool banker(){//银行家算法
for(int j=0;j<m;j++){//(1)如果Request[j]<=Need[process][j]便转向(2),否则认为出错
if(Request[j]>Need[process][j])
return false;
}
for(int j=0;j<m;j++){//(2)如果Request[j]<=Available[process][j]便转向(3),否则表示尚无足够资源,进程process必须等待
if(Request[j]>Available[j])
return false;
}
//(3)系统试探着把资源分配给进程process,并修改相应的数据
int copy_available[maxn];
int copy_allocation[maxn],copy_need[maxn];
for(int j=0;j<m;j++){
copy_available[j]=Available[j];//备份可用资源数组
copy_allocation[j]=Allocation[process][j];//备份process进程的已分配资源数组
copy_need[j]=Need[process][j];//备份process进程的need数组
Available[j]-=Request[j];//更新可用资源数组
Allocation[process][j]+=Request[j];
Need[process][j]-=Request[j];
}
if(isSafe()) return true;
else{
for(int j=0;j<m;j++){
Available[j]=copy_available[j];//恢复可用资源数组
Allocation[process][j]=copy_allocation[j];//恢复process进程的已分配资源数组
Need[process][j]=copy_need[j];//恢复process进程的need数组
}
return false;
}
}
int main()
{
init();
if(banker());
else printf("不可以实施资源分配");
return 0;
}
给个例子
输入:
5 3
5 5 9 5 3 6 4 0 11 4 0 5 5 4 2
2 1 2 4 0 2 4 0 5 2 0 4 3 1 4
2 3 3
3
2 0 1
代码运行示例:
注:安全序列不唯一