目录1.设计目的……………………………………………………………………12.问题描述……………………………………………………………………13.需求分析……………………………………………………………………13.1数据需求………………………………………………………………13.2基本功能需求…………………………………………………………13.3非功能性需求…………………………………………………………14.概要设计……………………………………………………………………14.1数据结构………………………………………………………………14.2系统功能模块介绍……………………………………………………24.2.1数据定义…………………………………………………………24.2.2输出矩阵…………………………………………………………24.2.3试分配资源………………………………………………………24.2.4安全性检测………………………………………………………24.3系统功能模块图………………………………………………………25.详细设计……………………………………………………………………25.1系统函数详细介绍……………………………………………………25.2银行家算法……………………………………………………………35.3安全性算法……………………………………………………………45.4程序流程图……………………………………………………………46.调试分析……………………………………………………………………67.使用说明……………………………………………………………………88.设计总结……………………………………………………………………89.参考文献……………………………………………………………………910.程序源代码…………………………………………………………………9西安建筑科技大学华清学院课程设计(论文)11.设计目的通过银行家算法设计与实现,可以加深学生对死锁的理解,掌握死锁的预防、避免、检测和解除的基本原理,重点掌握死锁的避免方法—银行家算法。使学生初步具有研究、设计、编制和调试操作系统模块的能力。2.问题描述设计一个进程动态请求资源的模拟系统,实现随机产生进程请求资源的数量;资源安全性检查算法;资源的分配算法;以及输出显示每次请求的结果和系统资源的状态。3.需求分析3.1数据需求字符范围:0,1,2……n3.2基本功能需求为进程随机产生请求资源的数量,系统通过资源安全性检查,检查是否满足安全要求。若安全,则才分配资源;不安全时,系统恢复申请前的状态;只有当进程满足全部的资源需求时,该进程执行结束,释放所占的资源。3.3非功能性需求用户界面需求:简洁、易用、易懂、友好的用户界面。硬件需求:Windows7系统,VC++6.0开发工具。4.概要设计4.1数据结构主要用到的数据结构:(1)最大需求矩阵Max[][](2)已分配矩阵Allocation[][](3)仍需求矩阵Need[][]=Max[][]-Allocation[][]西安建筑科技大学华清学院课程设计(论文)2(4)可利用资源向量Available[](5)申请各类资源向量Request[](6)工作向量work[],Finish[]4.2系统功能模块介绍4.2.1数据定义intMax[MaxResource]intAllocation[MaxResource]intNeed[MaxResource]4.2.2试分配资源据用户输入的数据进行试分配4.2.3输出矩阵据输入数据输出对应矩阵,并计算出需求矩阵4.2.4安全性检测进程间是安全的时候则可以输出相应的安全序列。如果错误,则可以回到数据的初始化状态4.3系统功能模块图图4.3-1功能模块图5.详细设计5.1系统函数详细介绍intMax[MaxResource]//表示某个进程对某类资源的最大需求intAllocation[MaxResource]//表示某个进程已分配到某类资源的个数intNeed[MaxResource]//表示某个进程尚需要某类资源的个数intmark[MaxResource]//在使用FreeRecourse是以确定是否释放资银行家算法数据定义试分配输出矩阵安全性检测西安建筑科技大学华清学院课程设计(论文)3源voidInitialize(pcb*&head,intm,intn,intAvailable[MaxResource])//初始化进程资源值voidAddPcb(pcb*&head,pcbnode)//增加进程链表块voidShowPcb(pcb*head,int*avail,intm)//显示进程初始化的资源值pcb*Seek(pcb*head,intpid)//查找进程在链表中的位置voidFreeResource(pcb*&head,intAvailable[MaxResource],intm)//若进程所需资源已全部分配,则释放该进程占据的全部系统资源pcb*Application(pcb*head,int*request,int*avail,intm)//再次给进程分配资源pcb*Reasonable(pcb*head,int*finish,int*work,intm,intn)//找到当前安全可执行的进程返回voidAlter(pcb*p,int*work,int*finish,intrecord[][MaxResource],intm)//修改相关进程的资源值intSafetyCheck(pcb*head,int*avail,int*safety,intRecord[][MaxResource],intm,intn)//进程安全性算法voidReturnSource(pcb*p,int*request,int*avail,intm)//若试分配失败,则恢复试分配前的资源状态voidmain()//主函数5.2银行家算法(1)如果Requesti<or=Need,则转向步骤(2);否则,认为出错,因为它所需要的资源数已超过它所宣布的最大值。(2)如果Request<or=Available,则转向步骤(3);否则,表示系统中尚无足够的资源,进程必须等待。(3)系统试探把要求的资源分配给进程Pi,并修改下面数据结构中的数值:Available=Available-Request[i];Allocation=Allocation+Request;Need=Need-Request;西安建筑科技大学华清学院课程设计(论文)4(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。5.3安全性算法(1)设置两个向量①工作向量Work。它表示系统可提供进程继续运行所需要的各类资源数目,执行安全算法开始时,Work=Allocation;②布尔向量Finish。它表示系统是否有足够的资源分配给进程,使之运行完成,开始时先做Finish[i]=false,当有足够资源分配给进程时,令Finish[i]=true。(2)从进程集合中找到一个能满足下述条件的进程:①Finish[i]=false②Needor=Work如找到,执行步骤(3);否则,执行步骤(4)。(3)当进程P获得资源后,可顺利执行,直至完成,并释放出分配给它的资源,故应执行:Work=Work+Allocation;Finish[i]=true;转向步骤(2)。(4)如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则,系统处于不安全状态。5.4程序流程图主程序流程图:图5.4-1主程序模块图开始结束输入进程数和资源输入系统资源调用动态分配资源函数安全性判断可在申请资源申请是否满足条件执行分配函数重新请求分配执行恢复函数不安全安全否是是否结束是西安建筑科技大学华清学院课程设计(论文)5银行家算法的流程图:图5.4-2银行家算法安全性检查算法流程图:图5.4-3安全检查算法开始结束ERRORERRORRequest[i]=Need?Request[i]=Available?Available[i]-=Request[i];Allocation[i]+=Request[i];Need[i]-=Request[i];SafetyCheck()是否安全分配资源Request[i]=Available?是是是否否否开始结束Work=Available;Finish[i]=pid;Finish[i]!=-1&&Need[i]=WorkWork+=AllocationFinish[i]=-1系统状态安全所有进程的Finish[i]=-1系统状态不安全是否是否西安建筑科技大学华清学院课程设计(论文)6释放资源算法流程图:图5.4-4释放资源算法6.调式分析图6-1初始化资源信息开始结束Need[i]==NULL&&mark[i]==NULLAvailable[i]+=p-Allocation[i]p-mark[i]=1是否西安建筑科技大学华清学院课程设计(论文)7图6-2随机分配资源并进行安全检查图6-2系统给进程0、1随机分配资源,显示所需的资源数。安全信息检查,输出安全序列号图6-3进程再申请资源西安建筑科技大学华清学院课程设计(论文)8图6-3为给进程0再次分配资源,当满足所需资源时,进程执行完,释放系统所占的资源。图6-4分配资源超过可利用资源图6-4分配资源超过可利用资源,系统处于不安全状态,本次申请作废,恢复原来的资源分配状态。7.使用说明按屏幕提示输入进程数。按回车键,输入资源数。按回车键输入系统中可利用的资源数值。回车后据提示输入第0个进程最大需求资源数。屏幕会显示给进程0随机分配的资源数和其所需资源数。据屏幕提示输入下一进程最大所需资源数。回车显示给下一进程随机分配的资源数和其所需资源数。循环操作直至分配完成。显示进程的资源分配信息,并检测其安全性。若显示安全,则可继续分配资源。不安全则本次申请分配作废,恢复原来的分配状态。8.设计总结通过这次实验,让我更加全面的复习C语言,也让我加深了操作系统的知识,知道了系统给进程分配资源时解决死锁的方法,对安全算法和银行家算法有了一定的了解。以前的自己C语言的编程还是有些基础,也做了大量的编程题,西安建筑科技大学华清学院课程设计(论文)9所以,编程不是主要的问题。主要的问题就是对于操作系统系统分配资源的不熟悉,以及试验中所遇到的算法的了解不够,致使在编程中出现了一些错误,之后,通过借阅图书馆的书籍,查阅相关的资料,弄懂了算法的含义,解决了相关的问题,让我收获不少。9.参考文献[1]汤小丹等编著.计算机操作系统(第三版).西安:西安电子科技大学出版社,2007.5[2]史美林编.计算机操作系统教程.北京:清华大学出版社,1999.11[3]徐甲同编著.操作系统教程.西安:西安电子科技大学出版社,1996.8[4]Clifford,A.Shaffer编著.数决结构与算法分析(C++版).北京:电子工业出版社,2005.7[5]蒋立翔编著.C++程序设计技能百练.北京:中国铁道出版社,2004.110.程序源代码#includestdio.h#includestdlib.h#includestring.h#defineMaxResource10//最大系统资源类#defineNULL0structpcb//定义进程控制块PCB{intpid;//进程标号intMax[MaxResource];//表示某个进程对某类资源的最大需求intAllocation[MaxResource];//表示某个进程已分配到某类资源的个数intNeed[MaxResource];//表示某个进程尚需要某类资源的个数intmark[MaxResource];//在使用FreeRecourse是以确定是否释放资源pcb*next;西安建筑科技大学华清学院课程设计(论文)10};voidInitialize(pcb*&head,intm,intn,intAvai