操作系統(tǒng)課程設(shè)計(jì)(銀行家算法)_第1頁(yè)
操作系統(tǒng)課程設(shè)計(jì)(銀行家算法)_第2頁(yè)
操作系統(tǒng)課程設(shè)計(jì)(銀行家算法)_第3頁(yè)
操作系統(tǒng)課程設(shè)計(jì)(銀行家算法)_第4頁(yè)
操作系統(tǒng)課程設(shè)計(jì)(銀行家算法)_第5頁(yè)
已閱讀5頁(yè),還剩49頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

《操作系統(tǒng)課程設(shè)計(jì)》題目:銀行家算法的設(shè)計(jì)與實(shí)現(xiàn)院、系:計(jì)算機(jī)信息與技術(shù)系學(xué)科專業(yè):計(jì)算機(jī)科學(xué)與技術(shù)學(xué)號(hào):B10060123學(xué)生姓名:徐飛指導(dǎo)教師:姜虹×××2012年06月目錄一、緒論 1二、需求分析 22.1銀行家算法的描述 22.2銀行家算法模擬系統(tǒng)流程圖 32.3模擬系統(tǒng)用況分析 42.4模擬系統(tǒng)用況規(guī)約 42.4.1用況名稱:創(chuàng)建進(jìn)程 42.4.2用況名稱:執(zhí)行進(jìn)程 5三、總體設(shè)計(jì) 73.1系統(tǒng)的分層模型 73.2系統(tǒng)部署 73.3系統(tǒng)的靜態(tài)模型 8四、詳細(xì)設(shè)計(jì) 94.1交互層設(shè)計(jì) 94.2交互邏輯層設(shè)計(jì) 94.3控制層設(shè)計(jì) 114.3進(jìn)程層設(shè)計(jì) 124.4資源層設(shè)計(jì) 12五、系統(tǒng)實(shí)現(xiàn) 145.1交互層的實(shí)現(xiàn) 145.2交互邏輯層的實(shí)現(xiàn) 155.3控制層的實(shí)現(xiàn) 185.3進(jìn)程層的實(shí)現(xiàn) 215.4資源層的實(shí)現(xiàn) 22六、測(cè)試與分析 246.1系統(tǒng)資源初始化測(cè)試 246.2系統(tǒng)資源初始狀態(tài)的設(shè)置 246.3進(jìn)程初始化測(cè)試 246.4進(jìn)程初始化設(shè)置 256.5執(zhí)行進(jìn)程測(cè)試 25課程設(shè)計(jì)總結(jié) 26參考文獻(xiàn) 27附錄A 28一、緒論在具有多道程序并發(fā)執(zhí)行能力的系統(tǒng)中,系統(tǒng)資源的利用率、進(jìn)程執(zhí)行的效率都大幅增加,但可能發(fā)生“死鎖”的危險(xiǎn)。所謂死鎖,是指多個(gè)進(jìn)程因競(jìng)爭(zhēng)資源而造成的一種僵局,若無(wú)外力作用,這些進(jìn)程都將永遠(yuǎn)不能再向前推進(jìn)。而死鎖產(chǎn)生的原因有兩點(diǎn):競(jìng)爭(zhēng)資源和進(jìn)程推進(jìn)的順序不合法。為了避免死鎖,使得進(jìn)程的執(zhí)行能夠順利完成,引入銀行家算法進(jìn)行解決。銀行家算法是具有代表性的避免死鎖的算法,由于該算法能用于銀行系統(tǒng)現(xiàn)金貸款的發(fā)放而得名。銀行家算法包含三個(gè)方面的內(nèi)容:相應(yīng)的數(shù)據(jù)結(jié)構(gòu)。銀行家算法。安全性算法。其中相應(yīng)的數(shù)據(jù)結(jié)構(gòu)定義了銀行家算法中需要使用的若干數(shù)據(jù)結(jié)構(gòu),銀行家算法操作數(shù)據(jù)結(jié)構(gòu)以為安全性算法提供檢測(cè)現(xiàn)場(chǎng),安全性算法則是檢測(cè)現(xiàn)場(chǎng)是否出于安全態(tài)。 系統(tǒng)的安全狀態(tài)是指能夠按照某種順序,來(lái)為每個(gè)進(jìn)程分配其所需資源,直至最大需求,使每個(gè)進(jìn)程都可順序完成。若系統(tǒng)不存在這樣一個(gè)安全序列,則稱系統(tǒng)出于不安全狀態(tài)。二、需求分析問(wèn)題描述:銀行家算法是避免死鎖的有效辦法,為了驗(yàn)證銀行家算法可以避免死鎖,需要編寫程序模擬銀行家算法并加以驗(yàn)證。2.1銀行家算法的描述銀行家算法所涉及的數(shù)據(jù)結(jié)構(gòu):可利用資源向量Avaliable它是一個(gè)vector向量,可被初始化任意長(zhǎng)度,其中每一個(gè)元素代表一類可利用資源的數(shù)目。其值隨著該類資源的分配和回收而動(dòng)態(tài)的改變。最大需求矩陣Max這是一個(gè)n×m的矩陣,他定義了系統(tǒng)中n個(gè)進(jìn)程中的每一個(gè)進(jìn)程對(duì)m類資源的最大需求。分配矩陣Allocation這是一個(gè)n×m的矩陣,他定義了系統(tǒng)中每一類資源當(dāng)前已分配給每一進(jìn)程的資源數(shù)。需求矩陣Need它是一個(gè)n×m的矩陣,用以表示每一個(gè)進(jìn)程尚需的各類資源數(shù)。 以上三個(gè)矩陣間存在下述關(guān)系:Need=Max-Allocation 銀行家算法: 設(shè)Request是某一進(jìn)程的請(qǐng)求向量。當(dāng)進(jìn)程發(fā)出請(qǐng)求后,系統(tǒng)按下列步驟進(jìn)行檢查:如果Request≤Need,則轉(zhuǎn)向步驟2;否則認(rèn)為出錯(cuò),因?yàn)樗枰馁Y源數(shù)已超過(guò)他所宣布的最大值。如果Request≤Avaliable,則轉(zhuǎn)向步驟3;否則表示系統(tǒng)中尚無(wú)足夠的資源,進(jìn)程必須等待。系統(tǒng)進(jìn)行試分配:Avaliable=Avaliable-RequestAllocation=Allocation=RequestNeed=Need-Request4) 系統(tǒng)執(zhí)行安全性檢查,若系統(tǒng)處于安全態(tài),則正式將資源分配給進(jìn)程;若處于不安全態(tài),則將此次分配作廢,回滾到分配前的狀態(tài),并通知進(jìn)程等待。安全性算法: 1) 設(shè)置兩個(gè)工作向量 eq\o\ac(○,1)工作向量Work。他表示系統(tǒng)可提供給進(jìn)程繼續(xù)運(yùn)行所需要的各類資源數(shù)目,他含有m個(gè)元素,執(zhí)行安全性算法開(kāi)始時(shí),Work=Avaliable。 eq\o\ac(○,2)Finish。他表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之運(yùn)行完成,初始狀態(tài)為Finish[i]=false;當(dāng)有足夠資源分配給進(jìn)程時(shí),F(xiàn)inish[i]=true。 2) 從進(jìn)程集合中找到一個(gè)能滿足下列條件的進(jìn)程: eq\o\ac(○,1)Finish[i]=false eq\o\ac(○,2)Need≤Work 如找到,執(zhí)行步驟3,否則,執(zhí)行步驟4 3) 當(dāng)某一進(jìn)程獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給他的資源,故應(yīng)執(zhí)行: Work=Work+Allocation Finish[i]=true Gotostep2 4) 如果所有進(jìn)程的Finish[i]=true,則表示系統(tǒng)處于安全狀態(tài);否則系統(tǒng)處于不安全狀態(tài)。2.2銀行家算法模擬系統(tǒng)流程圖銀行家算法模擬系統(tǒng)流程圖如圖2.1所示圖2.1系統(tǒng)流程圖2.3模擬系統(tǒng)用況分析銀行家算法模擬系統(tǒng)的用況圖如圖2.2所示圖2.2模擬系統(tǒng)用況圖2.4模擬系統(tǒng)用況規(guī)約2.4.1用況名稱:創(chuàng)建進(jìn)程1. 簡(jiǎn)要說(shuō)明 該用況描述用戶如何通過(guò)使用模擬系統(tǒng)進(jìn)行創(chuàng)建進(jìn)程的工作。2. 事件流2.1 基本流1. 數(shù)據(jù)合法性檢查 用戶選擇“創(chuàng)建進(jìn)程”選項(xiàng),系統(tǒng)對(duì)用戶輸入的合法性進(jìn)行檢查。2. 提示用戶輸入創(chuàng)建進(jìn)程的個(gè)數(shù) 用戶輸入進(jìn)程的個(gè)數(shù)。3. 數(shù)據(jù)合法性檢查 對(duì)用戶輸入的數(shù)據(jù)進(jìn)行合法性檢查4. 初始化進(jìn)程所需的資源量 提示用戶輸入進(jìn)程所需的資源量。5. 數(shù)據(jù)合法性檢查 對(duì)用戶輸入的數(shù)據(jù)進(jìn)行合法性檢查2.2 備選流 備選流一:在基本流步驟1中,規(guī)則檢查不通過(guò),提示輸入數(shù)據(jù)不合法,請(qǐng)重新輸入。 備選流二:在基本流步驟3中,規(guī)則檢查不通過(guò),提示輸入數(shù)據(jù)不合法,請(qǐng)重新輸入。 備選流三:在基本流步驟5中,規(guī)則檢查不通過(guò),提示輸入數(shù)據(jù)不合法,請(qǐng)重新輸入。3. 用例場(chǎng)景3.1 成功場(chǎng)景 成功初始化進(jìn)程信息:基本流。3.2 失敗場(chǎng)景 數(shù)據(jù)合法性檢查不通過(guò):備選流一。 數(shù)據(jù)合法性檢查不通過(guò):備選流二。 數(shù)據(jù)合法性檢查不通過(guò):備選流三。4. 特殊需求無(wú)5. 前置條件用戶已初始化系統(tǒng)。6. 后置條件 顯示安全序列。 顯示各數(shù)據(jù)結(jié)構(gòu)信息。 顯示輸入數(shù)據(jù)有誤,請(qǐng)重新輸入。 顯示系統(tǒng)初始狀態(tài)處于不安全態(tài),進(jìn)程創(chuàng)建失敗,并退出系統(tǒng)。7. 擴(kuò)展點(diǎn)無(wú)2.4.2用況名稱:執(zhí)行進(jìn)程1. 簡(jiǎn)要說(shuō)明 該用況描述管理員如何使用執(zhí)行進(jìn)程功能測(cè)試銀行家算法。2. 事件流2.1 基本流1. 數(shù)據(jù)合法性檢查 用戶選擇“執(zhí)行進(jìn)程”選項(xiàng),系統(tǒng)對(duì)用戶輸入的合法性進(jìn)行檢查。2. 提示用戶需要執(zhí)行的進(jìn)程編號(hào) 用戶輸入進(jìn)程號(hào)。3. 數(shù)據(jù)合法性檢查 對(duì)用戶輸入的數(shù)據(jù)進(jìn)行合法性檢查4. 輸入進(jìn)程請(qǐng)求向量 用戶按照提示輸入請(qǐng)求向量。5. 數(shù)據(jù)合法性檢查 檢查用戶輸入數(shù)據(jù)的合法性。6. 返回安全序列和各數(shù)據(jù)結(jié)構(gòu) 系統(tǒng)處理進(jìn)程的請(qǐng)求向量,并返回安全序列和數(shù)據(jù)結(jié)構(gòu)。2.2 備選流 備選流一:在基本流步驟1中,規(guī)則檢查不通過(guò),提示輸入數(shù)據(jù)不合法,請(qǐng)重新輸入。 備選流二:在基本流步驟3中,規(guī)則檢查不通過(guò),提示輸入數(shù)據(jù)不合法,請(qǐng)重新輸入。 備選流三:在基本流步驟5中,規(guī)則檢查不通過(guò),提示輸入數(shù)據(jù)不合法,請(qǐng)重新輸入。 備選流四:在基本流步驟6中,規(guī)則檢查不通過(guò),提示輸入的請(qǐng)求向量有問(wèn)題,請(qǐng)進(jìn)程等待。3. 用例場(chǎng)景3.1 成功場(chǎng)景進(jìn)程成功被分配資源:基本流。3.2 失敗場(chǎng)景數(shù)據(jù)合法性檢查不通過(guò):備選流一。數(shù)據(jù)合法性檢查不通過(guò):備選流二。數(shù)據(jù)合法性檢查不通過(guò):備選流三。數(shù)據(jù)不滿足系統(tǒng)要求:備選流四。4. 特殊需求無(wú)5. 前置條件用戶已創(chuàng)建進(jìn)程。6. 后置條件 顯示安全序列。 顯示各數(shù)據(jù)結(jié)構(gòu)信息。 顯示輸入數(shù)據(jù)有誤,請(qǐng)重新輸入。 顯示系統(tǒng)資源不足進(jìn)程需要等待。 顯示系統(tǒng)處于不安全態(tài),進(jìn)程需要等待。7. 擴(kuò)展點(diǎn)無(wú)三、總體設(shè)計(jì)3.1系統(tǒng)的分層模型圖3.1系統(tǒng)分層模型圖系統(tǒng)的分層模型如圖3.1所示。交互層:主要功能是為了與用戶進(jìn)行交互,包括系統(tǒng)的初始化,創(chuàng)建多個(gè)進(jìn)程,置進(jìn)程的請(qǐng)求向量。交互邏輯層:負(fù)責(zé)將用戶的交互信息與控制層交換。進(jìn)程層:主要功能是為了創(chuàng)建進(jìn)程,并交給控制層進(jìn)行管理??刂茖樱贺?fù)責(zé)管理進(jìn)程與資源,是整個(gè)系統(tǒng)的核心部分,銀行家算法與安全性算法均在這一層中。資源層:主要負(fù)責(zé)管理各種資源向量或矩陣。3.2系統(tǒng)部署 系統(tǒng)被部署在控制臺(tái)運(yùn)行。之所以選擇控制臺(tái)是因?yàn)榭梢宰屛覀冮_(kāi)發(fā)模擬系統(tǒng)的時(shí)候更加專注于業(yè)務(wù),而不是花太多精力在非業(yè)務(wù)功能上。3.3系統(tǒng)的靜態(tài)模型圖3.2系統(tǒng)靜態(tài)模型圖模擬系統(tǒng)共有3個(gè)類、4中新的數(shù)據(jù)類型(其中4種新的數(shù)據(jù)類型用衍形加以定義)。1) _Resource類掌管全局的資源,各種數(shù)據(jù)結(jié)構(gòu)都在其中定義,目的是要把操作與數(shù)據(jù)分離,便于程序的設(shè)計(jì)以及維護(hù)。其中M是資源的種類數(shù),Available是可利用資源向量,Max是最大需求矩陣,Allocation是分配矩陣,Need是需求矩陣。2) _Process類是進(jìn)程類,用來(lái)實(shí)例化進(jìn)程。其中Request是需求向量。可用_Process來(lái)實(shí)例化任意個(gè)進(jìn)程,從而使程序的擴(kuò)展性、安全性以及結(jié)構(gòu)都得到極大的提升。3) _Control類負(fù)責(zé)對(duì)系統(tǒng)現(xiàn)有的資源以及進(jìn)程進(jìn)行控制。其中add_Process方法負(fù)責(zé)將進(jìn)程添加到控制類中,run_Process方法就是銀行家算法,而safeChecked方法就是系統(tǒng)安全性算法。四、詳細(xì)設(shè)計(jì)4.1交互層設(shè)計(jì) 由于系統(tǒng)是被部署在控制臺(tái)上,所以交互層的實(shí)現(xiàn)比較簡(jiǎn)單。交互層的界面顯示如圖4.1所示。圖4.1模擬系統(tǒng)選擇菜單4.2交互邏輯層設(shè)計(jì) 交互邏輯層的作用是將用戶的輸入信息與控制層進(jìn)行協(xié)作。vector<_Process>create(_Resource&r,_Control&c)(創(chuàng)建進(jìn)程)的設(shè)計(jì)如圖4.2所示。圖4.2create函數(shù)流程圖voidrun(vector<_Process>&p,_Resource&r,_Control&c)(執(zhí)行進(jìn)程)的設(shè)計(jì)如圖4.3所示。圖4.3run函數(shù)流程圖voidout(vector<_Process>&p,_Resource&r,_Control&c)的設(shè)計(jì)如圖4.4所示。圖4.4out函數(shù)流程圖4.3控制層設(shè)計(jì)_Control類的設(shè)計(jì)。voidadd_Process(_Process&p,_Resource&r)方法的設(shè)計(jì)如圖4.5所示。圖4.5add_Process方法流程圖intrun_Process(_Process&p,intn,_Resource&r)(銀行家算法)的設(shè)計(jì)如圖4.6所示。圖4.6銀行家算法流程圖boolsafeChecked(_Resource&r_2)(安全性算法)的設(shè)計(jì)如圖4.7所示圖4.7安全性算法流程圖4.3進(jìn)程層設(shè)計(jì)類_Process的設(shè)計(jì)voidinit(_Resource&r)方法的設(shè)計(jì)如圖4.8所示。圖4.8init方法的流程圖4.4資源層設(shè)計(jì)類_Resource的設(shè)計(jì) voidinit()方法的設(shè)計(jì)如圖4.9所示。圖4.9init方法的流程圖五、系統(tǒng)實(shí)現(xiàn)系統(tǒng)的實(shí)現(xiàn)采用C++語(yǔ)言,并使用MicrosoftVisualStudio2010作為平臺(tái)進(jìn)行實(shí)現(xiàn)。5.1交互層的實(shí)現(xiàn)交互層被直接設(shè)計(jì)成main函數(shù):intmain(){ _Resourcer; r.init(); _Controlc(r); vector<_Process>p; boolis=false; while(true){ intx; cout<<endl; cout<<"1.創(chuàng)建進(jìn)程"<<endl; cout<<"2.執(zhí)行一個(gè)進(jìn)程"<<endl; cout<<"3.退出"<<endl; while(true){/*輸入數(shù)據(jù)合法性檢查*/ cin>>x; if(cin.fail()){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(x<=0) { cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<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<<"您還未創(chuàng)建進(jìn)程!"<<endl;}break; case3:exit(0); default:cout<<"輸入數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; } //輸出各矩陣的狀態(tài) out(p,r,c); } return0;}5.2交互邏輯層的實(shí)現(xiàn)1. vector<_Process>create(_Resource&r,_Control&c)(創(chuàng)建進(jìn)程)的實(shí)現(xiàn)。 vector<_Process>create(_Resource&r,_Control&c){ cout<<"請(qǐng)輸入需要?jiǎng)?chuàng)建的進(jìn)程數(shù)目:"<<endl; inti; while(true){ /*輸入數(shù)據(jù)合法性檢查*/ cin>>i; if(cin.fail()){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(i<=0){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } vector<_Process>p; //進(jìn)程初始化 _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++; } //添加進(jìn)程 for(vector<_Process>::size_typeindex=0;index!=p.size();index++){ c.add_Process(p[index],r); } //初始安全態(tài)檢查 if(c.safeChecked(r)){;} else{ cout<<"系統(tǒng)初始狀態(tài)不安全!"<<endl; system("pause"); exit(0); } returnp;}2. voidrun(vector<_Process>&p,_Resource&r,_Control&c)(執(zhí)行進(jìn)程)的實(shí)現(xiàn) voidrun(vector<_Process>&p,_Resource&r,_Control&c){ inti; cout<<"請(qǐng)輸入需要執(zhí)行的進(jìn)程號(hào):"<<endl; while(true){ /*輸入數(shù)據(jù)合法性檢查*/ cin>>i; if(cin.fail()){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(i<0){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } cout<<"初始化第"<<i<<"個(gè)進(jìn)程的請(qǐng)求向量:"<<endl; //置進(jìn)程的資源請(qǐng)求向量 for(vector<int>::size_typesz=0;sz!=p[i].Request.size();sz++){ cout<<"請(qǐng)輸入請(qǐng)求向量的第"<<sz<<"個(gè)值:"<<endl; intk; while(true){/*輸入數(shù)據(jù)合法性檢查*/ cin>>k; if(cin.fail()) { cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(k<=0){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<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)的實(shí)現(xiàn)。 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控制層的實(shí)現(xiàn)_Control類的實(shí)現(xiàn)。1. voidadd_Process(_Process&p,_Resource&r)方法的實(shí)現(xiàn)。 voidadd_Process(_Process&p,_Resource&r){ N++; //進(jìn)程數(shù)加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)(銀行家算法)的設(shè)計(jì)如圖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<<"請(qǐng)求出錯(cuò)!因?yàn)檫M(jìn)程所需要的資源數(shù)已超過(guò)它所宣布的最大值。"<<endl; return1; } } //再判斷Request<=Available for(vector<int>::size_typeindex=0;index!=p.Request.size();index++){ if(p.Request[index]>r.Available[index]) { cout<<"系統(tǒng)中尚無(wú)足夠的資源,P"<<n<<"必須等待!"<<endl; return2; } } //進(jìn)行試分配 _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; //迭代器移向下一個(gè)元素 iter_2++; iter_3++; iter_4++; } //執(zhí)行安全性檢查 if(safeChecked(r_1)){ r=r_1; //判斷此進(jìn)程是否獲得所有資源,若獲得,則讓其執(zhí)行完畢后釋放 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<<"進(jìn)程P"<<n<<"執(zhí)行完畢,已釋放資源!"<<endl; } return0; } else{ cout<<"系統(tǒng)不處于安全態(tài),P"<<n<<"進(jìn)程需要等待"<<endl; return3; }}3. boolsafeChecked(_Resource&r_2)(安全性算法)的實(shí)現(xiàn)。 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的項(xiàng)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; //本來(lái)不應(yīng)該使用goto語(yǔ)句,但由于在此使用goto語(yǔ)句更顯方便,故破例用之 } } } //判斷所有進(jìn)程Finish是否都為true,是則返回true,否則返回false for(vector<bool>::size_typeindex=0;index!=Finish.size();index++){ if(Finish[index]); else returnfalse; } returntrue;}5.3進(jìn)程層的實(shí)現(xiàn)類_Process的設(shè)計(jì)voidinit(_Resource&r)方法的實(shí)現(xiàn)。voidinit(_Resource&r){ for(inti=0;i<r.getM();i++){ inttemp; while(true){ /*輸入數(shù)據(jù)合法性檢查*/ cout<<"請(qǐng)輸入第"<<i+1<<"類資源的需求量:"<<endl; cin>>temp; if(cin.fail()){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(temp<=0){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } Request.push_back(temp); }}5.4資源層的實(shí)現(xiàn)類_Resource的設(shè)計(jì)voidinit()方法的實(shí)現(xiàn)。void_Resource::init(){ while(true)/*輸入數(shù)據(jù)合法性檢查*/{ cout<<"請(qǐng)初始化系統(tǒng)資源種類數(shù):"<<endl; cin>>M; if(cin.fail()){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(M<=0){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } for(inti=0;i<M;i++) { inttemp; while(true){/*輸入數(shù)據(jù)合法性檢查*/ cout<<"請(qǐng)初始化系統(tǒng)中第"<<i+1<<"類資源的數(shù)目:"<<endl; cin>>temp; if(cin.fail()){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(temp<=0){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } Available.push_back(temp); }}六、測(cè)試與分析本測(cè)試均采用黑盒測(cè)試6.1系統(tǒng)資源初始化測(cè)試測(cè)試用例預(yù)期結(jié)果實(shí)際結(jié)果請(qǐng)輸入資源種類數(shù):任意非數(shù)字字符1.應(yīng)提示“輸入數(shù)據(jù)不和法,請(qǐng)重新輸入!”請(qǐng)輸入資源種類數(shù):負(fù)整數(shù)1.應(yīng)提示“輸入數(shù)據(jù)不和法,請(qǐng)重新輸入!”6.2系統(tǒng)資源初始狀態(tài)的設(shè)置Available={7,5,3}具體的設(shè)置如圖6.1所示。圖6.1初始資源的設(shè)置6.3進(jìn)程初始化測(cè)試測(cè)試用例預(yù)期結(jié)果實(shí)際結(jié)果請(qǐng)輸入你所需要?jiǎng)?chuàng)建的進(jìn)程數(shù):31.不應(yīng)提示錯(cuò)誤信息初始化各類資源需求量P0的Request={4,4,4}P1的Request={1,1,1}P2的Request={1,1,1}應(yīng)提示“系統(tǒng)初始狀態(tài)不安全!”提示“按任意鍵退出系統(tǒng)…”6.4進(jìn)程初始化設(shè)置P0的Request={1,2,3}P1的Request={1,2,2}P2的Request={1,2,2}6.5執(zhí)行進(jìn)程測(cè)試測(cè)試用例預(yù)期結(jié)果實(shí)際結(jié)果請(qǐng)輸入你所需要執(zhí)行的進(jìn)程號(hào):0并置Request={4,4,4}1.應(yīng)提示請(qǐng)求出錯(cuò)信息,所需的資源超過(guò)其所宣布的最大值請(qǐng)輸入你所需要執(zhí)行的進(jìn)程號(hào):1并置Request={1,1,1}應(yīng)直接輸出安全序列輸出各數(shù)據(jù)結(jié)構(gòu)現(xiàn)狀請(qǐng)輸入你所需要執(zhí)行的進(jìn)程號(hào):0并置Request={1,2,3}應(yīng)提示系統(tǒng)資源不足,P0進(jìn)程需等待輸出各數(shù)據(jù)結(jié)構(gòu)現(xiàn)狀請(qǐng)輸入你所需要執(zhí)行的進(jìn)程號(hào):0并置Request={1,2,2}應(yīng)提示系統(tǒng)處于不安全態(tài),P0進(jìn)程需等待輸出各數(shù)據(jù)結(jié)構(gòu)現(xiàn)狀請(qǐng)輸入你所需要執(zhí)行的進(jìn)程號(hào):1并置Request={0,1,1}輸出安全序列提示進(jìn)程P1執(zhí)行完畢并釋放資源輸出各數(shù)據(jù)結(jié)構(gòu)現(xiàn)狀課程設(shè)計(jì)總結(jié)在這次的課程設(shè)計(jì)中,我發(fā)現(xiàn)大多數(shù)情況下我們?cè)谧鲆粋€(gè)項(xiàng)目時(shí),并不是一開(kāi)始就具備完成這項(xiàng)項(xiàng)目的所有知識(shí)。這就要求我們學(xué)會(huì)怎樣去快速的學(xué)會(huì)做項(xiàng)目所需要的全部知識(shí)。遇到有些不會(huì)處理的,我會(huì)上網(wǎng)去查,查一些對(duì)象、容器的用法,如vector等容器。以前我對(duì)這些對(duì)象或容器的用法并不是太熟悉,但現(xiàn)在我不僅掌握了他們的使用方法,更重要的是我學(xué)會(huì)了如何去學(xué)習(xí),然后快速地應(yīng)用到我所需要的項(xiàng)目當(dāng)中。在做這個(gè)銀行家算法模擬系統(tǒng)時(shí),我把它當(dāng)作了一個(gè)產(chǎn)品去做,所以每個(gè)細(xì)節(jié)考慮的雖不完全,但也周到。但這并不能說(shuō)明什么,因?yàn)楹芏嘬浖际峭ㄟ^(guò)升級(jí)的方式來(lái)彌補(bǔ)自身的缺陷,我的銀行家算法模擬系統(tǒng)也是如此。在使用之中發(fā)現(xiàn)問(wèn)題后再去積極的修改問(wèn)題,使得軟件越來(lái)越完善。而且只有這樣才是軟件開(kāi)發(fā)必經(jīng)之路,因?yàn)闆](méi)有什么事物一生下來(lái)就是完美的,都是在通過(guò)追求卓越的過(guò)程中完善自己,繼而達(dá)到巔峰的。在這次的課程設(shè)計(jì)中我還領(lǐng)悟了一個(gè)重大的問(wèn)題:在開(kāi)發(fā)一個(gè)軟件的過(guò)程中,把整個(gè)系統(tǒng)的框架準(zhǔn)確的描述出來(lái)是非常重要的。因?yàn)槲覀兒竺娴木幋a式樣在整個(gè)系統(tǒng)框架的基礎(chǔ)之上進(jìn)行的,如果系統(tǒng)框架在搭建的時(shí)候出現(xiàn)了模塊的沖突,那會(huì)影響整個(gè)軟件開(kāi)發(fā)的進(jìn)度,最終就會(huì)引發(fā)軟件危機(jī)。而這是我們所不希望看到的。所以,在軟件開(kāi)發(fā)之前,一定要詳細(xì)的討論整個(gè)系統(tǒng)的框架,確保合理的情況下再進(jìn)行下一步工作,嚴(yán)格的把開(kāi)發(fā)軟件真正的當(dāng)成一項(xiàng)工程來(lái)對(duì)待。在編碼方面,我發(fā)現(xiàn)良好的代碼風(fēng)格是成功的一半。在編碼的過(guò)程中需要時(shí)常進(jìn)行修改,如果程序的可讀性不強(qiáng),代碼量又龐大的話,那么對(duì)于編碼人員來(lái)說(shuō)是一件非常不幸的事情,因?yàn)樗仨殨r(shí)常讓他的大腦工作在“超頻”狀態(tài),這樣總有一天會(huì)“燒掉”的。所以養(yǎng)成良好的代碼書寫風(fēng)格是非常重要的。總而言之,通過(guò)一次的課程設(shè)計(jì),不僅對(duì)這門課程的知識(shí)掌握更加牢固了,還學(xué)到了關(guān)于以后從事計(jì)算機(jī)方面工作的一些方法論。最后,用一句話總結(jié)這次的課程設(shè)計(jì)——收獲多多。參考文獻(xiàn)[1]湯子瀛,z哲鳳屏,湯小丹.計(jì)算機(jī)操作系統(tǒng)[M].西安:西安電子科技大學(xué)出版社,2002年2月.[2]GradyBooch,JamesRumbaugh,IvarJackbson.UML用戶指南(第2版)[M].北京:人民郵電出版社,2006年6月.[3]張海藩.軟件工程導(dǎo)論(第5版)[M].北京:清華大學(xué)出版社,2008年8月.附錄A源程序清單:_Control.h文件#pragmaonce#include"_Resource.h"#include"_Process.h"class_Control{private: intN; //進(jìn)程的個(gè)數(shù)_Resource&r;public: _Control(_Resource&r); ~_Control(void); voidadd_Process(_Process&p,_Resource&r); //增加一個(gè)新的進(jìn)程 voiddec_Process(); //刪除一個(gè)進(jìn)程 intrun_Process(_Process&p,intn,_Resource&r); //開(kāi)始執(zhí)行進(jìn)程(銀行家算法) 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++; //進(jìn)程數(shù)加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<<"請(qǐng)求出錯(cuò)!因?yàn)檫M(jìn)程所需要的資源數(shù)已超過(guò)它所宣布的最大值。"<<endl; return1; } } //再判斷Request<=Available for(vector<int>::size_typeindex=0;index!=p.Request.size();index++){ if(p.Request[index]>r.Available[index]){ cout<<"系統(tǒng)中尚無(wú)足夠的資源,P"<<n<<"必須等待!"<<endl; return2; } } //進(jìn)行試分配 _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; //迭代器移向下一個(gè)元素 iter_2++; iter_3++; iter_4++; } //執(zhí)行安全性檢查 if(safeChecked(r_1)){ r=r_1; //判斷此進(jìn)程是否獲得所有資源,若獲得,則讓其執(zhí)行完畢后釋放 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<<"進(jìn)程P"<<n<<"執(zhí)行完畢,已釋放資源!"<<endl; } return0; } else{ cout<<"系統(tǒng)不處于安全態(tài),P"<<n<<"進(jì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的項(xiàng)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; //本來(lái)不應(yīng)該使用goto語(yǔ)句,但由于在此使用goto語(yǔ)句更顯方便,故破例用之 } } } //判斷所有進(jìn)程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; //進(jìn)程的請(qǐng)求向量 voidinit(_Resource&r); //初始化進(jìn)程信息};_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){ /*輸入數(shù)據(jù)合法性檢查*/ cout<<"請(qǐng)輸入第"<<i+1<<"類資源的需求量:"<<endl; cin>>temp; if(cin.fail()){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(temp<=0){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<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; //資源的種類數(shù)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){/*輸入數(shù)據(jù)合法性檢查*/ cout<<"請(qǐng)初始化系統(tǒng)資源種類數(shù):"<<endl; cin>>M; if(cin.fail()){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(M<=0){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } for(inti=0;i<M;i++){ inttemp; while(true)/*輸入數(shù)據(jù)合法性檢查*/{ cout<<"請(qǐng)初始化系統(tǒng)中第"<<i+1<<"類資源的數(shù)目:"<<endl; cin>>temp; if(cin.fail()){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(temp<=0){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<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<<"請(qǐng)輸入需要?jiǎng)?chuàng)建的進(jìn)程數(shù)目:"<<endl; inti; while(true){ /*輸入數(shù)據(jù)合法性檢查*/ cin>>i; if(cin.fail()){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(i<=0){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } vector<_Process>p; //進(jìn)程初始化 _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++; } //添加進(jìn)程 for(vector<_Process>::size_typeindex=0;index!=p.size();index++){ c.add_Process(p[index],r); } //初始安全態(tài)檢查 if(c.safeChecked(r)){;} else{ cout<<"系統(tǒng)初始狀態(tài)不安全!"<<endl; system("pause"); exit(0); } returnp;}voidrun(vector<_Process>&p,_Resource&r,_Control&c){ inti; cout<<"請(qǐng)輸入需要執(zhí)行的進(jìn)程號(hào):"<<endl; while(true){ /*輸入數(shù)據(jù)合法性檢查*/ cin>>i; if(cin.fail()){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(i<0){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } cin.clear(); cin.sync(); break; } } cout<<"初始化第"<<i<<"個(gè)進(jìn)程的請(qǐng)求向量:"<<endl; //置進(jìn)程的資源請(qǐng)求向量 for(vector<int>::size_typesz=0;sz!=p[i].Request.size();sz++){ cout<<"請(qǐng)輸入請(qǐng)求向量的第"<<sz<<"個(gè)值:"<<endl; intk; while(true)/*輸入數(shù)據(jù)合法性檢查*/{ cin>>k; if(cin.fail()){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(k<0){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<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.創(chuàng)建進(jìn)程"<<endl; cout<<"2.執(zhí)行一個(gè)進(jìn)程"<<endl; cout<<"3.退出"<<endl; while(true)/*輸入數(shù)據(jù)合法性檢查*/{ cin>>x; if(cin.fail()){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; cin.clear(); cin.sync(); continue; } else{ if(x<=0){ cout<<"您輸入的數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<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<<"您還未創(chuàng)建進(jìn)程!"<<endl;}break; case3:exit(0); default:cout<<"輸入數(shù)據(jù)不合法,請(qǐng)重新輸入!"<<endl; } //輸出各矩陣的狀態(tài) out(p,r,c); } return0;}

項(xiàng)目經(jīng)濟(jì)效益和社會(huì)效益分析(參考)8.1經(jīng)濟(jì)效益分析8.1.1⑴國(guó)家發(fā)展改革委員會(huì)與建設(shè)部發(fā)布、中國(guó)計(jì)劃出版社出版的《建設(shè)項(xiàng)目經(jīng)濟(jì)評(píng)價(jià)方法與參數(shù)》(第三版)。⑵本項(xiàng)目投入、產(chǎn)出物為含稅價(jià)格,增值稅按有關(guān)規(guī)定計(jì)算,其附加稅費(fèi)包括城市維護(hù)建設(shè)稅、教育費(fèi)附加費(fèi)和地方教育費(fèi)附加,分別按應(yīng)繳增值稅額的5%、3%和1%計(jì)取;企業(yè)所得稅率為:2010年為22%、2011年為24%、2012及以后年為25%。⑶財(cái)務(wù)基準(zhǔn)收益率按10%考慮。⑷項(xiàng)目計(jì)算期和生產(chǎn)負(fù)荷本項(xiàng)目計(jì)算期按10年考慮(含建設(shè)期2年)。根據(jù)項(xiàng)目產(chǎn)品市場(chǎng)情況預(yù)計(jì),投產(chǎn)后的生產(chǎn)負(fù)荷估計(jì)如下:第3年投產(chǎn),達(dá)產(chǎn)率為70%,第4年達(dá)產(chǎn)率為85%,第5年及以后達(dá)產(chǎn)率為100%。8.1.2產(chǎn)品銷售收入與銷售稅金及附加估算⑴產(chǎn)品規(guī)模及產(chǎn)品銷售價(jià)格本項(xiàng)目產(chǎn)品為XXXXXXX,達(dá)產(chǎn)年的產(chǎn)品規(guī)模及預(yù)計(jì)產(chǎn)品銷售價(jià)格見(jiàn)表8-1。表8-1產(chǎn)品規(guī)模及銷售價(jià)格序號(hào)產(chǎn)品名稱產(chǎn)品規(guī)模(萬(wàn)支)銷售價(jià)格(含稅)(元/支)1XXXXXXXX2XXXXXXX⑵產(chǎn)品銷售收入及稅金達(dá)產(chǎn)年可實(shí)現(xiàn)產(chǎn)品銷售收入XXXXX萬(wàn)元,年上繳產(chǎn)品銷售稅金及附加X(jué)XX萬(wàn)元,應(yīng)繳增值稅XXXXX萬(wàn)元。產(chǎn)品銷售收入與銷售稅金及附加估算見(jiàn)表8-2。8.1.3總成本費(fèi)用估算⑴外購(gòu)原輔材料估算本項(xiàng)目產(chǎn)品的主要原材料為注塑件、五金件、電子元器件、燈管等。輔料為焊錫、助焊劑及白膠等。預(yù)計(jì)達(dá)產(chǎn)年合計(jì)年外購(gòu)原輔材料費(fèi)為XXXXX萬(wàn)元。見(jiàn)表8-3。⑵外購(gòu)燃料及動(dòng)力費(fèi)估計(jì)預(yù)計(jì)達(dá)產(chǎn)年外購(gòu)燃料及動(dòng)力費(fèi)為114.80萬(wàn)元,見(jiàn)表8-3。⑶人員工資及福利費(fèi)估算本項(xiàng)目定員1500人,年工資福利費(fèi)支出為2,532.60萬(wàn)元。⑷修理費(fèi)本項(xiàng)目修理費(fèi)按固定資產(chǎn)原值的2%估計(jì)。⑸折舊費(fèi)和攤銷費(fèi)本項(xiàng)目折舊方法采用直線折舊法,設(shè)備折舊按10年計(jì),殘值率分別為5%和3%。詳見(jiàn)表8-4。⑹技術(shù)研發(fā)費(fèi)技術(shù)研發(fā)費(fèi)用按銷售收入的2%估計(jì)。⑺其它費(fèi)用其它費(fèi)用包括其它制造費(fèi)用、其它管理費(fèi)用和其它銷售費(fèi)用。其它制造費(fèi)用按產(chǎn)品銷售收入的3%估計(jì);其它管理費(fèi)用按管理技術(shù)員定額數(shù)3萬(wàn)元/人估計(jì)。其它銷售費(fèi)用按產(chǎn)品銷售收入的4%估計(jì)。⑻財(cái)務(wù)費(fèi)用本項(xiàng)目達(dá)產(chǎn)年總成本費(fèi)用為XXX萬(wàn)元,其中:可變成本XXX萬(wàn)元,固定成本XXX萬(wàn)元;年經(jīng)營(yíng)成本為XXX萬(wàn)元。總成本費(fèi)用估算見(jiàn)表8-3。8.1.4利潤(rùn)估算該項(xiàng)目實(shí)施后,達(dá)產(chǎn)年可實(shí)現(xiàn)總產(chǎn)值20,000.00萬(wàn)元,年利潤(rùn)總額為2179.52萬(wàn)元,年上繳稅金2119.30萬(wàn)元,年稅后利潤(rùn)1634.64萬(wàn)元(詳見(jiàn)表8-5)。計(jì)算期內(nèi)年均利潤(rùn)總額1875.12萬(wàn)元??偼顿Y收益率ROI為75%。由上述指標(biāo)可以看出,項(xiàng)目具有很好的投資收益。8.1.5項(xiàng)目盈利能力分析項(xiàng)目現(xiàn)金流量計(jì)算見(jiàn)表8-6。經(jīng)計(jì)算,本項(xiàng)目有關(guān)的財(cái)務(wù)盈利指標(biāo)如下:項(xiàng)目所得稅前財(cái)務(wù)內(nèi)部收益率FIRR為29.69%,財(cái)務(wù)凈現(xiàn)值FNPV(ic=10%)為6221.33萬(wàn)元,靜態(tài)投資回收期為4.30年(含建設(shè)期2年)。項(xiàng)目所得稅后財(cái)務(wù)內(nèi)部收益率為23.69%,財(cái)務(wù)凈現(xiàn)值(ic=10%)為4437.93萬(wàn)元,靜態(tài)投資回收期為4.62年(含建設(shè)期2年)。上述指標(biāo)表明,本項(xiàng)目能獲得較好的投資收益率,項(xiàng)目在財(cái)務(wù)上是可行的。8.1.6本項(xiàng)目還貸資金來(lái)源主要有可供分配利潤(rùn)、折舊與攤銷費(fèi)。按項(xiàng)目最大還款能力計(jì)算,本項(xiàng)目可在2.52年(含建設(shè)期)內(nèi)可償還全部貸款。項(xiàng)目還本付息情況詳見(jiàn)表8-7。8.1.7不確定性分析以設(shè)計(jì)生產(chǎn)能力利用率來(lái)表示項(xiàng)目的盈虧平衡點(diǎn)BEP,即=本項(xiàng)目只要生產(chǎn)能力利用率達(dá)到設(shè)計(jì)生產(chǎn)能力的56.28%就能夠保本經(jīng)營(yíng)而不發(fā)生虧損。表8-2銷售收入估算表單位:萬(wàn)元序號(hào)項(xiàng)目單位/稅率合計(jì)3456789101生產(chǎn)負(fù)荷70%85%100%100%100%100%100%100%產(chǎn)品銷售收入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產(chǎn)量萬(wàn)支350.00425.00500.00500.00500.00500.00500.00500.00售價(jià)元/支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產(chǎn)量萬(wàn)支1,050.001,275.001,500.001,500.001,500.001,500.001,500.001,500.00售價(jià)元/支8.008.008.008.008.008.008.008.001.3銷項(xiàng)稅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城市維護(hù)建設(shè)稅5%545.2750.5561.3972.2272.2272.2272.2272.2272.222.2教育費(fèi)附加3%327.1630.3336.8343.3343.3343.3343.3343.3343.332.3地方教育費(fèi)附加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銷項(xiàng)稅25,670.002,380.002,890.003,400.003,400.003,400.003,400.003,400.003,400.003.2進(jìn)項(xiàng)稅14,764.661,368.911,662.251,955.581,955.581,955.581,955.581,955.581,955.58

表8-3總成本費(fèi)用估算表單位:萬(wàn)元序號(hào)項(xiàng)目單位/稅率合計(jì)345678910生產(chǎn)負(fù)荷70%85%100%100%100%100%100%100%1外購(gòu)原輔材料、包裝材料費(fèi)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進(jìn)項(xiàng)稅17%14,590.831,352.791,642.681,932.561,932.561,932.561,932.561,932.561,932.562外購(gòu)燃料及動(dòng)力費(fèi)866.7480.3697.58114.80114.80114.80114.80114.80114.80進(jìn)項(xiàng)稅小計(jì)143.1213.2716.1118.9618.9618.9618.9618.9618.962.1電761.0470.5685.68100.80100.80100.80100.80100.80100.80進(jìn)項(xiàng)稅17%129.3812.0014.5717.1417.1417.1417.1417.1417.142.2水105.709.8011.9014.0014.0014.0014.0014.0014.00進(jìn)項(xiàng)稅13%13.741.271.551.821.821.821.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論