銀行家算法課程設(shè)計(jì)_第1頁
銀行家算法課程設(shè)計(jì)_第2頁
銀行家算法課程設(shè)計(jì)_第3頁
銀行家算法課程設(shè)計(jì)_第4頁
銀行家算法課程設(shè)計(jì)_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、操作系統(tǒng)課程設(shè)計(jì)報(bào)告題目:銀行家算法 安全性算法院 (系):計(jì)算機(jī)科學(xué)與工程專 業(yè):軟件工程班 級:130608班學(xué) 生:姚駿川學(xué) 號(hào):130608118指導(dǎo)教師:姜虹 2015年12月28 目錄摘 要21 緒論11.1前言11.2研究意義12 需求分析32.1題目描述32.2銀行家算法32.3基本要求32.4目的33 概要設(shè)計(jì)53.1算法思路:53.2銀行家算法步驟53.3安全性算法步驟534數(shù)據(jù)結(jié)構(gòu):64 詳細(xì)設(shè)計(jì)84.1主要函數(shù)的核心代碼:84.2系統(tǒng)主要過程流程圖84.3銀行家算法流程圖95 測試與分析105.1測試數(shù)據(jù)105.2銀行家算法的演示105.3分配資源由于大于可利用資源則失

2、敗。115.4 增加一個(gè)作業(yè)得到不安全序列。115.5分配資源由于大于最大資源則失敗。12附錄 源程序清單15緒論1 緒論1.1前言Dijkstra (1965)提出了一種能夠避免死鎖的調(diào)度算法,稱為銀行家算法。它的模型基于一個(gè)小城鎮(zhèn)的銀行家,他向一群客戶分別承諾了一定的貸款額度,每個(gè)客戶都有一個(gè)貸款額度,銀行家知道不可能所有客戶同時(shí)都需要最大貸款額,所以他只保留一定單位的資金來為客戶服務(wù),而不是滿足所有客戶貸款需求的最大單位。這里將客戶比作進(jìn)程,貸款比作設(shè)備,銀行家比作系統(tǒng)??蛻魝兏髯宰鲎约旱纳?,在某些時(shí)刻需要貸款。在某一時(shí)刻,客戶已獲得的貸款和可用的最大數(shù)額貸款稱為與資源分配相關(guān)的系統(tǒng)狀

3、態(tài)。一個(gè)狀態(tài)被稱為是安全的,其條件是存在一個(gè)狀態(tài)序列能夠使所有的客戶均得到其所需的貸款。如果忽然所有的客戶都申請,希望得到最大貸款額,而銀行家無法滿足其中任何一個(gè)的要求,則發(fā)生死鎖。不安全狀態(tài)并不一定導(dǎo)致死鎖,因?yàn)榭蛻粑幢匦枰渥畲筚J款額度,但銀行家不敢抱這種僥幸心理。銀行家算法就是對每一個(gè)請求進(jìn)行檢查,檢查如果滿足它是否會(huì)導(dǎo)致不安全狀態(tài)。若是,則不滿足該請求;否則便滿足。檢查狀態(tài)是否安全的方法是看他是否有足夠的資源滿足一個(gè)距最大需求最近的客戶。如果可以,則這筆投資認(rèn)為是能夠收回的,然后接著檢查下一個(gè)距最大需求最近的客戶,如此反復(fù)下去。如果所有投資最終都被收回,則該狀態(tài)是安全的,最初的請求可以

4、批準(zhǔn)。1.2研究意義在多道程序系統(tǒng)中,多個(gè)進(jìn)程的并發(fā)執(zhí)行來改善系統(tǒng)的資源利用率,提高系統(tǒng)的吞吐量,但可能發(fā)生一種危險(xiǎn)死鎖。所謂死鎖(Deadlock),是指多個(gè)進(jìn)1詳細(xì)設(shè)計(jì)程在運(yùn)行過程中因爭奪資源而造成的一種僵局(DeadlyEmbrace),當(dāng)進(jìn)程處于這種狀態(tài)時(shí),若無外力作用,他們都無法在向前推進(jìn)。要預(yù)防死鎖,有摒棄“請求和保持”條件,摒棄“不剝奪”條件,摒棄“環(huán)路等待”條件等方法。但是,在預(yù)防死鎖的幾種方法之中,都施加了較強(qiáng)的限制條件;而在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統(tǒng)性能。在該方法中把系統(tǒng)狀態(tài)分為安全狀態(tài)和不安全狀態(tài),便可避免死鎖的發(fā)生。而最具代表性的避

