C++ 银行家算法实现 详解

广州大学 操作系统实验二

银行家算法主要是用来解决系统分配资源的问题。不想看太多可以直接跳到算法实现思路。

算法理解:
银行家算法的存在是为了防止出现系统资源分配不合理导致死锁的情况,主要用来判断该资源请求是否合理,分配之后系统是否处于安全状态。

安全状态:系统存在安全序列,类似于进程序列(p1,p2,p3);系统按照该顺序,从进程p1一直执行到进程p3都不会出现资源不足或者死锁的情况。

即一开始系统空闲的资源,足够提供资源让p1达到所需各类资源的最大值。(假设有ABC三类资源,空闲的A,B,C类资源分别要大于p1仍需的A,B,C资源。仍需=最大-当前占用。),

而p1获得资源并达到所需资源最大值之后,就会执行,之后p1会释放p1所占用的全部资源,p1释放的资源就会加入到空闲资源里面,释放之后的空闲资源数要大于p2仍需的资源数;

同理,p2占用资源达到所需最大值之后,也会执行完毕,也会释放p2所占用的全部资源,这时的空闲资源数要大于p3仍需要的资源数。
(进程需要排列先后顺序,主要原因是系统当前占用的资源)

先执行所需资源小的进程,在进程释放资源之后,总的空闲资源会比执行该进程之前多出该进程当前所占用的资源。
假如p1所需最大资源分别为5,6,7;当前p1所占用的为1,2,3;当前系统空闲资源为7,5,6;那么当分配给p1资源4,4,4时;p1所占用会变成5,6,7达到进程所需最大值,该进程会执行并释放资源;释放之后,总的空闲资源就变成了8,7,9;多出了p1之前所占用的部分。

而系统每一次分配资源(前提:提出的分配请求是合理的,即请求的资源加上当前占用不会超过所需最大值)都会假设先分配资源,然后用分配了资源之后的各类资源数去查找是否存在安全序列,如果不存在代表系统将会处于不安全状态,这次的资源分配会取消,所分配的资源会退回。若分配之后还能找到安全序列,则进行该资源分配。

实现算法思路
首先,要把所需要的一些记录系统资源的变量给设出来。个人是设为全局变量。
MaxNeed[3][4],进程所需最大资源数,二维数组,一维代表进程,一维代表资源种类。(下面同理)
occupy[3][4];进程当前占用资源
Need[3][4];进程仍需资源,这个记得要用最大需求-当前占用资源来计算,
Available[3];空闲资源

判断函数
判断当前是否存在安全序列的函数,这时需要用到全排列,每一种排列顺序都检查是不是安全序列。个人用的是枚举法,有多少种资源就多少个循环,用if来判断,遇到循环里面数据出现重复的,就调用continue。
检查安全方法是用当前空闲的各类资源去和第一个进程仍需的各类资源进行比较,只要有一种资源是空闲的小于仍需的,就判断不是安全序列。如果各类资源都足够,则空闲资源数加上该进程的当前占用资源形成新的空闲资源去和下一个序列进行比较,一直到最后一个序列。

用一个数组来记录每一环比较的结果,遇到是空闲都大于仍需的就返回1,不然就返回0;最后判断一下,全1则为安全序列,并将该安全系列输出,并返回1.如果一直执行到最后一个都没有出现全1,则返回0,代表没有安全序列,系统将处于不安全状态。

分配函数
进行资源的分配,一开始先对请求的资源进行判断,请求的资源加上当前占用的资源,是否有哪一种资源超出的该进程设定的该资源最大值,超出就报错。
然后把请求的各类资源数,以及所请求的进程的进程名输出。
根据请求的资源,修改系统资源数据,修改之后调用判断算法,根据返回值来判断分配后系统是否处于安全状态。如果返回值是0,则将刚才修改的数据修改回原来的值;如果返回1,则代表存在安全序列,可以分配。

展示函数
将当前系统空闲资源,各进程当前占用资源数,各进程所需最大资源数,各进程仍需资源数等进行输出。

主函数
利用循环实现多次请求资源,以及展示系统状况。

源码
后面再放

你可能感兴趣的:(C++ 银行家算法实现 详解)