




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、操作系統課程設計報告題目:銀行家算法 安全性算法院 (系):計算機科學與工程專 業:軟件工程班 級: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數據結構:64 詳細設計84.1主要函數的核心代碼:84.2系統主要過程流程圖84.3銀行家算法流程圖95 測試與分析105.1測試數據105.2銀行家算法的演示105.3分配資源由于大于可利用資源則失
2、敗。115.4 增加一個作業得到不安全序列。115.5分配資源由于大于最大資源則失敗。12附錄 源程序清單151 緒論1.1前言Dijkstra (1965)提出了一種能夠避免死鎖的調度算法,稱為銀行家算法。它的模型基于一個小城鎮的銀行家,他向一群客戶分別承諾了一定的貸款額度,每個客戶都有一個貸款額度,銀行家知道不可能所有客戶同時都需要最大貸款額,所以他只保留一定單位的資金來為客戶服務,而不是滿足所有客戶貸款需求的最大單位。這里將客戶比作進程,貸款比作設備,銀行家比作系統。客戶們各自做自己的生意,在某些時刻需要貸款。在某一時刻,客戶已獲得的貸款和可用的最大數額貸款稱為與資源分配相關的系統狀態。
3、一個狀態被稱為是安全的,其條件是存在一個狀態序列能夠使所有的客戶均得到其所需的貸款。如果忽然所有的客戶都申請,希望得到最大貸款額,而銀行家無法滿足其中任何一個的要求,則發生死鎖。不安全狀態并不一定導致死鎖,因為客戶未必需要其最大貸款額度,但銀行家不敢抱這種僥幸心理。銀行家算法就是對每一個請求進行檢查,檢查如果滿足它是否會導致不安全狀態。若是,則不滿足該請求;否則便滿足。檢查狀態是否安全的方法是看他是否有足夠的資源滿足一個距最大需求最近的客戶。如果可以,則這筆投資認為是能夠收回的,然后接著檢查下一個距最大需求最近的客戶,如此反復下去。如果所有投資最終都被收回,則該狀態是安全的,最初的請求可以批準
4、。1.2研究意義在多道程序系統中,多個進程的并發執行來改善系統的資源利用率,提高系統的吞吐量,但可能發生一種危險死鎖。所謂死鎖(Deadlock),是指多個進程在運行過程中因爭奪資源而造成的一種僵局(DeadlyEmbrace),當進程處于這種狀態時,若無外力作用,他們都無法在向前推進。要預防死鎖,有摒棄“請求和保持”條件,摒棄“不剝奪”條件,摒棄“環路等待”條件等方法。但是,在預防死鎖的幾種方法之中,都施加了較強的限制條件;而在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統性能。在該方法中把系統狀態分為安全狀態和不安全狀態,便可避免死鎖的發生。而最具代表性的避免死鎖的算法,
5、便是Dijkstra的銀行家算法。利用銀行家算法,我們可以來檢測CPU為進程分配資源的情況,決定CPU是否響應某進程的的請求并為其分配資源,從而很好避免了死鎖的產生。2 需求分析2.1題目描述 銀行家算法是一種最具有代表性的避免死鎖的算法。要解釋銀行家算法,必須先解釋操作系統的安全狀態和不安全狀態。所謂安全狀態,是指系統能按照某種進程順序P1,P2,,Pn(稱P1,P2,,Pn 序列為安全序列),來為每個進程Pi分配其所需資源,直至滿足每個進程對資源的最大需求,使每個進程都可以順利完成。安全狀態一定沒有死鎖發生。如果系統無法找到這樣一個安全序列,則稱系統處于不安全狀態。那么,什么是安全序列呢?
6、如果對每一個進程Pi(1<i<n),它以后尚需要的資源量不超過系統當前可利用的資源量與所有的進程Pj(j<n)所占有的資源量之和,則稱此進程序列P1,P2,,Pn是安全的,稱作安全序列。2.2銀行家算法 我們可以把操作系統看做是銀行家,操作系統管理的資源相當于銀行家管理的資金,進程向操作系統請求資源相當于客戶向銀行家貸款。操作系統按銀行家制定的規則為進程分配資源,當進程首次申請資源時,要測試該進程尚需求的資源量,若是系統現存的資源可以滿足它尚需求的資源量,則按當前的申請量來分配資源,否則就推遲分配。當進程在執行中繼續申請資源時,先測試該進程申請的資源量是否超過了它尚需的資源量
7、。若超過則拒絕分配,若沒有超過則再測試系統尚存的資源是否滿足該進程尚需的資源量,若滿足即可按當前的申請量來分配,若不滿足亦推遲分配。2.3基本要求(1)設計用來保存:可利用資源向量Available、最大需求矩陣 Max、分配矩陣 Allocation 、需求矩陣 Need。(2)編寫銀行家算法,安全性檢測算法。要求在不安全時輸出錯誤信息。(3)編寫輸出函數,能對進程申請后的系統狀態進行輸出。2.4目的根據設計題目的要求,充分地分析和理解題目,敘述系統的要求,明確程序要求實現的功能以及限制條件。明白自己需要用代碼實現的功能,清楚編寫每部分代碼的目的,做到有的放矢,有條理不遺漏的用代碼實現銀行家
8、算法。3 概要設計3.1算法思路: 先對用戶提出的請求進行合法性檢查,即檢查請求是否大于需要的,是否大于可利用的。若請求合法,則進行預分配,對分配后的狀態調用安全性算法進行檢查。若安全,則分配;若不安全,則拒絕申請,恢復到原來的狀態,拒絕申請。3.2銀行家算法步驟(1)如果Requesti=Need,則轉向步驟(2);否則,認為出錯,因為它所需要的資源數已超過它所宣布的最大值。(2)如果Requestor=Available,則轉向步驟(3);否則,表示系統中尚無足夠的資源,進程必須等待。(3)系統試探把要求的資源分配給進程Pi,并修改下面數據結構中的數值:Available=Availabl
9、e-Requesti;Allocation=Allocation+Request;Need=Need-Request;(4)系統執行安全性算法,檢查此次資源分配后,系統是否處于安全狀態。3.3安全性算法步驟(1)設置兩個向量工作向量Work。它表示系統可提供進程繼續運行所需要的各類資源數目,執行安全算法開始時,Work=Allocation;布爾向量Finish。它表示系統是否有足夠的資源分配給進程,使之運行完成,開始時先做Finishi=false,當有足夠資源分配給進程時,令Finishi=true。(2)從進程集合中找到一個能滿足下述條件的進程:Finishi=falseNeed<
10、 =Work;如找到,執行步驟(3);否則,執行步驟(4)。(3)當進程P獲得資源后,可順利執行,直至完成,并釋放出分配給它的資源,故應執行:Work=Work+Allocation;Finishi=true; 轉向步驟(2)。(4)如果所有進程的Finishi=true,則表示系統處于安全狀態;否則,系統處于不安全狀態。34數據結構:主要用到的數據結構:(1) 最大需求矩陣Max(2) 已分配矩陣Allocation(3) 仍需求矩陣Need=Max-Allocation(4) 可利用資源向量Available(5) 申請各類資源向量Request(6) 工作向量 work , Finish
11、(7)存放安全序列 temp(8) 存放系統可提供資源 work(9)資源的名字 name程序模塊: int main()/主函數void showdata()/顯示資源矩陣int changdata(int i)/進行資源分配int safe()/安全性算法void share()/利用銀行家算法對申請資源對進行判定void addresources()/添加資源void changeresources()/修改資源函數void addprocess()/添加作業各模塊間的調用關系:主函數void main()要調用: showdata(),safe(),addresources(),add
12、process(),changeresources(),changdata(int i)安全性檢測函數safe()銀行家算法函數share() 要調用 changdata(int i), showdata(),safe()4 詳細設計4.1主要函數的核心代碼:1. 進行初始化輸入的函數2. 輸出的函數3. 利用安全性算法進行檢測的函數4. 進行資源分配的函數5. 利用銀行家算法進行判定的函數 4.2系統主要過程流程圖圖4.1 主要流程圖4.3銀行家算法流程圖圖4.2 銀行家流程圖5 測試與分析5.1測試數據本次測試一共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結果截圖:圖5.15.2銀行家算法的演示進行資源的分配,為進程1分配了(1,0,2),進行安全算法得到如下的結果。圖5.25.3分配資源由于大于可利用資源則失敗。圖5.35.4 增加一個作業得到不安全序列。圖5.45.5分配資源由于大于最大資源則失敗。圖5.56 總結操作系統的基本特征是并發與共享。系統允許多個進程并發執行
14、,并且共享系統的軟、硬件資源。為了最大限度的利用計算機系統的資源,操作系統應采用動態分配的策略,但是這樣就容易因資源不足,分配不當而引起“死鎖”。而我本次課程設計就是得用銀行家算法來避免“死鎖”。銀行家算法就是一個分配資源的過程,使分配的序列不會產生死鎖。此算法的中心思想是:按該法分配資源時,每次分配后總存在著一個進程,如果讓它單獨運行下去,必然可以獲得它所需要的全部資源,也就是說,它能結束,而它結束后可以歸還這類資源以滿足其他申請者的需要。在程序當中,我們也得強調一下對輸入的合法性的判斷。比如,我們輸入的欲申請資源的進程號沒有在系統已存在的進程當中,或者進程號定義為整型,但是卻錯輸成字母等情
15、況,我們需要對這些情況進行判斷,讓程序報錯返回而并非因錯誤而中斷。這樣的情況處理起來比較麻煩,相當于對每次輸入針對各種不同的情況都得做判斷。我也沒有涵蓋全部的輸入,僅僅只是對輸入的進程號不在已存在進程當中、以及輸入的操作選擇不存在兩種情況分別作了判斷,并且針對第二種情況設定了五次輸入錯誤的話系統關閉的功能。而因為對于某些比如進程號本來設定就是整型,因此對輸入的是字母的判別因比較復雜而未能加上。總之,銀行家算法是避免死鎖的主要方法,其思路在很多方面都非常值得我們來學習借鑒。參考文獻1 湯小丹,梁紅兵,哲鳳屏,湯子瀛.計算機操作系統. 西安:西安電子科技大學出版社,2007.2 嚴蔚敏,吳偉民.數
16、據結構. 北京:清華大學出版社,2006.附錄 源程序清單#include<iostream.h>#include<string.h>#include<stdio.h>#define False 0#define True 1int Max100100=0;/各進程所需各類資源的最大需求int Avaliable100=0;/系統可用資源char name100=0;/資源的名稱int Allocation100100=0;/系統已分配資源int Need100100=0;/還需要資源int Request100=0;/請求資源向量int temp100=0
17、;/存放安全序列int Work100=0;/存放系統可提供資源int M=100;/作業的最大數為100int N=100;/資源的最大數為100void showdata()/顯示資源矩陣 int i,j; cout<<"系統目前可用的資源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;/變分配數 Finishi=True; tempk=i; i=-1; k+; flag+; for(i=0;i<M;i+) if(Finishi=False) cout<<"系統不安全"<<endl;/不成功系統不安全 return -1; cout<<"系統是安全的!"<<endl;/如果安全,輸出成功 cout<<"分配的序列:"
22、;for(i=0;i<M;i+)/輸出運行進程數組 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<<"申請的資源大于系統現在可利用的資源" cout<<" 分配出錯,不予分配!"<<endl; ch='n' break; if(ch='y') changdata(i);/根據進程需求量變換資源 showdat
25、a();/根據進程需求量顯示變換后的資源 safe();/根據進程需求量進行銀行家算法判斷 void addresources()/添加資源 int n,flag;cout<<"請輸入需要添加資源種類的數量:"cin>>n;flag=N;N=N+n;for(int i=0;i<n;i+) cout<<"名稱:" cin>>nameflag; cout<<"數量:" 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()/修改資源函數cout<<"系統目前可用的資源Avaliable:"<<endl; for(int i=0;i<N;i+) cout<<namei<<":"<<Avaliablei<<endl;cout<<"輸入系統可用資源Avaliable:"<<endl;cin>>Avaliable0>>Avaliable1>>Avaliable2;cout<<"
28、經修改后的系統可用資源為"<<endl;for (int k=0;k<N;k+) cout<<namek<<":"<<Avaliablek<<endl;showdata();safe();void addprocess()/添加作業 int flag=M;M=M+1;cout<<"請輸入該作業的最大需求量Max"<<endl;for(int i=0;i<N;i+) cout<<namei<<":" cin&
29、gt;>Maxflagi; Needflagi=Maxflagi-Allocationflagi;showdata();safe();int main()/主函數 int i,j,number,choice,m,n,flag;char ming;cout<<"*資源管理系統的設計與實現*"<<endl;cout<<"請首先輸入系統可供資源種類的數量 :"cin>>n;N=n;for(i=0;i<n;i+) cout<<"資源"<<i+1<<"的名稱:" cin>>ming; namei=ming; cout<<"資源的數量:" cin>>number; Avaliablei=number;cout<<endl;cout<<"請輸入作業的數量:"cin>>m;M=m; cout<<"請輸入各進程的最大需求量("<<m<<"*"<<n<<"矩陣)Max:"<&l
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論