1、银行家算法的模拟实现一、 实验题目:模拟实现银行家算法的处理过程二、 实验目的:银行家算法是避免死锁的代表性算法。本实习旨在加深了解有关资源申请、避免死锁、状态安全性等概念,并体会和运用避免死锁的具体实施方法。然后依照本实习,自行设计模拟程序。三、 实验原理:1. 我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源。当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,
2、先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。2. 安全状态:如果存在一个由系统中所有进程构成的安全序列 P1,Pn ,则系统处于安全状态。安全状态一定是没有死锁发生。 不安全状态:不存在一个安全序列。不安全状态一定导致死锁。安全序列:一个进程序列P1,Pn是安全的,如果对于每一个进程 Pi(1in) ,它以后尚需要的资源量不超过系统当前剩余资源量与所有进程 Pj (j #include#include#includeu
3、sing namespace std;#define N 3 /进程数#define M 3 /资源数int AvailableM; /可用的资源数int NeedNM=0; /还需要的资源数int MaxNM; /最大需求量int AllocationNM = 0; /当前分配到的资源数int RequestNM=0; /请求的资源数int n;time_t t;int isFinishN =0; /判断进程是否已经请求资源结束int test1 = 0;void Requester(); /进程随机请求资源数目void Handle(); /处理该请求bool Check(); /安全性算
4、法检查void show(); /打印出当前的进程资源状态int Finish(int); /进程是否已经完成,若完成返回 1,否则为 0void main()int i;int j;cout Availablei;cout Maxij;Needij = Maxij - Allocationij;cout “-原始状态-“ endl;show();int test = 0;int testP = 0;int testR = 0;doRequester ();test+;while(test != 10);int Finish(int i)int test = 0;int w = i;for(i
5、nt j=0; jM; j+)if(Needwj = 0) /对 j 资源的需求量已经为 0test+;if(test = M) /如果对每个资源的需求量都已经为 0isFinishw = 1; /则将其设为 1,代表已经完成return isFinishw;void Requester ()time_t t;int test = 0;srand(unsigned)time(n = rand()%N;for(int j=0; jM; j+)if(Neednj = Availablej)test+;for(j=0; jM; j+)if(test=N )Requestnj = Neednj;els
6、esrand(unsigned)time( Requestnj = rand()%4;Handle();void Handle() /处理请求int test1 = 0;int test2 = 0;for(int j=0; jM; j+)if(Requestnj=Neednj)if(Requestnj = Availablej)test1+;elsecout “目前没有足够的资源分配给你的进程“ n “的请求“;for(j=0; jM; j+)cout Requestnj “ “;cout “,请等待!“ endl endl;elsecout “你的进程“ n “所请求的资源“;for(j=0
7、; jM; j+)cout Requestnj “ “;cout “已经超过进程的需求数目!“ endl endl;if(test1 = M) /请求资源数目均小于可用资源数目cout “处理你的进程“ n “的请求“;for(j=0; jM; j+)cout Requestnj “ “;cout endl ;for(j=0; jM; j+)Availablej = Availablej- Requestnj;Allocationnj = Allocationnj+Requestnj;Neednj = Neednj-Requestnj;if(Check()=true) /安全性算法检查是安全的
8、,则打印出来show();if(Finish(n) = 1) /如果此次分配后该进程已经结束,那么久释放其占用的资源数目cout “进程“ n “已经结束,会释放资源“ endl;for(j=0; jM; j+)Availablej = Availablej + Allocationnj;Allocationnj = 0;Neednj = 0;show();elsecout “你的进程“ n “所请求的资源“;for(j=0; jM; j+)cout Requestnj “ “;cout “系统不安全!本次资源申请不成功!“endl endl;for(j=0; jM; j+) /如不安全则收回
9、此次分配的资源数目Availablej = Availablej + Requestnj;Allocationnj = Allocationnj - Requestnj;Neednj = Neednj + Requestnj;bool Check() /安全性算法检测int workM =0;bool finishN;for(int j=0; jM; j+)workj = Availablej;for(int i=0; iN; i+)finishi = false;int test = 0;bool flag;int k=0;for(j=0; jM; j+)if(Neednj = workj)
10、test+;if(test = M)flag = true;elseflag = false;test = 0;for(i=0;iN;i+)for(i=0;iN;i+) /循环检测if(finishi = false jM; j+)workj = workj + Allocationnj;finishi = true;test+;if(test = N)return true;elsereturn false;void show()cout “-“ endl;cout “资源请求“ “t“ “已分配资源“ “t“ “尚需资源“t“ “剩余可用资源“ endl;cout “进程名称“ “tA B
11、 C “ “tA B C “ “t A B C “endl;for(int i=0; iN; i+)cout “ P“ i “ t“;for(int j=0; jM; j+)cout Allocationij “ “;cout “t“;for(j=0; jM; j+)cout Needij “ “;if( i=0 )cout “t “;for(j=0; jM; j+)cout Availablej “ “;cout endl;cout “-“ endl endl;六、 运行结果:七、 实验心得:这次的实验模拟实现银行家算法虽然用程序算法实现了模拟进程请求资源以及根据安全性检测是否要分配资源的整
12、个过程,自己考虑整个代码的框架过程中期初觉得思路清晰,应该比较简单,但是列出框架以及主要函数之后开始用代码实现的时候,发现了很多隐藏的细节的考虑,比较繁琐而且环环相扣,要真的实现并没有当初以为的那么简单,比如我现在目前的算法虽然模拟了大致的过程,并且也可以不断循环请求,但是在进程请求资源那一块的实现还是有缺陷,没能很好的优化,目前只是如果有足够的资源,就让随机产生的进程 i 申请最大需求量,如果无法满足,则随机产生随机资源数目进行申请。但是这个请求资源并不是很优化需要进一步改造,但是还是对银行家算法有了更深入更清楚的了解,以后的程序编写不论是实验还是项目开发,无论大小,都应该把程序的整体框架构建好,提高重用性,再进行一步步实现。