本文共 1934 字,大约阅读时间需要 6 分钟。
在避免死锁的方法中,银行家算法是最具代表性的死锁算法。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终都处于安全状态,便可以避免发生死锁。在分配资源之前,判断系统是否是安全的;若安全,才分配。
1.调用init()函数初始化资源的基本信息(资源的种类数、资源的名字、每种资源的最大个数)和进程的基本信息(进程的个数、每个进程的名字、每个进程对每种资源的最大需求数)。如果输入的进程对资源的最大需求大于资源的最大数,则提示需求超过资源上限,并重新输入。
2.调用init_allocation()函数初始化分配状态,可以输入当前各个进程对各种资源的占有情况,如果输入大于该进程最大需求,则提示当前资源占用超过所需最大资源,并重新输入;如果输入大于资源最大数量,则提示当前资源占用超过资源上限,并重新输入。
3.更新需求矩阵和资源数量
4.输出资源矩阵、最大需求矩阵、已经分配矩阵和仍需分配矩阵。
5.调用allo方法,准备开始分配资源。首先输入进程名和所需各类资源数量,如果进程存在,请求资源数量小于仍需分配的数量,并且请求资源数量小于资源最大数量,则尝试分配,修改分配矩阵、仍需矩阵和资源矩阵,并调用safe方法判断是否安全,安全则分配成功,不安全则重置分配矩阵、仍需矩阵和资源矩阵。本程序尚未处理输入进程不存在的情况。
//银行家算法#include#include #include //函数声明void update();intallo();//全局变量int n; //n表示资源的种类数int m; //m表示进程//结构体struct info{ char name[20]; int claim[50]; //各个进程所需资源的最大需求 int allocation[50];//已经分配 int need[50]; //仍需分配 bool finish; //满足标记}pro[50];struct rescource{ char name[20]; int avaliable;//最大资源数}resc[50],work[50];void init() { int i,j; int flag; printf("请输入资源种类数"); scanf("%d",&n); for(i=0;i resc[j].avaliable) flag=1; else { pro[i].allocation[j]=0; pro[i].need[j]=pro[i].claim[j]; flag=0; } if(flag==1) { i--; printf("\n需求超过资源上限,请重新输入\n"); } getchar(); } } printf("\n");}//初始分配状态void init_allocation() { int i,j; for (i = 0; i resc[j].avaliable) flag = 1; if (pro[i].allocation[j]>pro[i].claim[j]) flag=2; } if (flag == 1) { i--; printf("\n当前资源占用超过资源上限,请重新输入\n"); } else if(flag==2) { i--; printf("\n当前资源占用超过所需最大资源,请重新输入\n"); } } update(); } //更新需求矩阵need和资源数allocation void update(){ int i,j=0; for (i = 0; i
1.初始化时输入进程所需资源数大于资源最大数
2.初始化时进程对资源的占用情况大于进程所需
3.初始化时进程对资源的占用大于资源最大可用
4.初始化成功
5.进程请求资源时大于自己仍需资源数
6.分配失败
7.分配成功