《c实现银行家算法.docx》由会员分享,可在线阅读,更多相关《c实现银行家算法.docx(7页珍藏版)》请在优知文库上搜索。
1、钺行家算法银行家算法是一种最有代表性的防止死锁的算法.要好糅银行家算法,必须先解择操作系统平安状态和不平安状态.平安状态;如果存在一个由系统中所有进程构成的平安序列P1.,,Pn,则系统处于平安状态。平安状态一定是没有死镇发生。不平安状态:不存在一个平安序列.不平安状态不一定导致死桢.那么什么是平安序列呢?平安序列:一个进程序列IP1.,Pnj是平安的,如果对于每一个进程Pi(IWiWn),它以后尚需要的资源砧不超过系统当前剩余资源乖与所有进程Pj(ji)当前占有资源址之和,银行家算法:我们可以把操作系统看作是极行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用
2、户向银行家贷款.操作系统按照银行家制定的规则为进程分配资源当进程首次申请资源时,要川试该进程对资源的最大需求属,如果系统现存的资源可以满足它的最大需求家则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续巾诂资源时,先测试该迸程已占用的资源数与木次申请的资源数之和是否超过了该进程对资源的最大需求量,若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请城分配资源,否则也要推迟分配.算法:n:系统中进程的总数m:资源类总数Avai1.ab1.e:ARRY1.ofinteger:Max:ARRAY1.r,1.inofinteger;A1
3、.1.ocation:ARRAY1.n,1.tnofinteger;Need:ARRAY1.n,1.ofinteger;Request:AKRY1.n,1.mJofinteger:符号说明:Avai1.ab1.eUr用剩余资源Max豉大需求A1.1.ocation已分配资源Need需求资淘Request请求资源当进程Pi提出资源申请时,系统执行以下步臊:(=为赋值符号,=为等号)step(1)若ReqUeSt:否则进程等待step(3)假设系统分配了资源,则有:Avai1.ab1.e=AvaiIab1.e-Request;A1.1.ocation=A1.Iocation+Rcques1.:Ne
4、ed=Need-Request若系统新状态是平安的.则分配完成若系统新状态是不平安的,则恢复原状态,进程等待为进行平安性检性,定义数据结构:WorkiARRAYt1.11Jofinteer:FinishiARRAYt1.11ofBoo1.ean:平安性检住的步骤:step:Work=Avai1.ab1.e;FiniSh=fa1.se:step(2)寻找满足条件的i:a.Finish=fa1.se;b.NeecK=Work:如果不存在gotostep(4)step(3)Work=IorkAI1.ocation;Finish=Iruc;otostcp(2)step(4)若对所有KPinishYni
5、3则系统处于平安状态否则处于不平安状态/*银行家算法操作系统概念(OSconceptsSixEdition)reeditbyJohnnyhagen.SCA1.runatvc6.0*/inc1.ude1.1.oc.h*Sinc1.ude*stdio.h*Uinc1.ude*std1.ib.h*Mefinea1.Ioc1.ensizeof(structa1.1.ocation)WefinemaxIensizeof(structmax)sizeof(structavai1.ab1.e)SdefineneedIensizeof(structneed)RdefinefiniIenSiZeOf(StnIe
6、tfinish)Udefinepath1.ensizeof(structpath)structa1.1.ocation(intva1.ue;structa1.1.ocationnext:):structBaXintva1.ue;structax*next;);structavai1.ab1.e*可用资源数*/intva1.ue;structavai1.ab1.e*next;);structneed*潴求资源数”intva1.ue;structneed*next;):structpathintva1.ue;structpath*next;):structfinish(intstat;struct
7、finish*next;):intIiiainO(introw,co1.um.status=0.i,j,t.t*avaiIab1.e1.*avai1.ab1.c2,Morkhead,*uxrk1.,Work2,*worktcra,*worktc三p1.;structneed*needhead.need1.,*need2,*needtemp;structfinish*finihead.*finish1.,finish2.!inishtemp;structpath*pathhead,ath1.,*path2;printfn请输入系统资源的种类数:D;scanf(%d”,Aco1.um);Print
8、fC请输入现时内存中的进程数scant(*%d*,4row):PrintN”请输入已分配资源矩阵:):for(i=0iirow;i+)(for(j=0;jnext-a1.1.oc2-next-N1.1.1.;scant,va1.ue);status+;)e1.se(a1.1.oc2=(structa1.1.ocation*)ma1.1.oc(a1.Ioc1.en);scant(*%d,%d*.&a1.1.oc2-va1.ue):if(Status=I)a1.Iocheadnext=a1.1.oc2;status*4;a1.1.oc1.-next=a1.1.oc2;a1.1c1=bI1.oc2;
9、a1.1.oc2next-N1.1.1.;Status=O;Mimfr请输入G大商求矩阵:n);for(i=0;irow;i+)for(j-0;jnext=maxium2-next=N1.I.1.;scanf(*va1ue):status+*;)e1.semaxiu三2=(struct11hx)三a1.1.oc(max)en);scanf(*%dtd*.foaxiu三2-vaIUe);ifCstatus=I)mnxhead-next-maxium2:status+;)maxius1.-next=naxiu2:maxiu三1.=11axium2:maxiui2-next=MJ1.1.;S1.at
10、us=O;printf(“请输入现时系统财余的资源矩阵:r);for(j=0:jnext=avai1ab1.e2-next=NU1.1.:work1.-next=work2-next-N1.1.1.;scanf(,Aavai1.ab1.e1.-va1.ue);work1.-va1ue=avai1.ab1.e1.-va1ue;status*;)e1.seavai1.ab1.e2=(structavai1.ab1.e*)mva1.ue);work2-va1ue=avaiIab1.e2-va1ue;if(Status=I)avahead-ncxt=avai1.ab1.e2;workheadnext-
11、work2;status+;)avai1.ab1.e1.-next=avai1.ab1.e2:avai1.ab1.e1.=avai1.ab1.c2:work1.next=work2;work1.=work2;)avai1ab1c2-next=NU1.1.:work2-next=N1.1.1.:status-0;a1.1.octBp=a1.Iochead;maxte三p=maxhead;fori=0;irow;i+)for(j=0;jncxt=need2-next=N1.1.1.;need1.Xa1.ue-OuixtBnp-Xa1.ueH1.1.octenpva1.ue:status+:)e1.senoed2二(Stn1.Ctneed*)ma1Ioc(need1.en);need2va1.ue-(11uxtempva1.ue)(1.Ioctempva1.ue);if(status-=!)needhead-next=need2:status+;)need1.next-need2:need1.-need2;)maxteBp=maxtemp-next;a1.1.octcp-a11.octcmp-next:)need2next=N1.1.1.:status=0;for(i=0iinex