5、免死鎖的算法,便是Dijkstra的銀行家算法。利用銀行家算法,我們可以來檢測CPU為進(jìn)程分配資源的情況,決定CPU是否響應(yīng)某進(jìn)程的的請求并為其分配資源,從而很好避免了死鎖的產(chǎn)生。7需求分析2 需求分析2.1題目描述 銀行家算法是一種最具有代表性的避免死鎖的算法。要解釋銀行家算法,必須先解釋操作系統(tǒng)的安全狀態(tài)和不安全狀態(tài)。所謂安全狀態(tài),是指系統(tǒng)能按照某種進(jìn)程順序P1,P2,,Pn(稱P1,P2,,Pn 序列為安全序列),來為每個(gè)進(jìn)程Pi分配其所需資源,直至滿足每個(gè)進(jìn)程對資源的最大需求,使每個(gè)進(jìn)程都可以順利完成。安全狀態(tài)一定沒有死鎖發(fā)生。如果系統(tǒng)無法找到這樣一個(gè)安全序列,則稱系統(tǒng)處于不安全狀態(tài)。

6、那么,什么是安全序列呢?如果對每一個(gè)進(jìn)程Pi(1<i<n),它以后尚需要的資源量不超過系統(tǒng)當(dāng)前可利用的資源量與所有的進(jìn)程Pj(j<n)所占有的資源量之和,則稱此進(jìn)程序列P1,P2,,Pn是安全的,稱作安全序列。2.2銀行家算法 我們可以把操作系統(tǒng)看做是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進(jìn)程向操作系統(tǒng)請求資源相當(dāng)于客戶向銀行家貸款。操作系統(tǒng)按銀行家制定的規(guī)則為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請資源時(shí),要測試該進(jìn)程尚需求的資源量,若是系統(tǒng)現(xiàn)存的資源可以滿足它尚需求的資源量,則按當(dāng)前的申請量來分配資源,否則就推遲分配。當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請資源時(shí),先測試該進(jìn)程申請的資源量

7、是否超過了它尚需的資源量。若超過則拒絕分配,若沒有超過則再測試系統(tǒng)尚存的資源是否滿足該進(jìn)程尚需的資源量,若滿足即可按當(dāng)前的申請量來分配,若不滿足亦推遲分配。2.3基本要求(1)設(shè)計(jì)用來保存:可利用資源向量Available、最大需求矩陣 Max、分配矩陣 Allocation 、需求矩陣 Need。(2)編寫銀行家算法,安全性檢測算法。要求在不安全時(shí)輸出錯(cuò)誤信息。(3)編寫輸出函數(shù),能對進(jìn)程申請后的系統(tǒng)狀態(tài)進(jìn)行輸出。2.4目的根據(jù)設(shè)計(jì)題目的要求,充分地分析和理解題目,敘述系統(tǒng)的要求,明確程序西安工業(yè)大學(xué)北方信息工程學(xué)院要求實(shí)現(xiàn)的功能以及限制條件。明白自己需要用代碼實(shí)現(xiàn)的功能,清楚編寫每部分代碼

8、的目的,做到有的放矢,有條理不遺漏的用代碼實(shí)現(xiàn)銀行家算法。概要設(shè)計(jì)3 概要設(shè)計(jì)3.1算法思路: 先對用戶提出的請求進(jìn)行合法性檢查,即檢查請求是否大于需要的,是否大于可利用的。若請求合法,則進(jìn)行預(yù)分配,對分配后的狀態(tài)調(diào)用安全性算法進(jìn)行檢查。若安全,則分配;若不安全,則拒絕申請,恢復(fù)到原來的狀態(tài),拒絕申請。3.2銀行家算法步驟(1)如果Requesti=Need,則轉(zhuǎn)向步驟(2);否則,認(rèn)為出錯(cuò),因?yàn)樗枰馁Y源數(shù)已超過它所宣布的最大值。(2)如果Requestor=Available,則轉(zhuǎn)向步驟(3);否則,表示系統(tǒng)中尚無足夠的資源,進(jìn)程必須等待。(3)系統(tǒng)試探把要求的資源分配給進(jìn)程Pi,并修

