銀行家算法實(shí)現(xiàn)_第1頁(yè)
銀行家算法實(shí)現(xiàn)_第2頁(yè)
銀行家算法實(shí)現(xiàn)_第3頁(yè)
銀行家算法實(shí)現(xiàn)_第4頁(yè)
銀行家算法實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩20頁(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)介

西安文理學(xué)院軟件學(xué)院計(jì)算機(jī)操作系統(tǒng)設(shè)計(jì)題目:銀行家算法的實(shí)現(xiàn)學(xué)生學(xué)號(hào):專(zhuān)業(yè)班級(jí):學(xué)生姓名:學(xué)生成績(jī):

目錄1.摘要 32.設(shè)計(jì)思想 43.系統(tǒng)分析 43.1整個(gè)銀行家算法的思路 43.2算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C++語(yǔ)言說(shuō)明 43.2.1可利用資源向量 43.2.2最大需求矩陣 43.2.3已分配矩陣 43.2.4還需求矩陣 53.2.5申請(qǐng)各類(lèi)資源數(shù)量 53.3銀行家算法主程序 53.3.1系統(tǒng)初始化 53.3.2安全性算法 53.3.3檢索用戶 53.3.4檢查用戶請(qǐng)求 53.3.5進(jìn)行資源的預(yù)分配 53.3.6系統(tǒng)調(diào)用安全性檢查算法 53.4安全性檢查算法 53.4.1設(shè)置兩個(gè)臨時(shí)變量 53.4.2在進(jìn)程中查找符合以下條件的進(jìn)程 63.4.3如果查找成功則存儲(chǔ)安全序列并進(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整個(gè)銀行家算法的思路 105.4.2算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C語(yǔ)言說(shuō)明 105.4.3銀行家算法 105.4.4安全性檢查算法 106.程序測(cè)試結(jié)果 127.心得體會(huì) 148.主要參考文獻(xiàn) 15附錄:部分源程序代碼 161.摘要銀行家算法是一種最有代表性的避免死鎖的算法,在避免死鎖方法中允許進(jìn)程動(dòng)態(tài)的申請(qǐng)資源,但系統(tǒng)在進(jìn)行資源分配之前,應(yīng)先計(jì)算此次分配資源的安全性,若分配不會(huì)導(dǎo)致系統(tǒng)進(jìn)入不安全狀態(tài),則分配,否則等待。為實(shí)現(xiàn)銀行家算法,系統(tǒng)必須設(shè)置若干數(shù)據(jù)結(jié)構(gòu)。所以通過(guò)編寫(xiě)一個(gè)模擬動(dòng)態(tài)資源分配的銀行家算法程序,進(jìn)一步深入理解死鎖、產(chǎn)生死鎖的必要條件、安全狀態(tài)等重要概念,并掌握避免死鎖的具體實(shí)施方法。關(guān)鍵詞:資源,分配,死鎖,狀態(tài)2.設(shè)計(jì)思想我們可以把操作系統(tǒng)看做是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進(jìn)程向操作系統(tǒng)請(qǐng)求分配資源相當(dāng)于用戶向銀行家貸款。為保證資金的安全,銀行家規(guī)定:(1)當(dāng)一個(gè)顧客對(duì)資金的最大需求量不超過(guò)銀行家現(xiàn)有的資金是就可接納該顧客;(2)顧客可以分期貸款,但貸款的總數(shù)不能超過(guò)最大需求量;(3)當(dāng)銀行家現(xiàn)有的資金不能滿足顧客尚需的貸款數(shù)額時(shí),對(duì)顧客的貸款可推遲支付,但總能使顧客在有限的時(shí)間里得到貸款;(4)當(dāng)顧客得到所需的全部資金后,一定能在有限的時(shí)間里歸還所有的資金。操作系統(tǒng)按照銀行家制定的規(guī)則為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請(qǐng)資源是,要測(cè)試該進(jìn)程對(duì)資源的最大需求量,如果系統(tǒng)現(xiàn)存的資金可以滿足它的最大需求量,則按當(dāng)前的申請(qǐng)量分配資源,否則就推遲分配。當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請(qǐng)資源時(shí),先測(cè)試該進(jìn)程已占有的資源數(shù)與本次申請(qǐng)的資源數(shù)之和是否超過(guò)了該進(jìn)程對(duì)資源的最大需求量。若超過(guò)了最大需求量則拒絕分配資源,若沒(méi)有則再測(cè)試系統(tǒng)現(xiàn)存的資源能否滿足該進(jìn)程尚需的最大資源量,若能滿足則按當(dāng)前的申請(qǐng)量分配資源,否則也要延遲分配。3.系統(tǒng)分析3.1整個(gè)銀行家算法的思路先對(duì)用戶提出的請(qǐng)求進(jìn)行合法性檢查,再進(jìn)行預(yù)分配,利用安全性檢查算法進(jìn)行安全性檢查。3.2算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C++語(yǔ)言說(shuō)明3.2.1可利用資源向量intAvailable[M]M為資源的類(lèi)型。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申請(qǐng)各類(lèi)資源數(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ù)量,資源種類(lèi),各資源可用數(shù)量,各進(jìn)程已分配、最大需求各資源數(shù)量等3.3.2安全性算法調(diào)用函safe()檢查當(dāng)前資源分配狀態(tài)。3.3.3檢索用戶用bank()函數(shù),輸入用戶的請(qǐng)求三元組(I,J,K),為進(jìn)程I申請(qǐng)K個(gè)J類(lèi)資源。3.3.4檢查用戶請(qǐng)求檢查用戶請(qǐng)求是否小于還需求量,條件是K<=NEED[I,J]。如果條件不符則提示重新輸入,即不允許索取大于需求量。檢查用戶的請(qǐng)求是否小于系統(tǒng)中的可利用資源數(shù)量,條件是K<=AVALIABLE[I,J]。如果條件不符則申請(qǐng)失敗,阻塞該進(jìn)程,重新進(jìn)行進(jìn)程動(dòng)態(tài)資源申請(qǐng)(使用goto語(yǔ)句跳轉(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)程資源申請(qǐng)失敗進(jìn)入等待。否則不用回收,并檢查該進(jìn)程是否已獲得所有需要資源,如是則進(jìn)行其擁有資源釋放,語(yǔ)句如下:Available[j]=Available[j]+Allocation[k][j];Allocation[k][j]=0;3.4安全性檢查算法3.4.1設(shè)置兩個(gè)臨時(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如果查找成功則存儲(chǔ)安全序列并進(jìn)行資源的模擬回收FINISH[I]=1WORK[J]=WORK[J]+ALLOCATION[I][J];4.函數(shù)調(diào)用關(guān)系4.1程序流程圖開(kāi)始開(kāi)始請(qǐng)輸入資源數(shù)請(qǐng)輸入各類(lèi)資源可利用的數(shù)請(qǐng)輸入當(dāng)前資源可利用的數(shù)量請(qǐng)輸入當(dāng)前可分配的資源數(shù)量請(qǐng)輸入當(dāng)前已分配的資源數(shù)請(qǐng)輸入進(jìn)程對(duì)資源的最大需求數(shù)量Max≤資源數(shù)提示錯(cuò)誤系統(tǒng)當(dāng)前狀態(tài)統(tǒng)計(jì)結(jié)束4.2程序模塊劃分4.2.1字符判斷模塊判斷輸入的字符是否為數(shù)字,如果不是則提示出錯(cuò)并重新輸入,主要處理輸入為非數(shù)字時(shí)程序出現(xiàn)運(yùn)行錯(cuò)誤現(xiàn)象。此模塊功能由數(shù)字判斷函數(shù)(intshuzi(intsz);)實(shí)現(xiàn)。4.2.2程序初始化模塊用于程序開(kāi)始進(jìn)行初始化輸入數(shù)據(jù):進(jìn)程數(shù)量、資源種類(lèi)、各種資源可利用數(shù)量、各進(jìn)程的各種資源已分配數(shù)量、各進(jìn)程對(duì)各類(lèi)資源最大需求數(shù)等。此模塊功能在系統(tǒng)初始化函數(shù)(voidchushihua();)中實(shí)現(xiàn)。4.2.3當(dāng)前安全性檢查模塊用于判斷當(dāng)前狀態(tài)安全性,根據(jù)不同地方的調(diào)用提示處理不同,在安全性算函數(shù)(voidsafe();)中實(shí)現(xiàn)。4.2.4銀行家算法模塊進(jìn)行銀行家算法模擬實(shí)現(xiàn)的模塊,調(diào)用其他各個(gè)模塊進(jìn)行銀行家算法模擬過(guò)程,在銀行家算法函數(shù)(voidbank();)中實(shí)現(xiàn)。4.2.5顯示分配模塊顯示當(dāng)前資源分配詳細(xì)情況,包括:各種資源的總數(shù)量(all)、系統(tǒng)目前各種資源可用的數(shù)量、各進(jìn)程已經(jīng)得到的資源數(shù)量、各進(jìn)程還需要的資源量,在顯示分配情況函數(shù)(voidshowdata();)中實(shí)現(xiàn)。4.2.6簽名模塊:用于程序結(jié)束時(shí)顯示程序版權(quán)聲明簽名等,在簽名函數(shù)(voidsign();)中實(shí)現(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)程對(duì)各類(lèi)資源的最大需求數(shù)intNeed[y][y];//還需求矩陣intRequest[x];//申請(qǐng)各類(lèi)資源的數(shù)量intWork[x];//工作向量,表系統(tǒng)可提供給進(jìn)程運(yùn)行所需各類(lèi)資源數(shù)量intFinish[y];//表系統(tǒng)是否有足夠的資源分配給進(jìn)程,0為否,1為是intp[y];//存儲(chǔ)安全序列inti,j;//全局變量,主要用于循環(huán)語(yǔ)句中intn,m;//n為進(jìn)程的數(shù)量,m為資源種類(lèi)數(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<<……//顯示程序開(kāi)始提示信息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)不安全,無(wú)法申請(qǐng),程序退出!!!!!"<<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]<<")";//輸出安全序列,考慮顯示格式,先輸出第一個(gè)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整個(gè)銀行家算法的思路先對(duì)用戶提出的請(qǐng)求進(jìn)行合法性檢查,再進(jìn)行預(yù)分配,利用安全性檢查算法進(jìn)行安全性檢查。5.4.2算法用到的主要數(shù)據(jù)結(jié)構(gòu)和C語(yǔ)言說(shuō)明(1)可利用資源向量INTAVAILABLE[M]M為資源的類(lèi)型;(2)最大需求矩陣INTMAX[N][M]N為進(jìn)程的數(shù)量;(3)已分配矩陣INTALLOCATION[N][M];(4)還需求矩陣INTNEED[N][N];(5)申請(qǐng)各類(lèi)資源數(shù)量intRequest[x];(6)工作向量intWork[x]。(7)intFinish[y];//表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,0為否,非0為是5.4.3銀行家算法(1)系統(tǒng)初始化。輸入進(jìn)程數(shù)量,資源種類(lèi),各進(jìn)程已分配、還需求各資源數(shù)量,各資源可用數(shù)量等。(2)輸入用戶的請(qǐng)求三元組(I,J,K),為進(jìn)程I申請(qǐng)K個(gè)J類(lèi)資源。(3)檢查用戶的請(qǐng)求是否小于還需求的數(shù)量,條件是K<=NEED[I,J]。如果條件不符則提示重新輸入,即不允許索取大于需求量。(4)檢查用戶的請(qǐng)求是否小于系統(tǒng)中的可利用資源數(shù)量,條件是K<=AVALIABLE[I,J]。如果條件不符則申請(qǐng)失敗,阻塞該進(jìn)程,重新進(jìn)行進(jìn)程動(dòng)態(tài)資源申請(qǐng)(使用goto語(yǔ)句)。(5)進(jìn)行資源的預(yù)分配,語(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)行檢查,如果檢查通過(guò),則不回收,否則進(jìn)行回收,進(jìn)程資源申請(qǐng)失敗進(jìn)入等待。5.4.4安全性檢查算法(1)設(shè)置兩個(gè)臨時(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)行資源的模擬回收,語(yǔ)句如下WORK[J]=WORK[J]+ALLOCATION[I][J];FINISH[I]=1或查找到的順序號(hào).(4)、如果查找不成功,則檢查所有進(jìn)程的FINISH[],如果有一個(gè)為0,則系統(tǒng)不為0,返回不成功標(biāo)志。否則返回成功標(biāo)志。6.程序測(cè)試結(jié)果程序調(diào)試圖如下所示:顯示資源最大需求數(shù)界面資源管理界面需要資源數(shù)量界面7.心得體會(huì)在設(shè)計(jì)此程序的過(guò)程中,我遇到過(guò)許多問(wèn)題,也學(xué)到了很多東西。本程序的設(shè)計(jì)實(shí)現(xiàn)主要是用C++語(yǔ)言實(shí)現(xiàn),通過(guò)對(duì)程序算法的設(shè)計(jì)優(yōu)化、輸出顯示的格式設(shè)計(jì)、輸入過(guò)程中的異常處理等一些設(shè)計(jì)過(guò)程中的問(wèn)題的考慮解決,在C++學(xué)習(xí)上也有了很大的進(jìn)步。程序設(shè)計(jì)過(guò)程中開(kāi)始遇到的最大的問(wèn)題是算法的結(jié)構(gòu)設(shè)計(jì)問(wèn)題,課本上只給了設(shè)計(jì)要求及簡(jiǎn)單的算法,要真正實(shí)現(xiàn)還需要考慮很多方面。在算法的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)上考慮了很長(zhǎng)時(shí)間。在程序設(shè)計(jì)中先后參考了很多網(wǎng)絡(luò)資料,也參考了一些別人寫(xiě)的的程序,綜合這些算法思想和自己的思路對(duì)程序做了很好的設(shè)計(jì)方式,對(duì)一些算法的優(yōu)越性等也作了一些考慮。此外考慮最多的就是異常錯(cuò)誤處理的設(shè)計(jì)。一個(gè)好的程序必須能在各種環(huán)境下都有其相應(yīng)的處理方式,至少能應(yīng)對(duì)一些常見(jiàn)的可能發(fā)生的錯(cuò)誤。比如一般的要求輸入為數(shù)字時(shí),如果輸入了一個(gè)非數(shù)字字符,程序就會(huì)立即出錯(cuò)無(wú)法繼續(xù)運(yùn)行,本程序針對(duì)這個(gè)問(wèn)題設(shè)計(jì)了一個(gè)shuzi();函數(shù)進(jìn)行處理,處理方式為:接受鍵盤(pán)輸入的字符為字符串,然后對(duì)字符串的每個(gè)字符進(jìn)行判斷是否為數(shù)字,如果有非數(shù)字字符出現(xiàn)則提示出錯(cuò)并要求重新輸入。又如在判斷是否繼續(xù)時(shí)要求輸入Y/N時(shí),按一般的方式,如果輸入為多個(gè)字符,則多余的字符會(huì)保存在緩沖區(qū),到下次要求輸入時(shí)輸入而導(dǎo)致出錯(cuò),對(duì)此問(wèn)題設(shè)計(jì)處理方式為接受輸入字符保存為串然后只取其首字符進(jìn)行判斷。還有很多類(lèi)似的錯(cuò)誤處理。還有在設(shè)置程序的顯示優(yōu)化時(shí),發(fā)現(xiàn)暫停函數(shù)在不同的情況下執(zhí)行順序不同,如此等等。在課程設(shè)計(jì)過(guò)程中遇到了許多問(wèn)題,也向同宿舍的同學(xué)做了一些請(qǐng)教一起討論,也因此從他們身上學(xué)到了許多東西。8.主要參考文獻(xiàn)1.湯子瀛,哲鳳屏.《計(jì)算機(jī)操作系統(tǒng)》.西安電子科技大學(xué)學(xué)出版社.2.王清,李光明.《計(jì)算機(jī)操作系統(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)實(shí)驗(yàn)教程》.清華大學(xué)出版社.6.孟靜,

\o"操作系統(tǒng)教程--原理和實(shí)例分析"操作系統(tǒng)教程--原理和實(shí)例分析.高等教育出版社7.周長(zhǎng)林,\o"計(jì)算機(jī)操作系統(tǒng)教程"計(jì)算機(jī)操作系統(tǒng)教程.高等教育出版社8.張堯?qū)W,\o"計(jì)算機(jī)操作系統(tǒng)教程"計(jì)算機(jī)操作系統(tǒng)教程,清華大學(xué)出版社9.任滿杰,\o"操作系統(tǒng)原理實(shí)用教程"操作系統(tǒng)原理實(shí)用教程,電子工業(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)程對(duì)各類(lèi)資源的最大需求數(shù)intNeed[y][y];//還需求矩陣intRequest[x];//申請(qǐng)各類(lèi)資源的數(shù)量intWork[x];//工作向量,表示系統(tǒng)可提供給進(jìn)程繼續(xù)運(yùn)行所需的各類(lèi)資源數(shù)量intFinish[y];//表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,0為否,非0為是intp[y];//存儲(chǔ)安全序列inti,j;intn,m;//n為進(jìn)程的數(shù)量,m為資源種類(lèi)數(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;//臨時(shí)指針,存放輸入字符intlen;//存儲(chǔ)取字符的長(zhǎng)度sz=0;//清零chars;//do{//輸入賭注,只能輸入數(shù)字//gets(temp);//getline(cin,temp)cin>>temp;len=strlen(temp);//取字符長(zhǎng)度f(wàn)or(inti=0;i<len;i++){s=*(temp+i);if(s<'0'||s>'9'){cout<<"請(qǐng)輸入數(shù)字\n\n";cout<<"請(qǐng)重新輸入:";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<<"%%程序開(kāi)始,系統(tǒng)初始化輸入%%"<<endl;//<<endlcout<<"==============================================================="<<endl<<endl;cout<<"請(qǐng)輸入進(jìn)程的數(shù)量:";//從此開(kāi)始輸入有關(guān)數(shù)據(jù)n=shuzi(n);cout<<"請(qǐng)輸入資源種類(lèi)數(shù):";m=shuzi(m);cout<<endl<<endl<<"請(qǐng)輸入各種資源可利用的數(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<<"請(qǐng)輸入各進(jìn)程當(dāng)前已分配的資源數(shù)量Allocation["<<n<<"]["<<m<<"]:"<<endl<<endl;for(i=0;i<n;i++){for(j=0;j<m;j++){cout<<"請(qǐng)輸入進(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<<"請(qǐng)輸入各進(jìn)程對(duì)各類(lèi)資源的最大需求數(shù)Max["<<n<<"]["<<m<<"]:"<<endl<<endl;for(i=0;i<n;i++){for(j=0;j<m;j++){cout<<"請(qǐng)輸入進(jìn)程"<<i<<"對(duì)資源"<<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];//計(jì)算還需求量elseNeed[i][j]=0;//最大需求量小于已分配量時(shí)還需求量為0,即此類(lèi)資源已足夠不需再申請(qǐng)}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)程的每類(lèi)資源量都符合條件Work[j]>=Need[i][j]條件二p[l]=i;//存儲(chǔ)安全序列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時(shí)說(shuō)明滿足安全序列,即都符合條件Work[j]>=Need[i][j]i=-1;//從第一個(gè)進(jìn)程開(kāi)始繼續(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];//再加上每個(gè)進(jìn)程已分配量計(jì)算J類(lèi)資源總量}cout<<All[j]<<"";if((j+1)%5==0)cout<<endl;//每行顯示五個(gè)&&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;//每行最多顯示五個(gè)&&j!=0}cout<<endl<<endl;cout<<"%%各進(jìn)程已經(jīng)得到的資源量(allocation):"<<endl;//l1=0;//歸零for(i=0;i<=m/5;i++){//設(shè)計(jì)每行最多顯示五種資源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è)計(jì)每行顯示五種資源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();//等待鍵盤(pán)輸入,不返回任何值,用于設(shè)置程序運(yùn)行界面system("pause");//暫停比較兩種方式/*經(jīng)過(guò)在不同的編輯器中調(diào)試發(fā)現(xiàn),不同的調(diào)試器對(duì)函數(shù)執(zhí)行的順序有差別如在此處使用getch()和system("pause")函數(shù)時(shí),在visualc++6.0中先執(zhí)行此函數(shù)再顯示,而在dev-c++中則按順序執(zhí)行對(duì)此問(wèn)題我在很多地方搜索查找均未找到滿意的答案,本次換用調(diào)試器才發(fā)現(xiàn)理解--4.29本次調(diào)試格式時(shí),將換行命令"\n"改為endl時(shí),發(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中有這樣的一個(gè)inline函數(shù):inline_CRTIMPostream&__cdeclendl(ostream&_outs){return_outs<<'\n'<<flush;}也就是說(shuō)endl=return_outs<<'\n'<<flush;endl除了寫(xiě)'\n'進(jìn)外,還調(diào)用flush函數(shù),刷新緩沖區(qū),把緩沖區(qū)里的數(shù)據(jù)寫(xiě)入文件或屏幕,如果考慮效率就用'\n'*///cout<<"\t\t\t\t輸入任意字符結(jié)束";//處理最后生成EXE程序執(zhí)行問(wèn)題//cin>>l;cout<<"\t\t\t";}//===銀行家算法函數(shù)===voidbank(){cout<<"==============================================================="<<endl<<endl;cout<<"%%以下開(kāi)始為進(jìn)程進(jìn)行資源分配申請(qǐng)%%"<<endl<<endl;//===申請(qǐng)資源===intk=0;//用于輸入進(jìn)程編號(hào)boolr=false;//初值為假,輸入Y繼續(xù)申請(qǐng)則置為真do{//輸入請(qǐng)求cout<<"請(qǐng)輸入申請(qǐng)資源的進(jìn)程編號(hào)(輸入0--"<<n-1<<"之間):";k=shuzi(k);cout<<endl;while(k>n-1){//輸入異常處理cout<<endl<<"您輸入了錯(cuò)誤的進(jìn)程號(hào),請(qǐng)重新輸入!"<<endl;cout<<endl<<"請(qǐng)輸入申請(qǐng)資源的進(jìn)程編號(hào)(輸入0--"<<n-1<<"之間):";k=shuzi(k);cout<<endl;}cout<<endl<<"請(qǐng)輸入該進(jìn)程申請(qǐng)各類(lèi)資源的數(shù)量:"<<endl;for(j=0;j<m;j++){do{//do……while循環(huán)判斷申請(qǐng)輸入的情況cout<<"進(jìn)程"<<k<<"申請(qǐng)資源["<<j<<"]的數(shù)量:";Request[j]=shuzi(Request[j]);cout<<endl;if(Request[j]>Need[k][j]){//申請(qǐng)大于需求量時(shí)出錯(cuò),提示重新輸入(貸款數(shù)目不允許超過(guò)需求數(shù)目)cout<<"申請(qǐng)大于需要量!!!"<<endl;cout<<"您申請(qǐng)資源"<<j<<"的數(shù)量為"<<Request[j]<<",大于進(jìn)程"<<k<<"對(duì)該資源需求量"<<Need[k][j]<<"。"<<endl;cout<<"請(qǐng)重新輸入!!!"<<endl;}else//先判斷是否申請(qǐng)大于需求量,再判斷是否申請(qǐng)大于可利用量if(Request[j]>Available[j]){//申請(qǐng)大于可利用量,應(yīng)該阻塞等待?……???cout<<"\n沒(méi)有那么多資源,目前可利用資源"<<j<<"數(shù)量為"<<Available[j]<<",本次申請(qǐng)不成功,進(jìn)程等待!!!"<<endl;Finish[k]=0;//該進(jìn)程等待gotoppp;//goto語(yǔ)句跳轉(zhuǎn),結(jié)束本次申請(qǐng)}}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申請(qǐng)資源成功!!!"<<endl;//===========================================/*//如果該進(jìn)程所有需要的資源都已申請(qǐng)到,即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做下計(jì)數(shù)器for(j=0;j<m;j++){//釋放該進(jìn)程的所有資源Available[j]=Available[j]+Max[k][j];Allocation[k][j]=0;}}l=0;//歸零*///算法二:(相對(duì)第一種算法節(jié)省時(shí)間)for(j=0;j<m;j++){if(Need[k][j]==0);else{//有一種資源還沒(méi)全部申請(qǐng)到,則該進(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. 本站所有資源如無(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)論