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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

8、算法。3 概要設計3.1算法思路: 先對用戶提出的請求進行合法性檢查,即檢查請求是否大于需要的,是否大于可利用的。若請求合法,則進行預分配,對分配后的狀態(tài)調(diào)用安全性算法進行檢查。若安全,則分配;若不安全,則拒絕申請,恢復到原來的狀態(tài),拒絕申請。3.2銀行家算法步驟(1)如果Requesti=Need,則轉(zhuǎn)向步驟(2);否則,認為出錯,因為它所需要的資源數(shù)已超過它所宣布的最大值。(2)如果Requestor=Available,則轉(zhuǎn)向步驟(3);否則,表示系統(tǒng)中尚無足夠的資源,進程必須等待。(3)系統(tǒng)試探把要求的資源分配給進程Pi,并修改下面數(shù)據(jù)結(jié)構(gòu)中的數(shù)值:Available=Availabl

9、e-Requesti;Allocation=Allocation+Request;Need=Need-Request;(4)系統(tǒng)執(zhí)行安全性算法,檢查此次資源分配后,系統(tǒng)是否處于安全狀態(tài)。3.3安全性算法步驟(1)設置兩個向量工作向量Work。它表示系統(tǒng)可提供進程繼續(xù)運行所需要的各類資源數(shù)目,執(zhí)行安全算法開始時,Work=Allocation;布爾向量Finish。它表示系統(tǒng)是否有足夠的資源分配給進程,使之運行完成,開始時先做Finishi=false,當有足夠資源分配給進程時,令Finishi=true。(2)從進程集合中找到一個能滿足下述條件的進程:Finishi=falseNeed<

10、 =Work;如找到,執(zhí)行步驟(3);否則,執(zhí)行步驟(4)。(3)當進程P獲得資源后,可順利執(zhí)行,直至完成,并釋放出分配給它的資源,故應執(zhí)行:Work=Work+Allocation;Finishi=true; 轉(zhuǎn)向步驟(2)。(4)如果所有進程的Finishi=true,則表示系統(tǒng)處于安全狀態(tài);否則,系統(tǒng)處于不安全狀態(tài)。34數(shù)據(jù)結(jié)構(gòu):主要用到的數(shù)據(jù)結(jié)構(gòu):(1) 最大需求矩陣Max(2) 已分配矩陣Allocation(3) 仍需求矩陣Need=Max-Allocation(4) 可利用資源向量Available(5) 申請各類資源向量Request(6) 工作向量 work , Finish

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

12、process(),changeresources(),changdata(int i)安全性檢測函數(shù)safe()銀行家算法函數(shù)share() 要調(diào)用 changdata(int i), showdata(),safe()4 詳細設計4.1主要函數(shù)的核心代碼:1. 進行初始化輸入的函數(shù)2. 輸出的函數(shù)3. 利用安全性算法進行檢測的函數(shù)4. 進行資源分配的函數(shù)5. 利用銀行家算法進行判定的函數(shù) 4.2系統(tǒng)主要過程流程圖圖4.1 主要流程圖4.3銀行家算法流程圖圖4.2 銀行家流程圖5 測試與分析5.1測試數(shù)據(jù)本次測試一共5個進程,分別為p0、p1、p2、p3、p4.,資源分配情況如下表:資源情況

13、進程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銀行家算法的演示進行資源的分配,為進程1分配了(1,0,2),進行安全算法得到如下的結(jié)果。圖5.25.3分配資源由于大于可利用資源則失敗。圖5.35.4 增加一個作業(yè)得到不安全序列。圖5.45.5分配資源由于大于最大資源則失敗。圖5.56 總結(jié)操作系統(tǒng)的基本特征是并發(fā)與共享。系統(tǒng)允許多個進程并發(fā)執(zhí)行

14、,并且共享系統(tǒng)的軟、硬件資源。為了最大限度的利用計算機系統(tǒng)的資源,操作系統(tǒng)應采用動態(tài)分配的策略,但是這樣就容易因資源不足,分配不當而引起“死鎖”。而我本次課程設計就是得用銀行家算法來避免“死鎖”。銀行家算法就是一個分配資源的過程,使分配的序列不會產(chǎn)生死鎖。此算法的中心思想是:按該法分配資源時,每次分配后總存在著一個進程,如果讓它單獨運行下去,必然可以獲得它所需要的全部資源,也就是說,它能結(jié)束,而它結(jié)束后可以歸還這類資源以滿足其他申請者的需要。在程序當中,我們也得強調(diào)一下對輸入的合法性的判斷。比如,我們輸入的欲申請資源的進程號沒有在系統(tǒng)已存在的進程當中,或者進程號定義為整型,但是卻錯輸成字母等情

15、況,我們需要對這些情況進行判斷,讓程序報錯返回而并非因錯誤而中斷。這樣的情況處理起來比較麻煩,相當于對每次輸入針對各種不同的情況都得做判斷。我也沒有涵蓋全部的輸入,僅僅只是對輸入的進程號不在已存在進程當中、以及輸入的操作選擇不存在兩種情況分別作了判斷,并且針對第二種情況設定了五次輸入錯誤的話系統(tǒng)關(guān)閉的功能。而因為對于某些比如進程號本來設定就是整型,因此對輸入的是字母的判別因比較復雜而未能加上??傊y行家算法是避免死鎖的主要方法,其思路在很多方面都非常值得我們來學習借鑒。參考文獻1 湯小丹,梁紅兵,哲鳳屏,湯子瀛.計算機操作系統(tǒng). 西安:西安電子科技大學出版社,2007.2 嚴蔚敏,吳偉民.數(shù)