9、改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值:Available=Available-Requesti;Allocation=Allocation+Request;Need=Need-Request;(4)系統(tǒng)執(zhí)行安全性算法,檢查此次資源分配后,系統(tǒng)是否處于安全狀態(tài)。3.3安全性算法步驟(1)設(shè)置兩個(gè)向量工作向量Work。它表示系統(tǒng)可提供進(jìn)程繼續(xù)運(yùn)行所需要的各類資源數(shù)目,執(zhí)行安全算法開始時(shí),Work=Allocation;西安工業(yè)大學(xué)北方信息工程學(xué)院布爾向量Finish。它表示系統(tǒng)是否有足夠的資源分配給進(jìn)程,使之運(yùn)行完成,開始時(shí)先做Finishi=false,當(dāng)有足夠資源分配給進(jìn)程時(shí),令Finishi=true。(

10、2)從進(jìn)程集合中找到一個(gè)能滿足下述條件的進(jìn)程:Finishi=falseNeed< =Work;如找到,執(zhí)行步驟(3);否則,執(zhí)行步驟(4)。(3)當(dāng)進(jìn)程P獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應(yīng)執(zhí)行:Work=Work+Allocation;Finishi=true; 轉(zhuǎn)向步驟(2)。(4)如果所有進(jìn)程的Finishi=true,則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。34數(shù)據(jù)結(jié)構(gòu):3.4.1主要用到的數(shù)據(jù)結(jié)構(gòu):(1) 最大需求矩陣Max(2) 已分配矩陣Allocation(3) 仍需求矩陣Need=Max-Allocation(4) 可利用資源向量A

11、vailable(5) 申請各類資源向量Request(6) 工作向量 work , Finish(7)存放安全序列 temp(8) 存放系統(tǒng)可提供資源 work(9)資源的名字 name3.4.2程序模塊: int main()/主函數(shù)void showdata()/顯示資源矩陣int changdata(int i)/進(jìn)行資源分配int safe()/安全性算法void share()/利用銀行家算法對申請資源對進(jìn)行判定void addresources()/添加資源void changeresources()/修改資源函數(shù)void addprocess()/添加作業(yè)3.4.3各模塊間的調(diào)

12、用關(guān)系:主函數(shù)void main()要調(diào)用: showdata(),safe(),addresources(),addprocess(),changeresources(),changdata(int i)安全性檢測函數(shù)safe()銀行家算法函數(shù)share() 要調(diào)用 changdata(int i), showdata(),safe()詳細(xì)設(shè)計(jì)4 詳細(xì)設(shè)計(jì)4.1主要函數(shù)的核心代碼:1. 進(jìn)行初始化輸入的函數(shù)2. 輸出的函數(shù)3. 利用安全性算法進(jìn)行檢測的函數(shù)4. 進(jìn)行資源分配的函數(shù)5. 利用銀行家算法進(jìn)行判定的函數(shù) 4.2系統(tǒng)主要過程流程圖圖4.1 主要流程圖西安工業(yè)大學(xué)北方信息工程學(xué)院4.3

13、銀行家算法流程圖圖4.2 銀行家流程圖11測試與分析5 測試與分析5.1測試數(shù)據(jù)本次測試一共5個(gè)進(jìn)程,分別為p0、p1、p2、p3、p4.,資源分配情況如下表:資源情況進(jìn)程MaxA B CAllocationA B CNeedA B CAvailableA B CP07 5 30 1 07 4 33 3 2P13 2 22 0 01 2 2P20 9 23 0 26 0 0P32 2 22 1 10 1 1P44 3 30 0 24 3 1結(jié)果截圖:圖5.15.2銀行家算法的演示進(jìn)行資源的分配,為進(jìn)程1分配了(1,0,2),進(jìn)行安全算法得到如下的結(jié)果。西安工業(yè)大學(xué)北方信息工程學(xué)院圖5.25.3

14、分配資源由于大于可利用資源則失敗。圖5.35.4 增加一個(gè)作業(yè)得到不安全序列。圖5.45.5分配資源由于大于最大資源則失敗。圖5.513總結(jié)6 總結(jié)操作系統(tǒng)的基本特征是并發(fā)與共享。系統(tǒng)允許多個(gè)進(jìn)程并發(fā)執(zhí)行,并且共享系統(tǒng)的軟、硬件資源。為了最大限度的利用計(jì)算機(jī)系統(tǒng)的資源,操作系統(tǒng)應(yīng)采用動(dòng)態(tài)分配的策略,但是這樣就容易因資源不足,分配不當(dāng)而引起“死鎖”。而我本次課程設(shè)計(jì)就是得用銀行家算法來避免“死鎖”。銀行家算法就是一個(gè)分配資源的過程,使分配的序列不會(huì)產(chǎn)生死鎖。此算法的中心思想是:按該法分配資源時(shí),每次分配后總存在著一個(gè)進(jìn)程,如果讓它單獨(dú)運(yùn)行下去,必然可以獲得它所需要的全部資源,也就是說,它能結(jié)束,

