Need 进程i所需要的各个资源的数目
available 当前cpu上可以使用的各个资源的数目
allocation 当前的各个进程的获得的资源的数目
finish 数组用来判断某一个进程是否完成
store 数组用来存放进程执行的过程
Continue函数: 用来比较判断系统当前可用的进程是否足够完成执行某个进程,如果当前系统可用的资源数目小于该进程所需要的资源,返回false否则返回true
add函数:当完成某个进程的时候,释放他所占用的资源,这样系统可使用资源增加,增加的部分来源于,之前占用的加上后来任然需要的部分。
sub函数:当我们判断当前的系统可用资源能够满足该进程执行所需要的条件的时候,而且这个进程没有被执行完成,我们执行这个进程之后,那么系统的可用资源将减少,该函数就是用来计算在执行某一个进程之后当前系统的可用资源的数目
dfs函数:用来进行模拟进程的执行,首先是if判断,step代表执即将开始执行第几个进程,当前的需要执行的进程设定的值为4,当完成四个进程的执行,再次进行程序的执行的时候来到第五个进程,但是第五个进程不存在,所以输出执行的顺序。store里存放的是进程的执行的顺序。如果不到第五个进程,则进入else,然后从第一个进程执行判断,判断它是否执行完成,以及当前的系统的资源是否符合该进程执行所需要的资源即Continue程序,如果满足,那么我们就标记该进程完成执行,并且记录下这个进程的号码到store中,并且再一次的dfs来寻找之后的可以满足的运行的进程,依次这样,递归查找。
退出一层递归,假定该进程未完成继续寻找
#include
#include
int Need[5][6]={{0,0,1,2},{1,7,5,0},{2,3,5,6},{0,6,5,2},{0,6,5,6}};
int Available[6]={1,6,2,2};
int Allocation[5][5]={{0,0,3,2},{1,0,0,0},{1,3,5,4},{0,3,3,2},{0,0,1,4}};
bool Finish[6]={false,false,false,false,false,false};
int store[7];
bool Continue(int [],int []);
void dfs(int);
void add(int [],int [],int []);
void sub(int [],int[],int []);
int main(){
printf("-------程序启动------\n");
dfs(0);
}
bool Continue(int Avai[6],int Ne[6]){
for(int i=0;i<4;i++){
if(Avai[i]return false;
}
return true;
}
void add(int Avai[6],int Ne[6],int Allo[6]){
for(int i=0;i<4;i++){
Avai[i]=Ne[i]+Avai[i]+Allo[i];
}
}
void sub(int Avai[6],int Ne[6],int Allo[6]){
for(int i=0;i<4;i++){
Avai[i]=Avai[i]-Ne[i]-Allo[i];
}
}
void dfs(int step){
if(step==5){
printf("sucess\n");
for(int i=0;i<5;i++){
printf("the process is %d\n",store[i]+1);
}
printf("\n");
}
else{
for(int i=0;i<5;i++){
if(Finish[i]!=true&&Continue(Available,Need[i])){
Finish[i]=true;
store[step]=i;
add(Available,Need[i],Allocation[i]);
dfs(step+1);
sub(Available,Need[i],Allocation[i]);
Finish[i]=false;
}
}
}
}