1、假设平安,才正式将资源分配给进程;否那么本次试探分配作废,恢复原来的资源分配状态,让该进程等待。(5)用dowhile 循环语句实现输入字符y/n判断是否继续进行资源申请。4平安性检查算法safe()函数(1)设置两个向量:工作向量Work,它表示系统可提供应进程继续运行所需的各类资源数目,在执行平安性算法开始时,Work= Available。Finish,它表示系统是否有足够的资源分配给进程,使之运行完成。开始时先做Finishi=0;当有足够的资源分配给进程时,再令Finishi=1。(2)在进程中查找符合以下条件的进程:条件1:Finishi=0;条件2:needij=Workj假设找
2、到,那么执行步骤(3)否那么,执行步骤(4)(3)当进程获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Workj= Workj+ Allocationij;Finishi=1;goto step 2;(4)如果所有的Finishi=1都满足,那么表示系统处于平安状态,否那么,处于不平安状态。四:源程序结构分析1程序结构程序共有以下五个局部:初始化chushihua():用于程序开始进行初始化输入数据:进程数量、资源种类、各种资源可利用数量、各进程的各种资源已分配数量、各进程对各类资源最大需求数等。当前平安性检查safe():用于判断当前状态平安性,根据不同地方的调用提示处
3、理不同。银行家算法bank():进行银行家算法模拟实现的模块,调用其他各个模块进行银行家算法模拟过程。显示当前状态show():显示当前资源分配详细情况,包括:各种资源的总数量(all)、系统目前各种资源可用的数量、各进程已经得到的资源数量、各进程还需要的资源量。主程序main()逐个调用初始化、显示状态、平安性检查、银行家算法函数,使程序有序的进行。2数据结构程序使用的全局变量:const int x=10,y=10;/定义常量int Availablex;/各种资源可利用的数量int Allocationyy;/各进程当前已分配的资源数量int Maxyy;/各进程对各类资源的最大需求数i
4、nt Needyy;/还需求矩阵int Requestx;/申请各类资源的数量int Workx;/工作向量,表系统可提供应进程运行所需各类资源数量int Finishy;/表系统是否有足够的资源分配给进程,0为否,1为是int py;/存储平安序列int i,j;/全局变量,主要用于循环语句中int n,m;/n为进程的数量,m为资源种类数int l=0,counter=0;3函数声明void chushihua(); /系统初始化函数void safe(); /平安性算法函数void bank(); /银行家算法函数void show (); /输出当前资源分配情况4主函数main()in
5、t main() cout /显示程序开始提示信息 chushihua(); /初始化函数调用endlendl; showdata(); /输出初始化后的状态 /=判断当前状态的平安性= safe(); /平安性算法函数调用 if (ln)n当前状态不平安,无法申请,程序退出! system(pause);sign(); /调用签名函数 return 0; / break; else int i; /局部变量 l=0;coutn平安的状态!平安序列为: ;进程(p0) /输出平安序列,考虑显示格式,先输出第一个for (i=1; ipi for (i=0; i+) Finishi=0; /所有
6、进程置为未分配状态 bank(); /银行家算法函数调用return 0;5源程序代码#include stdio.hstdlib.hstring.h/定义全局变量const int x=10,y=10; /常量,便于修改 /各资源可利用的数量 /各进程当前已分配的资源数量 /各进程对各类资源的最大需求数 /尚需多少资源 /申请多少资源 /工作向量,表示系统可提供应进程继续运行所需的各类资源数量 /表示系统是否有足够的资源分配给进程,1为是 /存储平安序列 /i表示进程,j表示资源 /n为进程i的数量,m为资源j种类数int l=0; /l用来记录有几个进程是Finishi=1的,当l=n是说
7、明系统状态是平安的int counter=0;/函数声明 /初始化函数 /平安性算法void show(); /函数show,输出当前状态 /银行家算法void jieshu(); /结束函数void chushihua()输入进程的数量:/从此开始输入有关数据 cin输入资源种类数:m;输入各种资源当前可用的数量( m 种): for (j=0; j j+) cout输入资源 jAvailablej; /输入数字的过程. Workj=Availablej; /初始化Workj,它的初始值就是当前可用的资源数输入各进程当前已分配的资源数量Allocationn i+) cout 输入进程 iA
8、llocationij; Finishi=0;/初始化Finishi输入各进程对各类资源的最大需求Max 对资源 的最大需求数:Maxij; if(Maxij=Allocationij) /假设最大需求大于已分配,那么计算需求量 Needij = Maxij-Allocationij; else Needij=0;/Max小于已分配的时候,此类资源已足够不需再申请初始化完成/平安性算法函数void safe()i+) /i+ if (Finishi=0) /逐个查找Finishi=0的进程 条件一 counter=0; /记数器 for (j=0; if (Workj=Needij) coun
9、ter=counter+1;/可用大于需求,记数 if(counter=m) /i进程的每类资源都符合Workj=Needij 条件二 pl=i; Finishi=1; /i进程标志为可分配 for (j=0;j+) Workj=Workj+Allocationij; /释放资源 l=l+1; /记数,现在有L个进程是平安的,当L=N时说明满足平安序列 i= -1; /从第一个进程开始继续寻找满足条件一二的进程 /显示当前状态函数void show() /函数show,输出当前资源分配情况 int i,j; int Ally; /各种资源的总数量 int L1; /局部变量L1当前的状态为:各
10、种资源的总数量: 资源: Allj=Availablej; /总数量=可用的+已分配的 for (i=0;i+) Allj+=Allocationij;Allj当前各种资源可用的量为(available):Availablej各进程已经得到的资源量(allocation): for(i=0;=m; for (j=i;j+) coutj; for(L1=0;L1L1+) for (j=i;AllocationL1j各进程还需要的资源量(need): for (j=i; for(L1=0;NeedL1j/银行家算法函数void bank()进程申请分配资源: int k=0; /用于输入进程编号
11、bool r=false; / 初值为假,输入Y继续申请那么置为真 do/输入请求输入申请资源的进程(0-n-1n-1) /输入错误处理输入错误,重新输入:输入申请资源的进程(0-输入该进程申请各类资源的数量: for (j=0; do /dowhile 循环判断申请输入的情况 cout进程 kRequestj; if(RequestjNeedkj) /申请大于需求量时出错,提示重新输入贷款数目不允许超过需求数目 cout申请大于需要量!申请的资源的数量为Requestj,大于进程对该资源需求量NeedkjAvailablej) /申请大于可利用量, 应该阻塞等待? ? coutNeedkj)
12、; /RequestjAvailablej| /改变Avilable、Allocation、Need的值 j+) Availablej = Availablej-Requestj; Allocationkj = Allocationkj+Requestj; Needkj = Needkj-Requestj; Workj = Availablej; /判断当前状态的平安性 safe(); /调用平安性算法函数 if (ln) l=0;n试分配后,状态不平安,所以不予分配!恢复原状态 /恢复数据 Availablej = Availablej+Requestj; Allocationkj = Al
13、locationkj-Requestj; Needkj = Needkj+Requestj; Workj = Availablej; for (i=0; Finishi=0; /进程置为未分配状态 elsen申请资源成功! for(j=0; if(Needkj=0); else /有一种资源还没全部申请到,那么该进程不可执行,不能释放拥有的资源 l=1; /置l为1,作为判断标志 break; if(l!=1) /进程可以执行,那么释放该进程的所有资源j+) Availablej=Availablej+Allocationkj; Allocationkj=0;该进程已得到所有需求资源,执行后将
14、释放其所有拥有资源! /归零 Finish0=0; for (i=1; Finishi=0; show(); /显示当前状态ppp: /申请大于可利用量,应该阻塞等待,结束本次资源申请,GOTO 语句跳转至此是否继续申请资源(y/n) ? char* b=new char; /输入y/n,判断是否继续申请 endlb;- if(*b=y|*b=Y) r=true; else r=false; /输入非 Y 那么令 R =false jieshu(); /调用结束函数 while (r=true);/结束函数void jieshu()tt 演示计算完毕/主函数tttt模拟银行家算法 show(); /输出当前状态 /判断当前状态的平安性n) /l在safe中是用来记录平安的进程的个数的n当前状态不平安,拒绝申请! elsen当前的状态是平安的! /输出平安序列 for (i=1; i+) cout /调用银行家算法函数五:程序运行结果1例如数据课本例题 进程数量:5资源种类3三种资源以abc表示例如数据 资源MaxAllocationNeedAvailable进程abc753010743332132220012229023026003222
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1