15、而它結(jié)束后可以歸還這類資源以滿足其他申請者的需要。在程序當(dāng)中,我們也得強(qiáng)調(diào)一下對輸入的合法性的判斷。比如,我們輸入的欲申請資源的進(jìn)程號(hào)沒有在系統(tǒng)已存在的進(jìn)程當(dāng)中,或者進(jìn)程號(hào)定義為整型,但是卻錯(cuò)輸成字母等情況,我們需要對這些情況進(jìn)行判斷,讓程序報(bào)錯(cuò)返回而并非因錯(cuò)誤而中斷。這樣的情況處理起來比較麻煩,相當(dāng)于對每次輸入針對各種不同的情況都得做判斷。我也沒有涵蓋全部的輸入,僅僅只是對輸入的進(jìn)程號(hào)不在已存在進(jìn)程當(dāng)中、以及輸入的操作選擇不存在兩種情況分別作了判斷,并且針對第二種情況設(shè)定了五次輸入錯(cuò)誤的話系統(tǒng)關(guān)閉的功能。而因?yàn)閷τ谀承┍热邕M(jìn)程號(hào)本來設(shè)定就是整型,因此對輸入的是字母的判別因比較復(fù)雜而未能加上。

16、總之,銀行家算法是避免死鎖的主要方法,其思路在很多方面都非常值得我們來學(xué)習(xí)借鑒。參考文獻(xiàn)參考文獻(xiàn)1 湯小丹,梁紅兵,哲鳳屏,湯子瀛.計(jì)算機(jī)操作系統(tǒng). 西安:西安電子科技大學(xué)出版社,2007.2 嚴(yán)蔚敏,吳偉民.數(shù)據(jù)結(jié)構(gòu). 北京:清華大學(xué)出版社,2006.15附錄:原程序清單附錄 源程序清單#include<iostream.h>#include<string.h>#include<stdio.h>#define False 0#define True 1int Max100100=0;/各進(jìn)程所需各類資源的最大需求int Avaliable100=0;/系統(tǒng)

17、可用資源char name100=0;/資源的名稱int Allocation100100=0;/系統(tǒng)已分配資源int Need100100=0;/還需要資源int Request100=0;/請求資源向量int temp100=0;/存放安全序列int Work100=0;/存放系統(tǒng)可提供資源int M=100;/作業(yè)的最大數(shù)為100int N=100;/資源的最大數(shù)為100void showdata()/顯示資源矩陣 int i,j; cout<<"系統(tǒng)目前可用的資源Avaliable:"<<endl; for(i=0;i<N;i+) co

18、ut<<namei<<" " cout<<endl; for (j=0;j<N;j+) cout<<Avaliablej<<" "/輸出分配資源 cout<<endl; cout<<" Max Allocation Need"<<endl; cout<<"進(jìn)程名 " for(j=0;j<3;j+) for(i=0;i<N;i+) cout<<namei<<"

19、 " cout<<" " cout<<endl; for(i=0;i<M;i+) cout<<" "<<i<<" " for(j=0;j<N;j+) cout<<Maxij<<" " cout<<" " for(j=0;j<N;j+) cout<<Allocationij<<" " cout<<" "

20、;西安工業(yè)大學(xué)北方信息工程學(xué)院for(j=0;j<N;j+) cout<<Needij<<" " cout<<endl; int changdata(int i)/進(jìn)行資源分配 int j;for (j=0;j<M;j+) Avaliablej=Avaliablej-Requestj; Allocationij=Allocationij+Requestj; Needij=Needij-Requestj;return 1;int safe()/安全性算法int i,k=0,m,a,Finish100=0;int j;int fl

21、ag=0;Work0=Avaliable0;Work1=Avaliable1;Work2=Avaliable2;for(i=0;i<M;i+) a=0; for(j=0;j<N;j+) if (Finishi=False&&Needij<=Workj) a+; if(a=N) for(m=0;m<N;m+) Workm=Workm+Allocationim;/變分配數(shù) Finishi=True; tempk=i; i=-1; k+; flag+; for(i=0;i<M;i+) if(Finishi=False) cout<<"

