仅做学习使用,只是自己的一个小练习,有些地方的代码是针对例题设置
书籍封面:
以下是代码(配有注释):
#include#include //为了是两个数组相等memcpy函数加的头文件 using namespace std; #define SourseNum 3 //资源种类数,例题中为ABC三种资源(书P112) #define N 5 //进程数,5 #define M 3 //资源种类数 #define A 0 #define B 1 #define C 2 //资源名称,在后面数组中使用的时候可以直接用名字,不需要考虑其实际值是数组下标012 //银行家算法 int Available[SourseNum]= {3,3,2}; //可利用资源数,系统拥有的 int Max[N][M]={ {7,5,3},{3,2,2},{9,0,2},{2,2,2},{4,3,3} };//最大需求矩阵 int Allocation[N][M]={ {0,1,0},{2,0,0},{3,0,2},{2,1,1},{0,0,2} }; //n进程已经拥有的m资源数量 int Need[N][M]={ {7,4,3},{1,2,2},{6,0,0},{0,1,1},{4,3,1} }; //进程n还需要m资源数量 int Request[N][SourseNum]; //存放的内容是n进程请求申请的资源数 //安全性算法 int Work[SourseNum];//工作向量,表示系统可提供给进程继续运行所需的各类资源数目,执行安全算法时Work[] = Available[] bool Finish[N];//表示系统是否有足够的资源分配给进程使之运行完成,一开始都为false //声明所有函数 void initial();//初始化所有资源初始值 bool banker_suanfa(int name);//银行家算法 ,name是进程序号 bool is_safe();//安全性算法 void banker_back_suanfa(int name);//不安全的时候要回退资源,银行家算法里面加减了啥都得改回去 void output();//把所有内容可视化输出,不然输着输着忘记内容了 bool banker_suanfa(int name){//银行家算法,失败(当输入不合法的时候)则返回false;name是进程序号 //(1) if(Request[name][A]>Need[name][A]) return false; if(Request[name][B]>Need[name][B]) return false; if(Request[name][C]>Need[name][C]) return false; //(2) if(Request[name][A]>Available[A]) return false; if(Request[name][B]>Available[B]) return false; if(Request[name][C]>Available[C]) return false; //(3)输入合理,进行操作 for(int i =0 ;i 0){ return false;//只要资源数有大于0的就代表还有资源呢,就不能结束! } } return true;//结束啦 } int main() { int name; //进行申请的进程序号,0——4 int Sourse_A;//申请的A资源数量 int Sourse_B;//申请的B资源数量 int Sourse_C;//申请的C资源数量 // initial();//程序开始时初始化 //因为发现错误所以这个函数挂了 cout<<"程序还未开始时各资源情况如下:"< >name; cout<<"n 分别申请ABC多少资源数(数字之间搁一个空格)?n"; cin>>Sourse_A>>Sourse_B>>Sourse_C; Request[name][A]=Sourse_A; Request[name][B]=Sourse_B; Request[name][C]=Sourse_C; if(banker_suanfa(name)){//输入的申请资源数合理,已分配资源给 if(is_safe()){//如果是安全的 cout<<"进程"< 以上代码能够运行,初步判断结果正确
下面是书上的例子,有兴趣的话读者可以把代码拷贝到本地运行,输入测试样例试一下。
over~