16、據(jù)結(jié)構(gòu). 北京:清華大學出版社,2006.附錄 源程序清單#include<iostream.h>#include<string.h>#include<stdio.h>#define False 0#define True 1int Max100100=0;/各進程所需各類資源的最大需求int Avaliable100=0;/系統(tǒng)可用資源char name100=0;/資源的名稱int Allocation100100=0;/系統(tǒng)已分配資源int Need100100=0;/還需要資源int Request100=0;/請求資源向量int temp100=0

17、;/存放安全序列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+) cout<<namei<<" " cout<<endl; for (j=0;j<N;j+) cout<<Avaliablej<<" &quo

18、t;/輸出分配資源 cout<<endl; cout<<" Max Allocation Need"<<endl; cout<<"進程名 " for(j=0;j<3;j+) for(i=0;i<N;i+) cout<<namei<<" " cout<<" " cout<<endl; for(i=0;i<M;i+) cout<<" "<<i<<&qu

19、ot; " for(j=0;j<N;j+) cout<<Maxij<<" " cout<<" " for(j=0;j<N;j+) cout<<Allocationij<<" " cout<<" "for(j=0;j<N;j+) cout<<Needij<<" " cout<<endl; int changdata(int i)/進行資源分配 int j;for

20、(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 flag=0;Work0=Avaliable0;Work1=Avaliable1;Work2=Avaliable2;for(i=0;i<M;i+) a=0; for(j=0;j<N;j+) if (Finishi=False&&Need

21、ij<=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<<"系統(tǒng)不安全"<<endl;/不成功系統(tǒng)不安全 return -1; cout<<"系統(tǒng)是安全的!"<<endl;/如果安全,輸出成功 cout<<"分配的序列:"

22、;for(i=0;i<M;i+)/輸出運行進程數(shù)組 cout<<tempi; if(i<M-1) cout<<"->" cout<<endl; return 0;void share()/利用銀行家算法對申請資源對進行判定char ch;int i=0,j=0;ch='y'cout<<"請輸入要求分配的資源進程號(0-"<<M-1<<"):" cin>>i;/輸入須申請的資源號cout<<"請輸入

23、進程 "<<i<<" 申請的資源:"<<endl;for(j=0;j<N;j+) cout<<namej<<":" cin>>Requestj;/輸入需要申請的資源 for (j=0;j<N;j+) if(Requestj>Needij)/判斷申請是否大于需求,若大于則出錯 cout<<"進程 "<<i<<"申請的資源大于它需要的資源" cout<<" 分配不

24、合理,不予分配!"<<endl; ch='n' break; else if(Requestj>Avaliablej)/判斷申請是否大于當前資源,若大于則 /出錯 cout<<"進程"<<i<<"申請的資源大于系統(tǒng)現(xiàn)在可利用的資源" cout<<" 分配出錯,不予分配!"<<endl; ch='n' break; if(ch='y') changdata(i);/根據(jù)進程需求量變換資源 showdat

25、a();/根據(jù)進程需求量顯示變換后的資源 safe();/根據(jù)進程需求量進行銀行家算法判斷 void addresources()/添加資源 int n,flag;cout<<"請輸入需要添加資源種類的數(shù)量:"cin>>n;flag=N;N=N+n;for(int i=0;i<n;i+) cout<<"名稱:" cin>>nameflag; cout<<"數(shù)量:" cin>>Avaliableflag+;showdata();safe();void delr

26、esources()/刪除資源char ming;int i,flag=1;cout<<"請輸入需要刪除的資源名稱:"do cin>>ming;for(i=0;i<N;i+) if(ming=namei) flag=0; break; if(i=N) cout<<"該資源名稱不存在,請重新輸入:"while(flag);for(int j=i;j<N-1;j+) namej=namej+1; Avaliablej=Avaliablej+1; N=N-1;showdata();safe();void chan

27、geresources()/修改資源函數(shù)cout<<"系統(tǒng)目前可用的資源Avaliable:"<<endl; for(int i=0;i<N;i+) cout<<namei<<":"<<Avaliablei<<endl;cout<<"輸入系統(tǒng)可用資源Avaliable:"<<endl;cin>>Avaliable0>>Avaliable1>>Avaliable2;cout<<"

28、經(jīng)修改后的系統(tǒng)可用資源為"<<endl;for (int k=0;k<N;k+) cout<<namek<<":"<<Avaliablek<<endl;showdata();safe();void addprocess()/添加作業(yè) int flag=M;M=M+1;cout<<"請輸入該作業(yè)的最大需求量Max"<<endl;for(int i=0;i<N;i+) cout<<namei<<":" cin&

29、gt;>Maxflagi; Needflagi=Maxflagi-Allocationflagi;showdata();safe();int main()/主函數(shù) int i,j,number,choice,m,n,flag;char ming;cout<<"*資源管理系統(tǒng)的設計與實現(xiàn)*"<<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<<"請輸入各進程的最大需求量("<<m<<"*"<<n<<"矩陣)Max:"<&l

溫馨提示

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

最新文檔

評論

0/150

提交評論