22、;系統(tǒng)不安全"<<endl;/不成功系統(tǒng)不安全 return -1; cout<<"系統(tǒng)是安全的!"<<endl;/如果安全,輸出成功 cout<<"分配的序列:"for(i=0;i<M;i+)/輸出運(yùn)行進(jìn)程數(shù)組 cout<<tempi; if(i<M-1) cout<<"->" cout<<endl; return 0;void share()/利用銀行家算法對申請資源對進(jìn)行判定char ch;int i=0,j=0;ch

23、='y'cout<<"請輸入要求分配的資源進(jìn)程號(hào)(0-"<<M-1<<"):" cin>>i;/輸入須申請的資源號(hào)cout<<"請輸入進(jìn)程 "<<i<<" 申請的資源:"<<endl;for(j=0;j<N;j+) cout<<namej<<":" cin>>Requestj;/輸入需要申請的資源 for (j=0;j<N;j+) if(

24、Requestj>Needij)/判斷申請是否大于需求,若大于則出錯(cuò) cout<<"進(jìn)程 "<<i<<"申請的資源大于它需要的資源" cout<<" 分配不合理,不予分配!"<<endl; ch='n' break; else if(Requestj>Avaliablej)/判斷申請是否大于當(dāng)前資源,若大于則 /出錯(cuò) cout<<"進(jìn)程"<<i<<"申請的資源大于系統(tǒng)現(xiàn)在可利用的資源

25、" cout<<" 分配出錯(cuò),不予分配!"<<endl; ch='n' break; if(ch='y') changdata(i);/根據(jù)進(jìn)程需求量變換資源 showdata();/根據(jù)進(jìn)程需求量顯示變換后的資源 safe();/根據(jù)進(jìn)程需求量進(jìn)行銀行家算法判斷 void addresources()/添加資源 int n,flag;cout<<"請輸入需要添加資源種類的數(shù)量:"cin>>n;flag=N;N=N+n;for(int i=0;i<n;i+)

26、cout<<"名稱:" cin>>nameflag; cout<<"數(shù)量:" cin>>Avaliableflag+;showdata();safe();void delresources()/刪除資源char ming;int i,flag=1;cout<<"請輸入需要?jiǎng)h除的資源名稱:"do cin>>ming;for(i=0;i<N;i+) if(ming=namei) flag=0; break; if(i=N) cout<<"該

27、資源名稱不存在,請重新輸入:"while(flag);for(int j=i;j<N-1;j+) namej=namej+1; Avaliablej=Avaliablej+1; N=N-1;showdata();safe();void changeresources()/修改資源函數(shù)cout<<"系統(tǒng)目前可用的資源Avaliable:"<<endl; for(int i=0;i<N;i+) cout<<namei<<":"<<Avaliablei<<endl;c

28、out<<"輸入系統(tǒng)可用資源Avaliable:"<<endl;cin>>Avaliable0>>Avaliable1>>Avaliable2;cout<<"經(jīng)修改后的系統(tǒng)可用資源為"<<endl;for (int k=0;k<N;k+) cout<<namek<<":"<<Avaliablek<<endl;showdata();safe();void addprocess()/添加作業(yè) int f

29、lag=M;M=M+1;cout<<"請輸入該作業(yè)的最大需求量Max"<<endl;for(int i=0;i<N;i+) cout<<namei<<":" cin>>Maxflagi; Needflagi=Maxflagi-Allocationflagi;showdata();safe();int main()/主函數(shù) int i,j,number,choice,m,n,flag;char ming;cout<<"*資源管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)*"<&l

30、t;endl;cout<<"請首先輸入系統(tǒng)可供資源種類的數(shù)量 :"cin>>n;N=n;for(i=0;i<n;i+) cout<<"資源"<<i+1<<"的名稱:" cin>>ming; namei=ming; cout<<"資源的數(shù)量:" cin>>number; Avaliablei=number;cout<<endl;cout<<"請輸入作業(yè)的數(shù)量:"cin>>m;M=m; cout<<"請輸入各進(jìn)程的最大需求量("<<m<<"*"<<n<<"矩陣)Max:&

溫馨提示

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

最新文檔

評論

0/150

提交評論