这是大二时写的,现在重看操作系统于是附上代码,欢迎大家指出错误。有些东西觉得不应该这么写,但老师说英航家算法就是这样的,看来自己查查书。
Bank 算法
n个进程,m类资源
Available: w=(w1, w2,…………. wm)
需求D=(dij) n*m 每行记为
Di=(Di1, Di2,….. Dim), i=1,2,………n;
已分配A=(aij) n*m 每行记为
Ai=(Ai1,Ai2,…..Aim), i=1,2,………n;
某时刻Pi请求Req=(req1,req2,……..reqm)
1.判断Req<=Di
2.判断Req<=Available,若不能满足则Pi阻塞
3.试探性分配
Available-=Req;
Ai+=req;
Di-=req;
4.判断新状态的安全性
若新状态是安全的,则分配资源,
否则Pi阻塞,取消试探性分配。
开销:(2n+5)*m
安全状态判别:
1. Work=Available
Finish=(F,F,……..F)n;
2.查找满足下列条件的进程Pi:
Finish[i]=False 且 Di<=Work
3若没有找到进程则转4。
否则
Finish[i]=True
Work+=Ai;
Goto 2.
4.若全部进程完成,则系统是安全的;
否则 系统不安全。
死锁检测算法:
1. Work=Available
Finish=(F,F,……..F);
2.查找满足下列条件的进程Pi:
Finish[i]=False 且 Di<=Work
3若没有找到进程则转4。
否则
Finish[i]=True
Work+=Ai;
Goto 2.
4.若全部进程完成,则系统是安全的;
否则 系统不安全。-------认为死锁已产生。
Dead={Pi | Finish[i]=False}
测试数据:m=3:种类型的资源(A,B,C,) 进程个数n=5
Available=(2,3,3);
|
已分配资源数量 |
资源需求量 |
A B C |
A B C |
|
P1 |
2 1 2 |
3 4 7 |
P2 |
4 0 2 |
1 3 4 |
P3 |
3 0 5 |
0 0 3 |
P4 |
2 0 4 |
2 2 1 |
P5 |
3 1 4 |
1 1 0 |
请求序列如下:
a: 进程P2请求资源(0,3,4)
b 进程P4请求资源(1,0,1)
c. 进程P1请求资源(2,0,1)
d. 进程P3请求资源(0,0,2)
主要用了搜索。
#include<iostream> #include<cstdio> using namespace std; #define MAX 20 int N,M; int Available[MAX],Alloc[MAX][MAX],Need[MAX][MAX]; int route[MAX]; int Request[MAX]; int num; int work[MAX]; bool Finish[MAX]; void Init() //初始化,建立当前进程和各种资源所处的状态 { int i,j; printf("请输入%d种资源当前的可利用量:\n",M); for(i=0;i<M;i++) { printf("第%d种资源:",i+1); scanf("%d",&Available[i]); } printf("请输入%d个进程当前的状态信息:\n",N); for(i=0;i<N;i++) { printf("请输入第%d个进程的已分配资源数量:\n",i+1); for(j=0;j<M;j++) { printf("第%d种资源:",j+1); scanf("%d",&Alloc[i][j]); } printf("请输入第%d个进程再需申请资源个数:\n",i+1); for(j=0;j<M;j++) { printf("第%d种资源:",j+1); scanf("%d",&Need[i][j]); } } } bool dfs(int start) //运用深搜实现安全状态判别算法 { bool flag; int i,j; for(j=0;j<M;j++) { if(!(Need[start][j]<=work[j])) return false; } Finish[start]=true; for(j=0;j<M;j++) { work[j]=work[j]+Alloc[start][j]; } for(i=0;i<N;i++) { if(!Finish[i]) { for(j=0;j<M;j++) { if(!(Need[start][j]<=work[j])) break; } if(j>=M) flag=dfs(i); Finish[i]=false; for(j=0;j<M;j++) { work[j]=work[j]-Alloc[i][j]; } if(flag) return true; } } } bool Is_safe(int start) //银行家算法的实现 { int i,j; for(i=0;i<N;i++) { Finish[i]=false; for(j=0;j<M;j++) { work[j]=Available[j]; } if(dfs(i)) return true; } return false; } int Input() //输入进程请求序列 { int j,rank; cout<<"请输入进程类型:"<<endl; cin>>rank; printf("请输入%d个需分配资源数量:\n",num); for(j=0;j<M;j++) { printf("第%d个:",j); scanf("%d",&Request[j]); } return rank; } int main() { int j,i; bool flag; int k=0; freopen("测试数据4.txt","r",stdin); cout<<"请输入资源类型数量:"<<endl; cin>>M; cout<<"请输入进程类型数量:"<<endl; cin>>N; Init(); cout<<"请输入需判断的进程数:"<<endl; cin>>num; int process_num=0; while(1) { int rank=Input(); flag=true; process_num++; for(j=0;j<M;j++) { if(!(Request[j]<=Need[rank][j])) { cout<<"非法请求!"<<endl; flag=false; break; } if(!(Request[j]<=Available[j])) { cout<<"该进程被阻塞"<<endl; flag=false; break; } } if(!flag) continue; //进行试探性分配 for(j=0;j<M;j++) { Available[j]=Available[j]-Request[j]; Alloc[rank][j]=Alloc[rank][j]+Request[j]; Need[rank][j]=Need[rank][j]-Request[j]; } if(Is_safe(rank)) { route[k++]=rank; printf("进程%d被执行\n",rank); } for(j=0;j<M;j++) { Available[j]=Available[j]+Request[j]; Alloc[rank][j]=Alloc[rank][j]-Request[j]; Need[rank][j]=Need[rank][j]+Request[j]; } if(process_num==num) { cout<<"全部进程处理完毕!"<<endl; printf("以下是%d个进程的合法执行序列:\n",k); for(j=0;j<k-1;j++) cout<<route[j]+1<<"->"; cout<<route[j]+1<<endl; break; } } return 0; }