




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
西安文理學(xué)院軟件學(xué)院計算機操作系統(tǒng)設(shè)計題目:銀行家算法的實現(xiàn)學(xué)生學(xué)號:專業(yè)班級:學(xué)生姓名:學(xué)生成績:
目錄1.摘要 32.設(shè)計思想 43.系統(tǒng)分析 43.1整個銀行家算法的思路 43.2算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C++語言說明 43.2.1可利用資源向量 43.2.2最大需求矩陣 43.2.3已分配矩陣 43.2.4還需求矩陣 53.2.5申請各類資源數(shù)量 53.3銀行家算法主程序 53.3.1系統(tǒng)初始化 53.3.2安全性算法 53.3.3檢索用戶 53.3.4檢查用戶請求 53.3.5進(jìn)行資源的預(yù)分配 53.3.6系統(tǒng)調(diào)用安全性檢查算法 53.4安全性檢查算法 53.4.1設(shè)置兩個臨時變量 53.4.2在進(jìn)程中查找符合以下條件的進(jìn)程 63.4.3如果查找成功則存儲安全序列并進(jìn)行資源的模擬回收 64.函數(shù)調(diào)用關(guān)系 74.1程序流程圖 74.2程序模塊劃分 84.2.1字符判斷模塊 84.2.2程序初始化模塊 84.2.3當(dāng)前安全性檢查模塊 84.2.4銀行家算法模塊 84.2.5顯示分配模塊 85.數(shù)據(jù)結(jié)構(gòu)分析 85.1定義全局變量 85.2函數(shù)聲明 95.3主函數(shù)結(jié)構(gòu) 95.4各模塊含義 105.4.1整個銀行家算法的思路 105.4.2算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C語言說明 105.4.3銀行家算法 105.4.4安全性檢查算法 106.程序測試結(jié)果 127.心得體會 148.主要參考文獻(xiàn) 15附錄:部分源程序代碼 161.摘要銀行家算法是一種最有代表性的避免死鎖的算法,在避免死鎖方法中允許進(jìn)程動態(tài)的申請資源,但系統(tǒng)在進(jìn)行資源分配之前,應(yīng)先計算此次分配資源的安全性,若分配不會導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài),則分配,否則等待。為實現(xiàn)銀行家算法,系統(tǒng)必須設(shè)置若干數(shù)據(jù)結(jié)構(gòu)。所以通過編寫一個模擬動態(tài)資源分配的銀行家算法程序,進(jìn)一步深入理解死鎖、產(chǎn)生死鎖的必要條件、安全狀態(tài)等重要概念,并掌握避免死鎖的具體實施方法。關(guān)鍵詞:資源,分配,死鎖,狀態(tài)2.設(shè)計思想我們可以把操作系統(tǒng)看做是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進(jìn)程向操作系統(tǒng)請求分配資源相當(dāng)于用戶向銀行家貸款。為保證資金的安全,銀行家規(guī)定:(1)當(dāng)一個顧客對資金的最大需求量不超過銀行家現(xiàn)有的資金是就可接納該顧客;(2)顧客可以分期貸款,但貸款的總數(shù)不能超過最大需求量;(3)當(dāng)銀行家現(xiàn)有的資金不能滿足顧客尚需的貸款數(shù)額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間里得到貸款;(4)當(dāng)顧客得到所需的全部資金后,一定能在有限的時間里歸還所有的資金。操作系統(tǒng)按照銀行家制定的規(guī)則為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請資源是,要測試該進(jìn)程對資源的最大需求量,如果系統(tǒng)現(xiàn)存的資金可以滿足它的最大需求量,則按當(dāng)前的申請量分配資源,否則就推遲分配。當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請資源時,先測試該進(jìn)程已占有的資源數(shù)與本次申請的資源數(shù)之和是否超過了該進(jìn)程對資源的最大需求量。若超過了最大需求量則拒絕分配資源,若沒有則再測試系統(tǒng)現(xiàn)存的資源能否滿足該進(jìn)程尚需的最大資源量,若能滿足則按當(dāng)前的申請量分配資源,否則也要延遲分配。3.系統(tǒng)分析3.1整個銀行家算法的思路先對用戶提出的請求進(jìn)行合法性檢查,再進(jìn)行預(yù)分配,利用安全性檢查算法進(jìn)行安全性檢查。3.2算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C++語言說明3.2.1可利用資源向量intAvailable[M]M為資源的類型。3.2.2最大需求矩陣intMax[N][M]N為進(jìn)程的數(shù)量。3.2.3已分配矩陣intAllocation[N][M]3.2.4還需求矩陣intNeed[N][N]3.2.5申請各類資源數(shù)量intRequest[x];intWork[x];intFinish[y];//是否有足夠的資源分配給進(jìn)程,0為否,非0為是3.3銀行家算法主程序3.3.1系統(tǒng)初始化調(diào)用函數(shù)chushihua(),輸入進(jìn)程數(shù)量,資源種類,各資源可用數(shù)量,各進(jìn)程已分配、最大需求各資源數(shù)量等3.3.2安全性算法調(diào)用函safe()檢查當(dāng)前資源分配狀態(tài)。3.3.3檢索用戶用bank()函數(shù),輸入用戶的請求三元組(I,J,K),為進(jìn)程I申請K個J類資源。3.3.4檢查用戶請求檢查用戶請求是否小于還需求量,條件是K<=NEED[I,J]。如果條件不符則提示重新輸入,即不允許索取大于需求量。檢查用戶的請求是否小于系統(tǒng)中的可利用資源數(shù)量,條件是K<=AVALIABLE[I,J]。如果條件不符則申請失敗,阻塞該進(jìn)程,重新進(jìn)行進(jìn)程動態(tài)資源申請(使用goto語句跳轉(zhuǎn))3.3.5進(jìn)行資源的預(yù)分配AVALIBLE[I][J]=AVALIBLE[I][J]-K;ALLOCATION[I][J]=ALLOCATION[I][J]+K;NEED[I][J]=NEED[I][J]-K;3.3.6系統(tǒng)調(diào)用安全性檢查算法safe()函數(shù)進(jìn)行檢查,如果檢查不安全,則進(jìn)行回收,進(jìn)程資源申請失敗進(jìn)入等待。否則不用回收,并檢查該進(jìn)程是否已獲得所有需要資源,如是則進(jìn)行其擁有資源釋放,語句如下:Available[j]=Available[j]+Allocation[k][j];Allocation[k][j]=0;3.4安全性檢查算法3.4.1設(shè)置兩個臨時變量FINISH[N]記錄進(jìn)程模擬執(zhí)行的結(jié)束狀態(tài),初值為0,如果可以模擬執(zhí)行結(jié)束,則可設(shè)為1。WORK[M]記錄模擬執(zhí)行中資源的回收情況,初值為AVAILABLE[M]的值。3.4.2在進(jìn)程中查找符合以下條件的進(jìn)程條件1:FINISH[I]=0條件2:NEED[I][J]〈=WORK[J]3.4.3如果查找成功則存儲安全序列并進(jìn)行資源的模擬回收FINISH[I]=1WORK[J]=WORK[J]+ALLOCATION[I][J];4.函數(shù)調(diào)用關(guān)系4.1程序流程圖開始開始請輸入資源數(shù)請輸入各類資源可利用的數(shù)請輸入當(dāng)前資源可利用的數(shù)量請輸入當(dāng)前可分配的資源數(shù)量請輸入當(dāng)前已分配的資源數(shù)請輸入進(jìn)程對資源的最大需求數(shù)量Max≤資源數(shù)提示錯誤系統(tǒng)當(dāng)前狀態(tài)統(tǒng)計結(jié)束4.2程序模塊劃分4.2.1字符判斷模塊判斷輸入的字符是否為數(shù)字,如果不是則提示出錯并重新輸入,主要處理輸入為非數(shù)字時程序出現(xiàn)運行錯誤現(xiàn)象。此模塊功能由數(shù)字判斷函數(shù)(intshuzi(intsz);)實現(xiàn)。4.2.2程序初始化模塊用于程序開始進(jìn)行初始化輸入數(shù)據(jù):進(jìn)程數(shù)量、資源種類、各種資源可利用數(shù)量、各進(jìn)程的各種資源已分配數(shù)量、各進(jìn)程對各類資源最大需求數(shù)等。此模塊功能在系統(tǒng)初始化函數(shù)(voidchushihua();)中實現(xiàn)。4.2.3當(dāng)前安全性檢查模塊用于判斷當(dāng)前狀態(tài)安全性,根據(jù)不同地方的調(diào)用提示處理不同,在安全性算函數(shù)(voidsafe();)中實現(xiàn)。4.2.4銀行家算法模塊進(jìn)行銀行家算法模擬實現(xiàn)的模塊,調(diào)用其他各個模塊進(jìn)行銀行家算法模擬過程,在銀行家算法函數(shù)(voidbank();)中實現(xiàn)。4.2.5顯示分配模塊顯示當(dāng)前資源分配詳細(xì)情況,包括:各種資源的總數(shù)量(all)、系統(tǒng)目前各種資源可用的數(shù)量、各進(jìn)程已經(jīng)得到的資源數(shù)量、各進(jìn)程還需要的資源量,在顯示分配情況函數(shù)(voidshowdata();)中實現(xiàn)。4.2.6簽名模塊:用于程序結(jié)束時顯示程序版權(quán)聲明簽名等,在簽名函數(shù)(voidsign();)中實現(xiàn)。5.數(shù)據(jù)結(jié)構(gòu)分析5.1定義全局變量constintx=50,y=100;//定義常量,便于修改intAvailable[x];//各種資源可利用的數(shù)量intAllocation[y][y];//各進(jìn)程當(dāng)前已分配的資源數(shù)量intMax[y][y];//各進(jìn)程對各類資源的最大需求數(shù)intNeed[y][y];//還需求矩陣intRequest[x];//申請各類資源的數(shù)量intWork[x];//工作向量,表系統(tǒng)可提供給進(jìn)程運行所需各類資源數(shù)量intFinish[y];//表系統(tǒng)是否有足夠的資源分配給進(jìn)程,0為否,1為是intp[y];//存儲安全序列inti,j;//全局變量,主要用于循環(huán)語句中intn,m;//n為進(jìn)程的數(shù)量,m為資源種類數(shù)intl=0,counter=0;5.2函數(shù)聲明intshuzi(intsz);//數(shù)字判斷函數(shù),還可使用voidshuzi(int&sz);方式voidchushihua();//系統(tǒng)初始化函數(shù)voidsafe();//安全性算法函數(shù)voidbank();//銀行家算法函數(shù)voidshowdata();//函數(shù)showdata,輸出當(dāng)前資源分配情況voidsign();//簽名函數(shù)5.3主函數(shù)結(jié)構(gòu)intmain(){system("color06f");//設(shè)置當(dāng)前窗口的背景色和前景色cout<<……//顯示程序開始提示信息chushihua();//初始化函數(shù)調(diào)用cout<<endl<<endl;showdata();//輸出初始化后的狀態(tài)//===判斷當(dāng)前狀態(tài)的安全性===safe();//安全性算法函數(shù)調(diào)用if(l<n){cout<<"\n當(dāng)前狀態(tài)不安全,無法申請,程序退出!!!!!"<<endl;cout<<endl;system("pause");sign();//調(diào)用簽名函數(shù)return0;//break;}else{inti;//局部變量l=0;cout<<"\n安全的狀態(tài)!!!"<<endl;cout<<"安全序列為:";cout<<endl<<"進(jìn)程"<<"("<<p[0]<<")";//輸出安全序列,考慮顯示格式,先輸出第一個for(i=1;i<n;i++){cout<<"==>>"<<"進(jìn)程"<<"("<<p[i]<<")";}for(i=0;i<n;i++)Finish[i]=0;//所有進(jìn)程置為未分配狀態(tài)cout<<endl<<endl;}bank();//銀行家算法函數(shù)調(diào)用return0;}5.4各模塊含義5.4.1整個銀行家算法的思路先對用戶提出的請求進(jìn)行合法性檢查,再進(jìn)行預(yù)分配,利用安全性檢查算法進(jìn)行安全性檢查。5.4.2算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C語言說明(1)可利用資源向量INTAVAILABLE[M]M為資源的類型;(2)最大需求矩陣INTMAX[N][M]N為進(jìn)程的數(shù)量;(3)已分配矩陣INTALLOCATION[N][M];(4)還需求矩陣INTNEED[N][N];(5)申請各類資源數(shù)量intRequest[x];(6)工作向量intWork[x]。(7)intFinish[y];//表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,0為否,非0為是5.4.3銀行家算法(1)系統(tǒng)初始化。輸入進(jìn)程數(shù)量,資源種類,各進(jìn)程已分配、還需求各資源數(shù)量,各資源可用數(shù)量等。(2)輸入用戶的請求三元組(I,J,K),為進(jìn)程I申請K個J類資源。(3)檢查用戶的請求是否小于還需求的數(shù)量,條件是K<=NEED[I,J]。如果條件不符則提示重新輸入,即不允許索取大于需求量。(4)檢查用戶的請求是否小于系統(tǒng)中的可利用資源數(shù)量,條件是K<=AVALIABLE[I,J]。如果條件不符則申請失敗,阻塞該進(jìn)程,重新進(jìn)行進(jìn)程動態(tài)資源申請(使用goto語句)。(5)進(jìn)行資源的預(yù)分配,語句如下:AVALIBLE[I][J]=AVALIBLE[I][J]-K; ALLOCATION[I][J]=ALLOCATION[I][J]+K; NEED[I][J]=NEED[I][J]-K;(6)系統(tǒng)調(diào)用安全性檢查算法(safe()函數(shù))進(jìn)行檢查,如果檢查通過,則不回收,否則進(jìn)行回收,進(jìn)程資源申請失敗進(jìn)入等待。5.4.4安全性檢查算法(1)設(shè)置兩個臨時變量FINISH[N]記錄進(jìn)程模擬執(zhí)行的結(jié)束狀態(tài),初值為0,如果可以模擬執(zhí)行束,則可設(shè)為1,也可設(shè)其它非零值以表示執(zhí)行的先后次序。WORK[M]記錄模擬執(zhí)行中資源的回收情況,初值為AVAILABLE[M]的值。(2)在進(jìn)程中查找符合以下條件的進(jìn)程條件1:FINISH[I]=0條件2:NEED[I][J]〈=WORK[J].(3)如果查找成功則進(jìn)行資源的模擬回收,語句如下WORK[J]=WORK[J]+ALLOCATION[I][J];FINISH[I]=1或查找到的順序號.(4)、如果查找不成功,則檢查所有進(jìn)程的FINISH[],如果有一個為0,則系統(tǒng)不為0,返回不成功標(biāo)志。否則返回成功標(biāo)志。6.程序測試結(jié)果程序調(diào)試圖如下所示:顯示資源最大需求數(shù)界面資源管理界面需要資源數(shù)量界面7.心得體會在設(shè)計此程序的過程中,我遇到過許多問題,也學(xué)到了很多東西。本程序的設(shè)計實現(xiàn)主要是用C++語言實現(xiàn),通過對程序算法的設(shè)計優(yōu)化、輸出顯示的格式設(shè)計、輸入過程中的異常處理等一些設(shè)計過程中的問題的考慮解決,在C++學(xué)習(xí)上也有了很大的進(jìn)步。程序設(shè)計過程中開始遇到的最大的問題是算法的結(jié)構(gòu)設(shè)計問題,課本上只給了設(shè)計要求及簡單的算法,要真正實現(xiàn)還需要考慮很多方面。在算法的數(shù)據(jù)結(jié)構(gòu)設(shè)計上考慮了很長時間。在程序設(shè)計中先后參考了很多網(wǎng)絡(luò)資料,也參考了一些別人寫的的程序,綜合這些算法思想和自己的思路對程序做了很好的設(shè)計方式,對一些算法的優(yōu)越性等也作了一些考慮。此外考慮最多的就是異常錯誤處理的設(shè)計。一個好的程序必須能在各種環(huán)境下都有其相應(yīng)的處理方式,至少能應(yīng)對一些常見的可能發(fā)生的錯誤。比如一般的要求輸入為數(shù)字時,如果輸入了一個非數(shù)字字符,程序就會立即出錯無法繼續(xù)運行,本程序針對這個問題設(shè)計了一個shuzi();函數(shù)進(jìn)行處理,處理方式為:接受鍵盤輸入的字符為字符串,然后對字符串的每個字符進(jìn)行判斷是否為數(shù)字,如果有非數(shù)字字符出現(xiàn)則提示出錯并要求重新輸入。又如在判斷是否繼續(xù)時要求輸入Y/N時,按一般的方式,如果輸入為多個字符,則多余的字符會保存在緩沖區(qū),到下次要求輸入時輸入而導(dǎo)致出錯,對此問題設(shè)計處理方式為接受輸入字符保存為串然后只取其首字符進(jìn)行判斷。還有很多類似的錯誤處理。還有在設(shè)置程序的顯示優(yōu)化時,發(fā)現(xiàn)暫停函數(shù)在不同的情況下執(zhí)行順序不同,如此等等。在課程設(shè)計過程中遇到了許多問題,也向同宿舍的同學(xué)做了一些請教一起討論,也因此從他們身上學(xué)到了許多東西。8.主要參考文獻(xiàn)1.湯子瀛,哲鳳屏.《計算機操作系統(tǒng)》.西安電子科技大學(xué)學(xué)出版社.2.王清,李光明.《計算機操作系統(tǒng)》.冶金工業(yè)出版社.3.孫鐘秀等.\o"操作系統(tǒng)教程"操作系統(tǒng)教程.高等教育出版社4.曾明.
\o"Linux操作系統(tǒng)應(yīng)用教程"Linux操作系統(tǒng)應(yīng)用教程.陜西科學(xué)技術(shù)出版社.5.張麗芬,劉利雄.《操作系統(tǒng)實驗教程》.清華大學(xué)出版社.6.孟靜,
\o"操作系統(tǒng)教程--原理和實例分析"操作系統(tǒng)教程--原理和實例分析.高等教育出版社7.周長林,\o"計算機操作系統(tǒng)教程"計算機操作系統(tǒng)教程.高等教育出版社8.張堯?qū)W,\o"計算機操作系統(tǒng)教程"計算機操作系統(tǒng)教程,清華大學(xué)出版社9.任滿杰,\o"操作系統(tǒng)原理實用教程"操作系統(tǒng)原理實用教程,電子工業(yè)出版社附錄:部分源程序代碼#include<iostream.h>#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>//===定義全局變量===constintx=50,y=100;//定義常量,便于修改intAvailable[x];//各種資源可利用的數(shù)量intAllocation[y][y];//各進(jìn)程當(dāng)前已分配的資源數(shù)量intMax[y][y];//各進(jìn)程對各類資源的最大需求數(shù)intNeed[y][y];//還需求矩陣intRequest[x];//申請各類資源的數(shù)量intWork[x];//工作向量,表示系統(tǒng)可提供給進(jìn)程繼續(xù)運行所需的各類資源數(shù)量intFinish[y];//表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,0為否,非0為是intp[y];//存儲安全序列inti,j;intn,m;//n為進(jìn)程的數(shù)量,m為資源種類數(shù)intl=0,counter=0;//函數(shù)聲明intshuzi(intsz);//數(shù)字判斷函數(shù)或者使用voidshuzi(int&sz);方式voidchushihua();//系統(tǒng)初始化函數(shù)voidsafe();//安全性算法函數(shù)voidbank();//銀行家算法函數(shù)voidshowdata();//函數(shù)showdata,輸出當(dāng)前資源分配情況voidsign();//簽名函數(shù)//===數(shù)字判斷函數(shù)===intshuzi(intsz){//輸入數(shù)據(jù)并判斷是否為數(shù)字char*temp;temp=newchar;//臨時指針,存放輸入字符intlen;//存儲取字符的長度sz=0;//清零chars;//do{//輸入賭注,只能輸入數(shù)字//gets(temp);//getline(cin,temp)cin>>temp;len=strlen(temp);//取字符長度for(inti=0;i<len;i++){s=*(temp+i);if(s<'0'||s>'9'){cout<<"請輸入數(shù)字\n\n";cout<<"請重新輸入:";break;}}}while(s<'0'||s>'9');for(inti=0;i<len;i++){//輸入字符串轉(zhuǎn)化為整形數(shù)字intt=1;for(intj=1;j<len-i;j++)t*=10;sz+=(*(temp+i)-48)*t;}returnsz;}//===系統(tǒng)初始化函數(shù)===voidchushihua(){//===系統(tǒng)初始化輸入===cout<<"%%程序開始,系統(tǒng)初始化輸入%%"<<endl;//<<endlcout<<"==============================================================="<<endl<<endl;cout<<"請輸入進(jìn)程的數(shù)量:";//從此開始輸入有關(guān)數(shù)據(jù)n=shuzi(n);cout<<"請輸入資源種類數(shù):";m=shuzi(m);cout<<endl<<endl<<"請輸入各種資源可利用的數(shù)量("<<m<<"種):"<<endl;cout<<endl;for(j=0;j<m;j++){cout<<"輸入資源"<<j<<"可利用的數(shù)量Available["<<j<<"]:";Available[j]=shuzi(Available[j]);Work[j]=Available[j];//初始化Work[j]//cout<<endl;}//system("cls");//清屏cout<<endl;cout<<"請輸入各進(jìn)程當(dāng)前已分配的資源數(shù)量Allocation["<<n<<"]["<<m<<"]:"<<endl<<endl;for(i=0;i<n;i++){for(j=0;j<m;j++){cout<<"請輸入進(jìn)程"<<i<<"當(dāng)前已分配的資源"<<j<<"數(shù)量:";Allocation[i][j]=shuzi(Allocation[i][j]);//cout<<endl;}cout<<endl;Finish[i]=0;//初始化Finish[i]//break;}cout<<endl<<endl;cout<<"請輸入各進(jìn)程對各類資源的最大需求數(shù)Max["<<n<<"]["<<m<<"]:"<<endl<<endl;for(i=0;i<n;i++){for(j=0;j<m;j++){cout<<"請輸入進(jìn)程"<<i<<"對資源"<<j<<"的最大需求數(shù):";Max[i][j]=shuzi(Max[i][j]);if(Max[i][j]>=Allocation[i][j])//Need[i][j]=Max[i][j]-Allocation[i][j];//計算還需求量elseNeed[i][j]=0;//最大需求量小于已分配量時還需求量為0,即此類資源已足夠不需再申請}cout<<endl;}cout<<endl<<"%%初始化完成!%%"<<endl;}//===安全性算法函數(shù)===voidsafe(){l=0;for(i=0;i<n;){//i++if(Finish[i]==0){//尋找Finish[i]==0的進(jìn)程條件一counter=0;//記數(shù)器/*算法一:for(j=0;j<m;j++){if(Work[j]>=Need[i][j])//可用大于等于需求counter=counter+1;//記數(shù)}if(counter==m){…*///算法二:for(j=0;j<m;j++)if(Work[j]>=Need[i][j]);//可用大于等于需求else{counter=1;break;}if(counter!=1){//進(jìn)程的每類資源量都符合條件Work[j]>=Need[i][j]條件二p[l]=i;//存儲安全序列Finish[i]=1;//標(biāo)志為可分配for(j=0;j<m;j++){Work[j]=Work[j]+Allocation[i][j];//釋放資源}l=l+1;//記數(shù),當(dāng)L=N時說明滿足安全序列,即都符合條件Work[j]>=Need[i][j]i=-1;//從第一個進(jìn)程開始繼續(xù)尋找滿足條件一二的進(jìn)程}}i++;//for循環(huán)繼續(xù)尋找}}//===顯示分配情況函數(shù)===voidshowdata()//函數(shù)showdata,輸出當(dāng)前資源分配情況{inti,j;//局部變量intAll[y];//各種資源的總數(shù)量intl2;//局部變量l1,cout<<"==============================================================="<<endl<<endl;cout<<"%%系統(tǒng)當(dāng)前狀態(tài)如下:%%"<<endl<<endl;cout<<"%%各種資源的總數(shù)量(all):"<<endl;for(j=0;j<m;j++){cout<<"資源"<<j<<":";All[j]=Available[j];//初始化先賦值加上可利用量for(i=0;i<n;i++){All[j]+=Allocation[i][j];//再加上每個進(jìn)程已分配量計算J類資源總量}cout<<All[j]<<"";if((j+1)%5==0)cout<<endl;//每行顯示五個&&j!=0}cout<<endl<<endl;cout<<"%%系統(tǒng)目前各種資源可用的數(shù)為(available):"<<endl;for(j=0;j<m;j++){cout<<"資源"<<j<<":"<<Available[j]<<"";if((j+1)%5==0)cout<<endl;//每行最多顯示五個&&j!=0}cout<<endl<<endl;cout<<"%%各進(jìn)程已經(jīng)得到的資源量(allocation):"<<endl;//l1=0;//歸零for(i=0;i<=m/5;i++){//設(shè)計每行最多顯示五種資源for(j=i*5;j<i*5+5&&j<m;j++)cout<<"資源"<<j;cout<<endl;for(l2=0;l2<n;l2++){cout<<"進(jìn)程"<<l2<<":";for(j=i*5;j<i*5+5&&j<m;j++)cout<<Allocation[l2][j]<<"";cout<<endl;}}cout<<endl;cout<<"%%各進(jìn)程還需要的資源量(need):"<<endl;//<<endl//l1=0;for(i=0;i<=m/5;i++){//設(shè)計每行顯示五種資源for(j=i*5;j<i*5+5&&j<m;j++)cout<<"資源"<<j;cout<<endl;for(l2=0;l2<n;l2++){cout<<"進(jìn)程"<<l2<<":";for(j=i*5;j<i*5+5&&j<m;j++)cout<<Need[l2][j]<<"";cout<<endl;}}cout<<endl;cout<<"==============================================================="<<endl;cout<<endl;system("pause");//暫停}//===簽名函數(shù)===voidsign(){system("cls");//清屏cout<<endl<<endl<<endl<<endl<<endl<<endl;cout<<"\t\t========================================="<<endl;cout<<"\t\t=@@="<<endl;cout<<"\t\t=@謝謝你的使用@="<<endl;cout<<"\t\t=@@="<<endl;cout<<"\t\t========================================="<<endl;cout<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl<<endl;//getch();//等待鍵盤輸入,不返回任何值,用于設(shè)置程序運行界面system("pause");//暫停比較兩種方式/*經(jīng)過在不同的編輯器中調(diào)試發(fā)現(xiàn),不同的調(diào)試器對函數(shù)執(zhí)行的順序有差別如在此處使用getch()和system("pause")函數(shù)時,在visualc++6.0中先執(zhí)行此函數(shù)再顯示,而在dev-c++中則按順序執(zhí)行對此問題我在很多地方搜索查找均未找到滿意的答案,本次換用調(diào)試器才發(fā)現(xiàn)理解--4.29本次調(diào)試格式時,將換行命令"\n"改為endl時,發(fā)現(xiàn)system("pause")函數(shù)執(zhí)行變?yōu)轫樞驁?zhí)行,由此領(lǐng)悟到"\n"命令和system("pause")調(diào)用了一樣系統(tǒng)函數(shù),在調(diào)用的順序上system("pause")優(yōu)先所以它就先執(zhí)行了查找了一下相關(guān)幫助:在OSTREAM.H中有這樣的一個inline函數(shù):inline_CRTIMPostream&__cdeclendl(ostream&_outs){return_outs<<'\n'<<flush;}也就是說endl=return_outs<<'\n'<<flush;endl除了寫'\n'進(jìn)外,還調(diào)用flush函數(shù),刷新緩沖區(qū),把緩沖區(qū)里的數(shù)據(jù)寫入文件或屏幕,如果考慮效率就用'\n'*///cout<<"\t\t\t\t輸入任意字符結(jié)束";//處理最后生成EXE程序執(zhí)行問題//cin>>l;cout<<"\t\t\t";}//===銀行家算法函數(shù)===voidbank(){cout<<"==============================================================="<<endl<<endl;cout<<"%%以下開始為進(jìn)程進(jìn)行資源分配申請%%"<<endl<<endl;//===申請資源===intk=0;//用于輸入進(jìn)程編號boolr=false;//初值為假,輸入Y繼續(xù)申請則置為真do{//輸入請求cout<<"請輸入申請資源的進(jìn)程編號(輸入0--"<<n-1<<"之間):";k=shuzi(k);cout<<endl;while(k>n-1){//輸入異常處理cout<<endl<<"您輸入了錯誤的進(jìn)程號,請重新輸入!"<<endl;cout<<endl<<"請輸入申請資源的進(jìn)程編號(輸入0--"<<n-1<<"之間):";k=shuzi(k);cout<<endl;}cout<<endl<<"請輸入該進(jìn)程申請各類資源的數(shù)量:"<<endl;for(j=0;j<m;j++){do{//do……while循環(huán)判斷申請輸入的情況cout<<"進(jìn)程"<<k<<"申請資源["<<j<<"]的數(shù)量:";Request[j]=shuzi(Request[j]);cout<<endl;if(Request[j]>Need[k][j]){//申請大于需求量時出錯,提示重新輸入(貸款數(shù)目不允許超過需求數(shù)目)cout<<"申請大于需要量!!!"<<endl;cout<<"您申請資源"<<j<<"的數(shù)量為"<<Request[j]<<",大于進(jìn)程"<<k<<"對該資源需求量"<<Need[k][j]<<"。"<<endl;cout<<"請重新輸入!!!"<<endl;}else//先判斷是否申請大于需求量,再判斷是否申請大于可利用量if(Request[j]>Available[j]){//申請大于可利用量,應(yīng)該阻塞等待?……???cout<<"\n沒有那么多資源,目前可利用資源"<<j<<"數(shù)量為"<<Available[j]<<",本次申請不成功,進(jìn)程等待!!!"<<endl;Finish[k]=0;//該進(jìn)程等待gotoppp;//goto語句跳轉(zhuǎn),結(jié)束本次申請}}while(Request[j]>Need[k][j]);//Request[j]>Available[j]||}//改變Avilable、Allocation、Need的值for(j=0;j<m;j++){Available[j]=Available[j]-Request[j];Allocation[k][j]=Allocation[k][j]+Request[j];Need[k][j]=Need[k][j]-Request[j];Work[j]=Available[j];}//判斷當(dāng)前狀態(tài)的安全性safe();//調(diào)用安全性算法函數(shù)if(l<n){l=0;cout<<"\n當(dāng)前狀態(tài)不安全,不予分配!!!!!!"<<endl;//恢復(fù)數(shù)據(jù)for(j=0;j<m;j++){Available[j]=Available[j]+Request[j];Allocation[k][j]=Allocation[k][j]-Request[j];Need[k][j]=Need[k][j]+Request[j];Work[j]=Available[j];}for(i=0;i<n;i++)Finish[i]=0;//進(jìn)程置為未分配狀態(tài)}else{//system("cls");l=0;cout<<"\n申請資源成功!!!"<<endl;//===========================================/*//如果該進(jìn)程所有需要的資源都已申請到,即NEED[k][j]均為零,則進(jìn)程可以執(zhí)行,執(zhí)行完后需釋放其所有擁有的資源//算法一:for(j=0;j<m;j++)if(Need[k][j]==0)l=l+1;if(l==m){//此處借用l做下計數(shù)器for(j=0;j<m;j++){//釋放該進(jìn)程的所有資源Available[j]=Available[j]+Max[k][j];Allocation[k][j]=0;}}l=0;//歸零*///算法二:(相對第一種算法節(jié)省時間)for(j=0;j<m;j++){if(Need[k][j]==0);else{//有一種資源還沒全部申請到,則該進(jìn)程不可執(zhí)行,不能釋放擁有的資源l=1;//置l為1,作為判斷標(biāo)志break;}}if(l!=1){//進(jìn)程可以執(zhí)行,則釋放該進(jìn)程的所有資源for(j=0;j<m;j++){Available[j]=Available[j]+Allocation[k][j];Allocation[k][j]=0;}co
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版數(shù)學(xué)六年級下冊《練習(xí)九》具體內(nèi)容和教學(xué)建議
- 康定縣2025屆五年級數(shù)學(xué)第二學(xué)期期末考試模擬試題含答案
- 重慶藝術(shù)工程職業(yè)學(xué)院《視譯技能訓(xùn)練》2023-2024學(xué)年第二學(xué)期期末試卷
- 云南省牟定縣一中2024-2025學(xué)年高三下學(xué)期單元檢測試題英語試題含解析
- 貴州工程應(yīng)用技術(shù)學(xué)院《植物檢疫學(xué)實驗》2023-2024學(xué)年第二學(xué)期期末試卷
- 廊坊職業(yè)技術(shù)學(xué)院《基礎(chǔ)緬甸語》2023-2024學(xué)年第二學(xué)期期末試卷
- 神池縣2025屆五下數(shù)學(xué)期末考試試題含答案
- 南通科技職業(yè)學(xué)院《影像拓展》2023-2024學(xué)年第一學(xué)期期末試卷
- 沈陽城市學(xué)院《分離科學(xué)》2023-2024學(xué)年第二學(xué)期期末試卷
- 設(shè)備科安全工作半年總結(jié)
- 自考15040習(xí)新時代思想概論高頻備考復(fù)習(xí)重點
- 心電監(jiān)護(hù)操作評分標(biāo)準(zhǔn)
- 電梯使用單位電梯使用和運行安全管理制度
- 新中初中課程建設(shè)匯報材料
- 乙肝兩對半ppt課件
- 鍋爐空氣預(yù)熱器拆除安裝方案
- 蓮中器樂演奏活動方案
- 0730土木工程概論 練習(xí)題答案
- 保監(jiān)〔2005〕22號標(biāo)準(zhǔn)
- 抗震支架力學(xué)計算書
- 出納崗位筆試試題
評論
0/150
提交評論