操作系统课程设计(银行家算法)_第1页
操作系统课程设计(银行家算法)_第2页
操作系统课程设计(银行家算法)_第3页
操作系统课程设计(银行家算法)_第4页
操作系统课程设计(银行家算法)_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《操作系统课程设计》题目:银行家算法的设计与实现院、系:计算机信息与技术系学科专业:计算机科学与技术学号:B10060123学生姓名:徐飞指导教师:姜虹×××2012年06月目录一、绪论 1二、需求分析 22.1银行家算法的描述 22.2银行家算法模拟系统流程图 32.3模拟系统用况分析 42.4模拟系统用况规约 42.4.1用况名称:创建进程 42.4.2用况名称:执行进程 5三、总体设计 73.1系统的分层模型 73.2系统部署 73.3系统的静态模型 8四、详细设计 94.1交互层设计 94.2交互逻辑层设计 94.3控制层设计 114.3进程层设计 124.4资源层设计 12五、系统实现 145.1交互层的实现 145.2交互逻辑层的实现 155.3控制层的实现 185.3进程层的实现 215.4资源层的实现 22六、测试与分析 246.1系统资源初始化测试 246.2系统资源初始状态的设置 246.3进程初始化测试 246.4进程初始化设置 256.5执行进程测试 25课程设计总结 26参考文献 27附录A 28一、绪论在具有多道程序并发执行能力的系统中,系统资源的利用率、进程执行的效率都大幅增加,但可能发生“死锁”的危险。所谓死锁,是指多个进程因竞争资源而造成的一种僵局,若无外力作用,这些进程都将永远不能再向前推进。而死锁产生的原因有两点:竞争资源和进程推进的顺序不合法。为了避免死锁,使得进程的执行能够顺利完成,引入银行家算法进行解决。银行家算法是具有代表性的避免死锁的算法,由于该算法能用于银行系统现金贷款的发放而得名。银行家算法包含三个方面的内容:相应的数据结构。银行家算法。安全性算法。其中相应的数据结构定义了银行家算法中需要使用的若干数据结构,银行家算法操作数据结构以为安全性算法提供检测现场,安全性算法则是检测现场是否出于安全态。 系统的安全状态是指能够按照某种顺序,来为每个进程分配其所需资源,直至最大需求,使每个进程都可顺序完成。若系统不存在这样一个安全序列,则称系统出于不安全状态。二、需求分析问题描述:银行家算法是避免死锁的有效办法,为了验证银行家算法可以避免死锁,需要编写程序模拟银行家算法并加以验证。2.1银行家算法的描述银行家算法所涉及的数据结构:可利用资源向量Avaliable它是一个vector向量,可被初始化任意长度,其中每一个元素代表一类可利用资源的数目。其值随着该类资源的分配和回收而动态的改变。最大需求矩阵Max这是一个n×m的矩阵,他定义了系统中n个进程中的每一个进程对m类资源的最大需求。分配矩阵Allocation这是一个n×m的矩阵,他定义了系统中每一类资源当前已分配给每一进程的资源数。需求矩阵Need它是一个n×m的矩阵,用以表示每一个进程尚需的各类资源数。 以上三个矩阵间存在下述关系:Need=Max-Allocation 银行家算法: 设Request是某一进程的请求向量。当进程发出请求后,系统按下列步骤进行检查:如果Request≤Need,则转向步骤2;否则认为出错,因为他所需要的资源数已超过他所宣布的最大值。如果Request≤Avaliable,则转向步骤3;否则表示系统中尚无足够的资源,进程必须等待。系统进行试分配:Avaliable=Avaliable-RequestAllocation=Allocation=RequestNeed=Need-Request4) 系统执行安全性检查,若系统处于安全态,则正式将资源分配给进程;若处于不安全态,则将此次分配作废,回滚到分配前的状态,并通知进程等待。安全性算法: 1) 设置两个工作向量 eq\o\ac(○,1)工作向量Work。他表示系统可提供给进程继续运行所需要的各类资源数目,他含有m个元素,执行安全性算法开始时,Work=Avaliable。 eq\o\ac(○,2)Finish。他表示系统是否有足够的资源分配给进程,使之运行完成,初始状态为Finish[i]=false;当有足够资源分配给进程时,Finish[i]=true。 2) 从进程集合中找到一个能满足下列条件的进程: eq\o\ac(○,1)Finish[i]=false eq\o\ac(○,2)Need≤Work 如找到,执行步骤3,否则,执行步骤4 3) 当某一进程获得资源后,可顺利执行,直至完成,并释放出分配给他的资源,故应执行: Work=Work+Allocation Finish[i]=true Gotostep2 4) 如果所有进程的Finish[i]=true,则表示系统处于安全状态;否则系统处于不安全状态。2.2银行家算法模拟系统流程图银行家算法模拟系统流程图如图2.1所示图2.1系统流程图2.3模拟系统用况分析银行家算法模拟系统的用况图如图2.2所示图2.2模拟系统用况图2.4模拟系统用况规约2.4.1用况名称:创建进程1. 简要说明 该用况描述用户如何通过使用模拟系统进行创建进程的工作。2. 事件流2.1 基本流1. 数据合法性检查 用户选择“创建进程”选项,系统对用户输入的合法性进行检查。2. 提示用户输入创建进程的个数 用户输入进程的个数。3. 数据合法性检查 对用户输入的数据进行合法性检查4. 初始化进程所需的资源量 提示用户输入进程所需的资源量。5. 数据合法性检查 对用户输入的数据进行合法性检查2.2 备选流 备选流一:在基本流步骤1中,规则检查不通过,提示输入数据不合法,请重新输入。 备选流二:在基本流步骤3中,规则检查不通过,提示输入数据不合法,请重新输入。 备选流三:在基本流步骤5中,规则检查不通过,提示输入数据不合法,请重新输入。3. 用例场景3.1 成功场景 成功初始化进程信息:基本流。3.2 失败场景 数据合法性检查不通过:备选流一。 数据合法性检查不通过:备选流二。 数据合法性检查不通过:备选流三。4. 特殊需求无5. 前置条件用户已初始化系统。6. 后置条件 显示安全序列。 显示各数据结构信息。 显示输入数据有误,请重新输入。 显示系统初始状态处于不安全态,进程创建失败,并退出系统。7. 扩展点无2.4.2用况名称:执行进程1. 简要说明 该用况描述管理员如何使用执行进程功能测试银行家算法。2. 事件流2.1 基本流1. 数据合法性检查 用户选择“执行进程”选项,系统对用户输入的合法性进行检查。2. 提示用户需要执行的进程编号 用户输入进程号。3. 数据合法性检查 对用户输入的数据进行合法性检查4. 输入进程请求向量 用户按照提示输入请求向量。5. 数据合法性检查 检查用户输入数据的合法性。6. 返回安全序列和各数据结构 系统处理进程的请求向量,并返回安全序列和数据结构。2.2 备选流 备选流一:在基本流步骤1中,规则检查不通过,提示输入数据不合法,请重新输入。 备选流二:在基本流步骤3中,规则检查不通过,提示输入数据不合法,请重新输入。 备选流三:在基本流步骤5中,规则检查不通过,提示输入数据不合法,请重新输入。 备选流四:在基本流步骤6中,规则检查不通过,提示输入的请求向量有问题,请进程等待。3. 用例场景3.1 成功场景进程成功被分配资源:基本流。3.2 失败场景数据合法性检查不通过:备选流一。数据合法性检查不通过:备选流二。数据合法性检查不通过:备选流三。数据不满足系统要求:备选流四。4. 特殊需求无5. 前置条件用户已创建进程。6. 后置条件 显示安全序列。 显示各数据结构信息。 显示输入数据有误,请重新输入。 显示系统资源不足进程需要等待。 显示系统处于不安全态,进程需要等待。7. 扩展点无三、总体设计3.1系统的分层模型图3.1系统分层模型图系统的分层模型如图3.1所示。交互层:主要功能是为了与用户进行交互,包括系统的初始化,创建多个进程,置进程的请求向量。交互逻辑层:负责将用户的交互信息与控制层交换。进程层:主要功能是为了创建进程,并交给控制层进行管理。控制层:负责管理进程与资源,是整个系统的核心部分,银行家算法与安全性算法均在这一层中。资源层:主要负责管理各种资源向量或矩阵。3.2系统部署 系统被部署在控制台运行。之所以选择控制台是因为可以让我们开发模拟系统的时候更加专注于业务,而不是花太多精力在非业务功能上。3.3系统的静态模型图3.2系统静态模型图模拟系统共有3个类、4中新的数据类型(其中4种新的数据类型用衍形加以定义)。1) _Resource类掌管全局的资源,各种数据结构都在其中定义,目的是要把操作与数据分离,便于程序的设计以及维护。其中M是资源的种类数,Available是可利用资源向量,Max是最大需求矩阵,Allocation是分配矩阵,Need是需求矩阵。2) _Process类是进程类,用来实例化进程。其中Request是需求向量。可用_Process来实例化任意个进程,从而使程序的扩展性、安全性以及结构都得到极大的提升。3) _Control类负责对系统现有的资源以及进程进行控制。其中add_Process方法负责将进程添加到控制类中,run_Process方法就是银行家算法,而safeChecked方法就是系统安全性算法。四、详细设计4.1交互层设计 由于系统是被部署在控制台上,所以交互层的实现比较简单。交互层的界面显示如图4.1所示。图4.1模拟系统选择菜单4.2交互逻辑层设计 交互逻辑层的作用是将用户的输入信息与控制层进行协作。vector<_Process>create(_Resource&r,_Control&c)(创建进程)的设计如图4.2所示。图4.2create函数流程图voidrun(vector<_Process>&p,_Resource&r,_Control&c)(执行进程)的设计如图4.3所示。图4.3run函数流程图voidout(vector<_Process>&p,_Resource&r,_Control&c)的设计如图4.4所示。图4.4out函数流程图4.3控制层设计_Control类的设计。voidadd_Process(_Process&p,_Resource&r)方法的设计如图4.5所示。图4.5add_Process方法流程图intrun_Process(_Process&p,intn,_Resource&r)(银行家算法)的设计如图4.6所示。图4.6银行家算法流程图boolsafeChecked(_Resource&r_2)(安全性算法)的设计如图4.7所示图4.7安全性算法流程图4.3进程层设计类_Process的设计voidinit(_Resource&r)方法的设计如图4.8所示。图4.8init方法的流程图4.4资源层设计类_Resource的设计 voidinit()方法的设计如图4.9所示。图4.9init方法的流程图五、系统实现系统的实现采用C++语言,并使用MicrosoftVisualStudio2010作为平台进行实现。5.1交互层的实现交互层被直接设计成main函数:intmain(){ _Resourcer; r.init(); _Controlc(r); vector<_Process>p; boolis=false; while(true){ intx; cout<<endl; cout<<"1.创建进程"<<endl; cout<<"2.执行一个进程"<<endl; cout<<"3.退出"<<endl; while(true){/*输入数据合法性检查*/ cin>>x; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(x<=0) { cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } switch(x){ case1:p=create(r,c),is=true;break; case2:if(is)run(p,r,c);else{cout<<"您还未创建进程!"<<endl;}break; case3:exit(0); default:cout<<"输入数据不合法,请重新输入!"<<endl; } //输出各矩阵的状态 out(p,r,c); } return0;}5.2交互逻辑层的实现1. vector<_Process>create(_Resource&r,_Control&c)(创建进程)的实现。 vector<_Process>create(_Resource&r,_Control&c){ cout<<"请输入需要创建的进程数目:"<<endl; inti; while(true){ /*输入数据合法性检查*/ cin>>i; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(i<=0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } vector<_Process>p; //进程初始化 _Processaaa; for(intj=0;j<i;j++){ p.push_back(aaa); } intx=0; for(vector<_Process>::iteratoriter=p.begin();iter!=p.end();iter++){ cout<<"P"<<x<<"初始化"<<endl; (*iter).init(r); x++; } //添加进程 for(vector<_Process>::size_typeindex=0;index!=p.size();index++){ c.add_Process(p[index],r); } //初始安全态检查 if(c.safeChecked(r)){;} else{ cout<<"系统初始状态不安全!"<<endl; system("pause"); exit(0); } returnp;}2. voidrun(vector<_Process>&p,_Resource&r,_Control&c)(执行进程)的实现 voidrun(vector<_Process>&p,_Resource&r,_Control&c){ inti; cout<<"请输入需要执行的进程号:"<<endl; while(true){ /*输入数据合法性检查*/ cin>>i; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(i<0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } cout<<"初始化第"<<i<<"个进程的请求向量:"<<endl; //置进程的资源请求向量 for(vector<int>::size_typesz=0;sz!=p[i].Request.size();sz++){ cout<<"请输入请求向量的第"<<sz<<"个值:"<<endl; intk; while(true){/*输入数据合法性检查*/ cin>>k; if(cin.fail()) { cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(k<=0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } p[i].Request[sz]=k; } c.run_Process(p[i],i,r);}3. voidout(vector<_Process>&p,_Resource&r,_Control&c)的实现。 voidout(vector<_Process>&p,_Resource&r,_Control&c){ //输出Available矩阵 cout<<"Available:"<<endl; for(vector<int>::size_typesz=0;sz!=r.Available.size();sz++){ cout<<r.Available[sz]<<""; } cout<<endl; //输出Max矩阵 cout<<"Max:"<<endl; for(vector<Max_row>::size_typei=0;i<r.Max.size();i++){ for(vector<int>::size_typesz=0;sz<r.Max[i].size();sz++){ cout<<r.Max[i][sz]<<""; } cout<<endl; } //Allocation矩阵 cout<<"Allocation:"<<endl; for(vector<Allocation_row>::size_typei=0;i<r.Allocation.size();i++){ for(vector<int>::size_typesz=0;sz<r.Allocation[i].size();sz++){ cout<<r.Allocation[i][sz]<<""; } cout<<endl; } //输出需求矩阵 cout<<"Need:"<<endl; for(vector<Need_row>::size_typei=0;i<r.Need.size();i++){ for(vector<int>::size_typesz=0;sz<r.Need[i].size();sz++){ cout<<r.Need[i][sz]<<""; } cout<<endl; }}5.3控制层的实现_Control类的实现。1. voidadd_Process(_Process&p,_Resource&r)方法的实现。 voidadd_Process(_Process&p,_Resource&r){ N++; //进程数加1 //置最大需求矩阵 Max_rowmr; for(vector<int>::iteratoriter=p.Request.begin();iter!=p.Request.end();iter++){ mr.push_back(*iter); } r.Max.push_back(mr); //置分配矩阵 Allocation_rowar; for(inti=0;i<r.getM();i++){ ar.push_back(0); } r.Allocation.push_back(ar); //置需求矩阵 Need_rownr; for(vector<int>::iteratoriter=p.Request.begin();iter!=p.Request.end();iter++){ nr.push_back(*iter); } r.Need.push_back(nr);}2. intrun_Process(_Process&p,intn,_Resource&r)(银行家算法)的设计如图4.6所示。intrun_Process(_Process&p,intn,_Resource&r){ //先判断Request<=Need booltemp_1=true; for(vector<int>::size_typeindex=0;index!=p.Request.size();index++){ if(p.Request[index]>r.Need[n][index]){ cout<<"请求出错!因为进程所需要的资源数已超过它所宣布的最大值。"<<endl; return1; } } //再判断Request<=Available for(vector<int>::size_typeindex=0;index!=p.Request.size();index++){ if(p.Request[index]>r.Available[index]) { cout<<"系统中尚无足够的资源,P"<<n<<"必须等待!"<<endl; return2; } } //进行试分配 _Resourcer_1=r; vector<int>::iteratoriter_2=r_1.Available.begin(); vector<int>::iteratoriter_3=r_1.Allocation[n].begin(); vector<int>::iteratoriter_4=r_1.Need[n].begin(); for(vector<int>::iteratoriter_1=p.Request.begin();iter_1!=p.Request.end();iter_1++){ //Available:=Available-Request *iter_2=*iter_2-*iter_1; //Allocation:=Allocation+Request *iter_3=*iter_3+*iter_1; //Need:=Need-Request *iter_4=*iter_4-*iter_1; //迭代器移向下一个元素 iter_2++; iter_3++; iter_4++; } //执行安全性检查 if(safeChecked(r_1)){ r=r_1; //判断此进程是否获得所有资源,若获得,则让其执行完毕后释放 booltemp=true; for(inti=0;i<r.getM();i++) { if(r.Need[n][i]!=0){ temp=false; break; } } if(temp){ //置最大需求矩阵 for(inti=0;i<r.getM();i++){ r.Max[n][i]=0; } //且置可利用资源向量 for(inti=0;i<r.getM();i++){ r.Available[i]+=r.Allocation[n][i]; r.Allocation[n][i]=0; } cout<<"进程P"<<n<<"执行完毕,已释放资源!"<<endl; } return0; } else{ cout<<"系统不处于安全态,P"<<n<<"进程需要等待"<<endl; return3; }}3. boolsafeChecked(_Resource&r_2)(安全性算法)的实现。 bool_Control::safeChecked(_Resource&r_2){ vector<int>Work; //初始化工作向量 for(vector<int>::iteratoriter=r_2.Available.begin();iter!=r_2.Available.end();iter++){ Work.push_back(*iter); } vector<bool>Finish; for(vector<Need_row>::iteratoriter=r_2.Need.begin();iter!=r_2.Need.end();iter++){ Finish.push_back(false); } //找出Finish[i]=false且Need<=Work的项step2: for(vector<int>::size_typei=0;i!=r_2.Need.size();i++){ if(!Finish[i]){ booltemp=false; for(vector<int>::size_typeindex=0;index!=Work.size();index++){ if(r_2.Need[i][index]<=Work[index]){ temp=true; } else{ temp=false; break; } } if(temp){ vector<int>::iteratoriter_2=r_2.Allocation[i].begin(); for(vector<int>::iteratoriter_1=Work.begin();iter_1!=Work.end();iter_1++){ *iter_1=*iter_1+*iter_2; iter_2++; } cout<<"P"<<i<<""; Finish[i]=true; gotostep2; //本来不应该使用goto语句,但由于在此使用goto语句更显方便,故破例用之 } } } //判断所有进程Finish是否都为true,是则返回true,否则返回false for(vector<bool>::size_typeindex=0;index!=Finish.size();index++){ if(Finish[index]); else returnfalse; } returntrue;}5.3进程层的实现类_Process的设计voidinit(_Resource&r)方法的实现。voidinit(_Resource&r){ for(inti=0;i<r.getM();i++){ inttemp; while(true){ /*输入数据合法性检查*/ cout<<"请输入第"<<i+1<<"类资源的需求量:"<<endl; cin>>temp; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(temp<=0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } Request.push_back(temp); }}5.4资源层的实现类_Resource的设计voidinit()方法的实现。void_Resource::init(){ while(true)/*输入数据合法性检查*/{ cout<<"请初始化系统资源种类数:"<<endl; cin>>M; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(M<=0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } for(inti=0;i<M;i++) { inttemp; while(true){/*输入数据合法性检查*/ cout<<"请初始化系统中第"<<i+1<<"类资源的数目:"<<endl; cin>>temp; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(temp<=0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } Available.push_back(temp); }}六、测试与分析本测试均采用黑盒测试6.1系统资源初始化测试测试用例预期结果实际结果请输入资源种类数:任意非数字字符1.应提示“输入数据不和法,请重新输入!”请输入资源种类数:负整数1.应提示“输入数据不和法,请重新输入!”6.2系统资源初始状态的设置Available={7,5,3}具体的设置如图6.1所示。图6.1初始资源的设置6.3进程初始化测试测试用例预期结果实际结果请输入你所需要创建的进程数:31.不应提示错误信息初始化各类资源需求量P0的Request={4,4,4}P1的Request={1,1,1}P2的Request={1,1,1}应提示“系统初始状态不安全!”提示“按任意键退出系统…”6.4进程初始化设置P0的Request={1,2,3}P1的Request={1,2,2}P2的Request={1,2,2}6.5执行进程测试测试用例预期结果实际结果请输入你所需要执行的进程号:0并置Request={4,4,4}1.应提示请求出错信息,所需的资源超过其所宣布的最大值请输入你所需要执行的进程号:1并置Request={1,1,1}应直接输出安全序列输出各数据结构现状请输入你所需要执行的进程号:0并置Request={1,2,3}应提示系统资源不足,P0进程需等待输出各数据结构现状请输入你所需要执行的进程号:0并置Request={1,2,2}应提示系统处于不安全态,P0进程需等待输出各数据结构现状请输入你所需要执行的进程号:1并置Request={0,1,1}输出安全序列提示进程P1执行完毕并释放资源输出各数据结构现状课程设计总结在这次的课程设计中,我发现大多数情况下我们在做一个项目时,并不是一开始就具备完成这项项目的所有知识。这就要求我们学会怎样去快速的学会做项目所需要的全部知识。遇到有些不会处理的,我会上网去查,查一些对象、容器的用法,如vector等容器。以前我对这些对象或容器的用法并不是太熟悉,但现在我不仅掌握了他们的使用方法,更重要的是我学会了如何去学习,然后快速地应用到我所需要的项目当中。在做这个银行家算法模拟系统时,我把它当作了一个产品去做,所以每个细节考虑的虽不完全,但也周到。但这并不能说明什么,因为很多软件都是通过升级的方式来弥补自身的缺陷,我的银行家算法模拟系统也是如此。在使用之中发现问题后再去积极的修改问题,使得软件越来越完善。而且只有这样才是软件开发必经之路,因为没有什么事物一生下来就是完美的,都是在通过追求卓越的过程中完善自己,继而达到巅峰的。在这次的课程设计中我还领悟了一个重大的问题:在开发一个软件的过程中,把整个系统的框架准确的描述出来是非常重要的。因为我们后面的编码式样在整个系统框架的基础之上进行的,如果系统框架在搭建的时候出现了模块的冲突,那会影响整个软件开发的进度,最终就会引发软件危机。而这是我们所不希望看到的。所以,在软件开发之前,一定要详细的讨论整个系统的框架,确保合理的情况下再进行下一步工作,严格的把开发软件真正的当成一项工程来对待。在编码方面,我发现良好的代码风格是成功的一半。在编码的过程中需要时常进行修改,如果程序的可读性不强,代码量又庞大的话,那么对于编码人员来说是一件非常不幸的事情,因为他必须时常让他的大脑工作在“超频”状态,这样总有一天会“烧掉”的。所以养成良好的代码书写风格是非常重要的。总而言之,通过一次的课程设计,不仅对这门课程的知识掌握更加牢固了,还学到了关于以后从事计算机方面工作的一些方法论。最后,用一句话总结这次的课程设计——收获多多。参考文献[1]汤子瀛,z哲凤屏,汤小丹.计算机操作系统[M].西安:西安电子科技大学出版社,2002年2月.[2]GradyBooch,JamesRumbaugh,IvarJackbson.UML用户指南(第2版)[M].北京:人民邮电出版社,2006年6月.[3]张海藩.软件工程导论(第5版)[M].北京:清华大学出版社,2008年8月.附录A源程序清单:_Control.h文件#pragmaonce#include"_Resource.h"#include"_Process.h"class_Control{private: intN; //进程的个数_Resource&r;public: _Control(_Resource&r); ~_Control(void); voidadd_Process(_Process&p,_Resource&r); //增加一个新的进程 voiddec_Process(); //删除一个进程 intrun_Process(_Process&p,intn,_Resource&r); //开始执行进程(银行家算法) boolsafeChecked(_Resource&r_2); //安全性检查程序};_Control.cpp文件#include"_Control.h"#include<iostream>usingstd::cout;usingstd::cin;usingstd::endl;_Control::_Control(_Resource&r){ N=0;}_Control::~_Control(void){}void_Control::add_Process(_Process&p,_Resource&r){ N++; //进程数加1 //置最大需求矩阵 Max_rowmr; for(vector<int>::iteratoriter=p.Request.begin();iter!=p.Request.end();iter++){ mr.push_back(*iter); } r.Max.push_back(mr); //置分配矩阵 Allocation_rowar; for(inti=0;i<r.getM();i++){ ar.push_back(0); } r.Allocation.push_back(ar); //置需求矩阵 Need_rownr; for(vector<int>::iteratoriter=p.Request.begin();iter!=p.Request.end();iter++){ nr.push_back(*iter); } r.Need.push_back(nr);}int_Control::run_Process(_Process&p,intn,_Resource&r){ //先判断Request<=Need booltemp_1=true; for(vector<int>::size_typeindex=0;index!=p.Request.size();index++){ if(p.Request[index]>r.Need[n][index]){ cout<<"请求出错!因为进程所需要的资源数已超过它所宣布的最大值。"<<endl; return1; } } //再判断Request<=Available for(vector<int>::size_typeindex=0;index!=p.Request.size();index++){ if(p.Request[index]>r.Available[index]){ cout<<"系统中尚无足够的资源,P"<<n<<"必须等待!"<<endl; return2; } } //进行试分配 _Resourcer_1=r; vector<int>::iteratoriter_2=r_1.Available.begin(); vector<int>::iteratoriter_3=r_1.Allocation[n].begin(); vector<int>::iteratoriter_4=r_1.Need[n].begin(); for(vector<int>::iteratoriter_1=p.Request.begin();iter_1!=p.Request.end();iter_1++){ //Available:=Available-Request *iter_2=*iter_2-*iter_1; //Allocation:=Allocation+Request *iter_3=*iter_3+*iter_1; //Need:=Need-Request *iter_4=*iter_4-*iter_1; //迭代器移向下一个元素 iter_2++; iter_3++; iter_4++; } //执行安全性检查 if(safeChecked(r_1)){ r=r_1; //判断此进程是否获得所有资源,若获得,则让其执行完毕后释放 booltemp=true; for(inti=0;i<r.getM();i++){ if(r.Need[n][i]!=0){ temp=false; break; } } if(temp){ //置最大需求矩阵 for(inti=0;i<r.getM();i++){ r.Max[n][i]=0; } //且置可利用资源向量 for(inti=0;i<r.getM();i++){ r.Available[i]+=r.Allocation[n][i]; r.Allocation[n][i]=0; } cout<<"进程P"<<n<<"执行完毕,已释放资源!"<<endl; } return0; } else{ cout<<"系统不处于安全态,P"<<n<<"进程需要等待"<<endl; return3; }}bool_Control::safeChecked(_Resource&r_2){ vector<int>Work; //初始化工作向量 for(vector<int>::iteratoriter=r_2.Available.begin();iter!=r_2.Available.end();iter++){ Work.push_back(*iter); } vector<bool>Finish; for(vector<Need_row>::iteratoriter=r_2.Need.begin();iter!=r_2.Need.end();iter++){ Finish.push_back(false); } //找出Finish[i]=false且Need<=Work的项step2: for(vector<int>::size_typei=0;i!=r_2.Need.size();i++){ if(!Finish[i]){ booltemp=false; for(vector<int>::size_typeindex=0;index!=Work.size();index++){ if(r_2.Need[i][index]<=Work[index]){ temp=true; } else{ temp=false; break; } } if(temp){ vector<int>::iteratoriter_2=r_2.Allocation[i].begin(); for(vector<int>::iteratoriter_1=Work.begin();iter_1!=Work.end();iter_1++){ *iter_1=*iter_1+*iter_2; iter_2++; } cout<<"P"<<i<<""; Finish[i]=true; gotostep2; //本来不应该使用goto语句,但由于在此使用goto语句更显方便,故破例用之 } } } //判断所有进程Finish是否都为true,是则返回true,否则返回false for(vector<bool>::size_typeindex=0;index!=Finish.size();index++){ if(Finish[index]); else returnfalse; } returntrue;}_Process.h文件#pragmaonce#include<vector>#include"_Resource.h"usingstd::vector;class_Process{public: _Process(void); ~_Process(void); vector<int>Request; //进程的请求向量 voidinit(_Resource&r); //初始化进程信息};_Process.cpp文件#include"_Process.h"#include<iostream>usingstd::cout;usingstd::cin;usingstd::endl;_Process::_Process(void){}_Process::~_Process(void){}void_Process::init(_Resource&r){ for(inti=0;i<r.getM();i++){ inttemp; while(true){ /*输入数据合法性检查*/ cout<<"请输入第"<<i+1<<"类资源的需求量:"<<endl; cin>>temp; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(temp<=0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } Request.push_back(temp); }}_Resource.h文件#pragmaonce#include<vector>usingstd::vector;typedefvector<int>Max_row;typedefvector<int>Allocation_row;typedefvector<int>Need_row;class_Resource{private: intM; //资源的种类数public: _Resource(void); ~_Resource(void); vector<int>Available; //可利用资源向量 vector<Max_row>Max; //最大需求矩阵 vector<Allocation_row>Allocation; //分配矩阵 vector<Need_row>Need; //需求矩阵 voidinit(); //初始化资源 intgetM();};_Resource.cpp文件#include"_Resource.h"#include<iostream>#include<stdexcept>#include<string>usingstd::cout;usingstd::cin;usingstd::endl;usingstd::string;usingstd::exception;usingstd::invalid_argument;_Resource::_Resource(void){}_Resource::~_Resource(void){}int_Resource::getM(){ returnM;}void_Resource::init(){ while(true){/*输入数据合法性检查*/ cout<<"请初始化系统资源种类数:"<<endl; cin>>M; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(M<=0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } for(inti=0;i<M;i++){ inttemp; while(true)/*输入数据合法性检查*/{ cout<<"请初始化系统中第"<<i+1<<"类资源的数目:"<<endl; cin>>temp; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(temp<=0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } Available.push_back(temp); }}main.cpp文件#include"_Resource.h"#include"_Process.h"#include"_Control.h"#include<iostream>usingnamespacestd;vector<_Process>create(_Resource&r,_Control&c){ cout<<"请输入需要创建的进程数目:"<<endl; inti; while(true){ /*输入数据合法性检查*/ cin>>i; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(i<=0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } vector<_Process>p; //进程初始化 _Processaaa; for(intj=0;j<i;j++){ p.push_back(aaa); } intx=0; for(vector<_Process>::iteratoriter=p.begin();iter!=p.end();iter++){ cout<<"P"<<x<<"初始化"<<endl; (*iter).init(r); x++; } //添加进程 for(vector<_Process>::size_typeindex=0;index!=p.size();index++){ c.add_Process(p[index],r); } //初始安全态检查 if(c.safeChecked(r)){;} else{ cout<<"系统初始状态不安全!"<<endl; system("pause"); exit(0); } returnp;}voidrun(vector<_Process>&p,_Resource&r,_Control&c){ inti; cout<<"请输入需要执行的进程号:"<<endl; while(true){ /*输入数据合法性检查*/ cin>>i; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(i<0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } cout<<"初始化第"<<i<<"个进程的请求向量:"<<endl; //置进程的资源请求向量 for(vector<int>::size_typesz=0;sz!=p[i].Request.size();sz++){ cout<<"请输入请求向量的第"<<sz<<"个值:"<<endl; intk; while(true)/*输入数据合法性检查*/{ cin>>k; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(k<0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } p[i].Request[sz]=k; } c.run_Process(p[i],i,r);}voidout(vector<_Process>&p,_Resource&r,_Control&c){ //输出Available矩阵 cout<<"Available:"<<endl; for(vector<int>::size_typesz=0;sz!=r.Available.size();sz++){ cout<<r.Available[sz]<<""; } cout<<endl; //输出Max矩阵 cout<<"Max:"<<endl; for(vector<Max_row>::size_typei=0;i<r.Max.size();i++){ for(vector<int>::size_typesz=0;sz<r.Max[i].size();sz++){ cout<<r.Max[i][sz]<<""; } cout<<endl; } //Allocation矩阵 cout<<"Allocation:"<<endl; for(vector<Allocation_row>::size_typei=0;i<r.Allocation.size();i++){ for(vector<int>::size_typesz=0;sz<r.Allocation[i].size();sz++){ cout<<r.Allocation[i][sz]<<""; } cout<<endl; } //输出需求矩阵 cout<<"Need:"<<endl; for(vector<Need_row>::size_typei=0;i<r.Need.size();i++){ for(vector<int>::size_typesz=0;sz<r.Need[i].size();sz++){ cout<<r.Need[i][sz]<<""; } cout<<endl; }}intmain(){ _Resourcer; r.init(); _Controlc(r); vector<_Process>p; boolis=false; while(true){ intx; cout<<endl; cout<<"1.创建进程"<<endl; cout<<"2.执行一个进程"<<endl; cout<<"3.退出"<<endl; while(true)/*输入数据合法性检查*/{ cin>>x; if(cin.fail()){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(x<=0){ cout<<"您输入的数据不合法,请重新输入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } switch(x){ case1:p=create(r,c),is=true;break; case2:if(is)run(p,r,c);else{cout<<"您还未创建进程!"<<endl;}break; case3:exit(0); default:cout<<"输入数据不合法,请重新输入!"<<endl; } //输出各矩阵的状态 out(p,r,c); } return0;}

项目经济效益和社会效益分析(参考)8.1经济效益分析8.1.1⑴国家发展改革委员会与建设部发布、中国计划出版社出版的《建设项目经济评价方法与参数》(第三版)。⑵本项目投入、产出物为含税价格,增值税按有关规定计算,其附加税费包括城市维护建设税、教育费附加费和地方教育费附加,分别按应缴增值税额的5%、3%和1%计取;企业所得税率为:2010年为22%、2011年为24%、2012及以后年为25%。⑶财务基准收益率按10%考虑。⑷项目计算期和生产负荷本项目计算期按10年考虑(含建设期2年)。根据项目产品市场情况预计,投产后的生产负荷估计如下:第3年投产,达产率为70%,第4年达产率为85%,第5年及以后达产率为100%。8.1.2产品销售收入与销售税金及附加估算⑴产品规模及产品销售价格本项目产品为XXXXXXX,达产年的产品规模及预计产品销售价格见表8-1。表8-1产品规模及销售价格序号产品名称产品规模(万支)销售价格(含税)(元/支)1XXXXXXXX2XXXXXXX⑵产品销售收入及税金达产年可实现产品销售收入XXXXX万元,年上缴产品销售税金及附加XXX万元,应缴增值税XXXXX万元。产品销售收入与销售税金及附加估算见表8-2。8.1.3总成本费用估算⑴外购原辅材料估算本项目产品的主要原材料为注塑件、五金件、电子元器件、灯管等。辅料为焊锡、助焊剂及白胶等。预计达产年合计年外购原辅材料费为XXXXX万元。见表8-3。⑵外购燃料及动力费估计预计达产年外购燃料及动力费为114.80万元,见表8-3。⑶人员工资及福利费估算本项目定员1500人,年工资福利费支出为2,532.60万元。⑷修理费本项目修理费按固定资产原值的2%估计。⑸折旧费和摊销费本项目折旧方法采用直线折旧法,设备折旧按10年计,残值率分别为5%和3%。详见表8-4。⑹技术研发费技术研发费用按销售收入的2%估计。⑺其它费用其它费用包括其它制造费用、其它管理费用和其它销售费用。其它制造费用按产品销售收入的3%估计;其它管理费用按管理技术员定额数3万元/人估计。其它销售费用按产品销售收入的4%估计。⑻财务费用本项目达产年总成本费用为XXX万元,其中:可变成本XXX万元,固定成本XXX万元;年经营成本为XXX万元。总成本费用估算见表8-3。8.1.4利润估算该项目实施后,达产年可实现总产值20,000.00万元,年利润总额为2179.52万元,年上缴税金2119.30万元,年税后利润1634.64万元(详见表8-5)。计算期内年均利润总额1875.12万元。总投资收益率ROI为75%。由上述指标可以看出,项目具有很好的投资收益。8.1.5项目盈利能力分析项目现金流量计算见表8-6。经计算,本项目有关的财务盈利指标如下:项目所得税前财务内部收益率FIRR为29.69%,财务净现值FNPV(ic=10%)为6221.33万元,静态投资回收期为4.30年(含建设期2年)。项目所得税后财务内部收益率为23.69%,财务净现值(ic=10%)为4437.93万元,静态投资回收期为4.62年(含建设期2年)。上述指标表明,本项目能获得较好的投资收益率,项目在财务上是可行的。8.1.6本项目还贷资金来源主要有可供分配利润、折旧与摊销费。按项目最大还款能力计算,本项目可在2.52年(含建设期)内可偿还全部贷款。项目还本付息情况详见表8-7。8.1.7不确定性分析以设计生产能力利用率来表示项目的盈亏平衡点BEP,即=本项目只要生产能力利用率达到设计生产能力的56.28%就能够保本经营而不发生亏损。表8-2销售收入估算表单位:万元序号项目单位/税率合计3456789101生产负荷70%85%100%100%100%100%100%100%产品销售收入151,000.0014,000.0017,000.0020,000.0020,000.0020,000.0020,000.0020,000.0020,000.001.126W以上60,400.005,600.006,800.008,000.008,000.008,000.008,000.008,000.008,000.00产量万支350.00425.00500.00500.00500.00500.00500.00500.00售价元/支16.0016.0016.0016.0016.0016.0016.0016.001.226W以下90,600.008,400.0010,200.0012,000.0012,000.0012,000.0012,000.0012,000.0012,000.00产量万支1,050.001,275.001,500.001,500.001,500.001,500.001,500.001,500.00售价元/支8.008.008.008.008.008.008.008.001.3销项税17%25,670.002,380.002,890.003,400.003,400.003,400.003,400.003,400.003,400.002销售税金及附加981.4891.00110.50130.00130.00130.00130.00130.00130.002.1城市维护建设税5%545.2750.5561.3972.2272.2272.2272.2272.2272.222.2教育费附加3%327.1630.3336.8343.3343.3343.3343.3343.3343.332.3地方教育费附加1%109.0510.1112.2814.4414.4414.4414.4414.4414.443增值税10,905.341,011.091,227.751,444.421,444.421,444.421,444.421,444.421,444.423.1销项税25,670.002,380.002,890.003,400.003,400.003,400.003,400.003,400.003,400.003.2进项税14,764.661,368.911,662.251,955.581,955.581,955.581,955.581,955.581,955.58

表8-3总成本费用估算表单位:万元序号项目单位/税率合计345678910生产负荷70%85%100%100%100%100%100%100%1外购原辅材料、包装材料费85,828.407,957.609,662.8011,368.0011,368.0011,368.0011,368.0011,368.0011,368.001.1原、辅材料85,088.507,889.009,579.5011,270.0011,270.0011,270.0011,270.0011,270.0011,270.001.2包装物739.9068.6083.3098.0098.0098.0098.0098.0098.00进项税17%14,590.831,352.791,642.681,932.561,932.561,932.561,932.561,932.561,932.562外购燃料及动力费866.7480.3697.58114.80114.80114.80114.80114.80114.80进项税小计143.1213.2716.1118.9618.9618.9618.9618.9618.962.1电761.0470.5685.68100.80100.80100.80100.80100.80100.80进项税17%129.3812.0014.5717.1417.1417.1417.1417.1417.142.2水105.709.8011.9014.0014.0014.0014.0014.0014.00进项税13%13.741.271.551.821.821.821.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论