参考代码:
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> //bool类型数据头函数 #include <iostream> using namespace std; #define processNum 5 //五个进程 #define resourceNum 3 //三类资源 //初始状态 int p; //work表示系统中的可用资源 int work[resourceNum]; //请求的各类资源 int Request[resourceNum]; //判断各类资源是否用完 bool Finish[processNum]; int Available[resourceNum]={3,3,2};//可利用资源 //最大的需求量 int Max[processNum][resourceNum]={7,5,3,3,2,2,9,0,2,2,2,2,4,3,3}; //还需要多少对各类资源的需求 int Need[processNum][resourceNum]={7,4,3,1,2,2,6,0,0,0,1,1,4,3,1}; //分配矩阵 int Allocation[processNum][3]={0,1,0,2,0,0,3,0,2,2,1,1,0,0,2}; //输出初始化的信息表 void print1() { int i,j; printf("系统剩余资源数:"); for(j = 0;j < resourceNum;j++) printf("%d ",Available[j]); printf("\n"); printf("============当前资源分配状态=========\n"); printf("process=== Max =====Allocation===== Need\n"); for(i = 0;i < processNum;i++){ printf("p%d ",i); for(j = 0;j < resourceNum;j++) printf("%d ",Max[i][j]);//输出进程需要的最大需求量 printf(" "); for(j = 0;j < resourceNum;j++) printf("%d ",Allocation[i][j]);//输出进程的各类资源的分配 printf(" "); for(j = 0;j < resourceNum;j++) printf("%d ",Need[i][j]);//输出各类资源仍需要的资源数目 printf(" \n"); } } void print2(int i) { int j; if(Need[i][0]==0&&Need[i][1]==0&&Need[i][2]==0){ for(int te=0;te<resourceNum;te++){ work[te]+=Allocation[i][te]; Available[te]+=Allocation[i][te]; } } printf("p%d ",i); for(j = 0;j < resourceNum;j++) printf("%d ",work[j]); printf(" "); for(j = 0;j < resourceNum;j++) printf("%d ",Need[i][j]); printf(" "); for(j = 0;j < resourceNum;j++) printf("%d ",Allocation[i][j]); printf(" "); for(j = 0;j < resourceNum;j++) printf("%d ",work[j]); printf(" "); for(j = 0;j < resourceNum;j++) if(!Finish[i]) break; if(j == resourceNum) printf("true"); else printf("false"); printf(" \n"); } //进程不安全,回收预分配的资源 void recycle() { int j; for(j = 0;j < resourceNum;j++){ Need[p][j] += Request[j]; Available[j] += Request[j]; Allocation[p][j] -= Request[j]; } printf("系统进程资源状态不改变!\n"); } //检测分配是否安全。 void Test_safety() { int i,j,te; int finish = 0,Done = 0; //Done一轮遍历下完成的,finish总共完成的 int safeseries[processNum] = {-1,-1,-1,-1,-1}; //初始化 for(i = 0;i < processNum;i++) Finish[i] = false; for(j = 0;j < resourceNum;j++) work[j] = Available[j]; //初始值等于Available; // 查找未完成进程,且当前进程尚需资源不大于系统剩余资源; i = 0; while(finish != processNum){ j = 0; if(Finish[i] == false)//如果这个进程的还需要的各类资源还大于系统当前的资源的,break; { for(j = 0;j < resourceNum;j++) if(Need[i][j] > work[j]) break; } if(j == resourceNum){//此时代表当前的系统资源可以满足这个进程 //那么可以对这个进程的资源进程回收。 Finish[i] = true;//代表该进程已经被完成。 print2(i); safeseries[finish++] = i; //记录下安全序列 for(j = 0;j < resourceNum;j++)//开始资源的回收 work[j] += Allocation[i][j]; } i++; //下一个进程 //一轮遍历后,判断是否还有可分配进程 if(i >= processNum){ i = i % processNum; if(Done == finish) //判断本轮完成进程是否等于上一轮,是则代表没有可执行进程 break; else Done = finish; //否则将本轮完成进程数赋值给Done } } if(finish == processNum){ printf("进程P%d请求通过,此时安全序列为:",p); for(i = 0;i < processNum;i++) printf("p%d ",safeseries[i]); printf("\n"); print1(); //打印出此刻系统资源分配状态 } else{ recycle(); printf("进程死锁,进程P%d请求无法通过!\n",p); print1(); } } void judge_assign() { int j; for(j = 0;j < resourceNum;j++){ //当前请求资源加上已分配资源不能大于最大需求资源; if(Request[j] + Allocation[p][j] > Max[p][j]){ printf("当前请求资源+已分配资源>最大需求资源:无法满足!错误!\n"); break; } //当前请求资源不能大于系统现有资源; if(Request[j] > Available[j]){ printf("当前请求资源>系统现有资源:无法满足!错误!\n"); break; } } if(j == resourceNum){ //尝试分配资源 for(j = 0;j < resourceNum;j++){ Need[p][j] -= Request[j]; Available[j] -= Request[j]; Allocation[p][j] += Request[j]; } //检查此时系统的安全性 printf("===========安全序列===========\n"); printf("process=== Work===== Need =====Allocation=====work+allocation==finish\n"); Test_safety(); } } int main() { int i; print1(); printf("===========此时安全序列===========\n"); printf("process=== Work===== Need =====Allocation=====work+allocation==finish\n"); Test_safety(); while(1){ printf("存在进程0,1,2,3,4,资源类别0,1,2\n请依次输入请求资源的进程和进程请求的A,B,C类资源数\n例如:1 0 0 1 \n"); scanf("%d",&p); for(i = 0;i < resourceNum;i++) scanf("%d",&Request[i]); //尝试分配资源给进程 judge_assign(); } return 0; }