win32中的c語言編程-銀行家算法_第1頁
win32中的c語言編程-銀行家算法_第2頁
win32中的c語言編程-銀行家算法_第3頁
win32中的c語言編程-銀行家算法_第4頁
win32中的c語言編程-銀行家算法_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、操作系統(tǒng)第七次實(shí)驗(yàn)張焓1. 實(shí)驗(yàn)名稱:項(xiàng)目:銀行家算法實(shí)現(xiàn)2. 實(shí)驗(yàn)?zāi)康模撼跏蓟捎脩糨斎霐?shù)據(jù),分別對可利用資源向量矩陣AVAILABLE、最大需求矩陣MAX、分配矩陣ALLOCATION、需求矩陣NEED賦值。銀行家算法銀行家算法在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統(tǒng)性能。在該方法中把系統(tǒng)的狀態(tài)分為安全狀態(tài)和不安全狀態(tài),只要能使系統(tǒng)始終都處于安全狀態(tài),便可以避免發(fā)生死鎖。銀行家算法的基本思想是分配資源之前,判斷系統(tǒng)是否是安全的;若是,才分配。它是最具有代表性的避免死鎖的算法。設(shè)進(jìn)程cusneed提出請求REQUEST i,則銀行家算法按如下規(guī)則進(jìn)行判斷。(1)如果

2、REQUEST cusneed i<= NEEDcusneedi,則轉(zhuǎn)(2);否則,出錯(cuò)。(2)如果REQUEST cusneed i<= AVAILABLEi,則轉(zhuǎn)(3);否則,等待。(3)系統(tǒng)試探分配資源,修改相關(guān)數(shù)據(jù):AVAILABLEi-=REQUESTcusneedi;ALLOCATIONcusneedi+=REQUESTcusneedi;NEEDcusneedi-=REQUESTcusneedi;(4)系統(tǒng)執(zhí)行安全性檢查,如安全,則分配成立;否則試探險(xiǎn)性分配作廢,系統(tǒng)恢復(fù)原狀,進(jìn)程等待。銀行家算法安全性檢查算法(1)設(shè)置兩個(gè)工作向量Work=AVAILABLE;FINI

3、SH(2)從進(jìn)程集合中找到一個(gè)滿足下述條件的進(jìn)程,F(xiàn)INISH=false;NEED<=Work;如找到,執(zhí)行(3);否則,執(zhí)行(4)(3)設(shè)進(jìn)程獲得資源,可順利執(zhí)行,直至完成,從而釋放資源。Work=Work+ALLOCATION;Finish=true;GOTO 2(4)如所有的進(jìn)程Finish= true,則表示安全;否則系統(tǒng)不安全。3. 實(shí)驗(yàn)方法(1) 首先編寫客戶進(jìn)程:包含需要用到的頭文件,聲明一些數(shù)據(jù)結(jié)構(gòu)為全局變量用于紀(jì)錄系統(tǒng)(資源或進(jìn)程)的當(dāng)前狀態(tài):#include<iostream>#include<string.h> #include<st

4、dio.h> using namespace std;#define False 0 #define True 1 int Max100100 = 0 ;/各進(jìn)程所需各類資源的最大需求int Avaliable100 = 0 ;/系統(tǒng)可用資源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;/作

5、業(yè)的最大數(shù)為100int N = 100;/資源的最大數(shù)為100 (2) 定義showdata()函數(shù)用于記錄當(dāng)前系統(tǒng)狀態(tài)的數(shù)據(jù)結(jié)構(gòu)的內(nèi)容:void 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 <

6、;< " "/輸出分配資源cout << endl;cout << "tMaxtAllocationtNeed" << endl;cout << "進(jìn)程名: "for (j = 0; j < 3; j+) for (i = 0; i < N; i+)cout << namei << " " cout << "t"cout << endl;for (i = 0; i < M; i

7、+) cout << " "cout << " " << i << " "for (j = 0; j < N; j+)cout << Maxij << " "cout << "t"for (j = 0; j < N; j+)cout << Allocationij << " "cout << "t"for (j = 0; j

8、< N; j+)cout << Needij << " "cout << endl;(3) 定義函數(shù)changdata(int),進(jìn)行資源分配后的狀態(tài)更新,用于資源申請函數(shù)中資源申請成功后的狀態(tài)更新。其中,函數(shù)參數(shù)i為進(jìn)程編號:int changdata(int i)/進(jìn)行資源分配 int j;for (j = 0; j<M; j+)Avaliablej = Avaliablej - Requestj;Allocationij = Allocationij + Requestj;Needij = Needij - Reques

9、tj;return 1;(4) 安全性檢測函數(shù),用于判斷當(dāng)前計(jì)算機(jī)系統(tǒng)是否處于安全狀態(tài),并輸出進(jìn)程根據(jù)銀行家算法得出的運(yùn)行順序:int safe()/安全性算法 int i, k = 0, m, apply, Finish100 = 0 ;int j;int flag = 0;Work0 = Avaliable0;Work1 = Avaliable1;Work2 = Avaliable2;for (i = 0; i<M; i+)apply = 0;for (j = 0; j < N; j+)if (Finishi = False&&Needij <= Work

10、j)apply+;if (apply = 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 <&

11、lt; "分配的序列:"for (i = 0; i<M; i+)/輸出運(yùn)行進(jìn)程數(shù)組cout << tempi;if (i<M - 1) cout << "->"cout << endl;return 0;(5) 定義資源申請函數(shù),用于錄入下一時(shí)刻哪個(gè)進(jìn)程對計(jì)算機(jī)系統(tǒng)申請哪些資源,并且會對該申請進(jìn)行判斷;如果當(dāng)前可用資源足以滿足申請(不大于當(dāng)前可用資源,不大于目前所需要的資源),則給予,如不能滿足,則不分配并提醒用戶,并在滿足進(jìn)程申請的情況下進(jìn)行安全性判定:void share()/可用此函數(shù)詢問需要為

12、某進(jìn)程分配哪些資源,并利用銀行家算法對申請資源的可行性對進(jìn)行判定char ch;int i = 0, j = 0;ch = 'y'cout << "請輸入要求分配的資源進(jìn)程號(0 - " << M - 1 << ") :"cin >> i;/輸入須申請的資源號cout << "請輸入進(jìn)程" << i << "申請的資源:" << endl;for (j = 0; j<N; j+)cout <&

13、lt; namej << ":"cin >> Requestj;/輸入需要申請的資源for (j = 0; j<N; j+)if (Requestj>Needij)/判斷申請是否大于需求,若大于則出錯(cuò)cout << "進(jìn)程" << i << "申請的資源大于它需要的資源"cout << "分配不合理,不予分配!" << endl;ch = 'n'break;elseif (Requestj>Aval

14、iablej)/判斷申請是否大于當(dāng)前資源,若大于則/出錯(cuò)cout << "進(jìn)程" << i << "申請的資源大于系統(tǒng)現(xiàn)在可利用的資源"cout << "分配出錯(cuò),不予分配!" << endl;ch = 'n'break;if (ch = 'y')changdata(i);/根據(jù)進(jìn)程需求量變換資源showdata();/根據(jù)進(jìn)程需求量顯示變換后的資源safe();/根據(jù)進(jìn)程需求量進(jìn)行銀行家算法判斷(6) 資源增加函數(shù),為計(jì)算機(jī)系統(tǒng)增加新的種類資

15、源,并指定其數(shù)量,并展示系統(tǒng)狀態(tài)、進(jìn)行安全性檢測: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();(7) 資源刪除函數(shù),

16、為計(jì)算機(jī)系統(tǒng)刪除某種種類資源,并展示系統(tǒng)狀態(tài)、進(jìn)行安全性檢測: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 << "該資源名稱不存在,請重新輸入:" while (flag);for (int j = i; j<N - 1; j+)namej =

17、 namej + 1;Avaliablej = Avaliablej + 1;N = N - 1;showdata();safe();(8) 資源修改函數(shù),為計(jì)算機(jī)系統(tǒng)修改所有資源的數(shù)量,并展示系統(tǒng)狀態(tài)、進(jìn)行安全性檢測:void changeresources() /修改資源函數(shù)cout << " 系統(tǒng)目前可用的資源Avaliable:" << endl;for (int i = 0; i<N; i+)cout << namei << ":" << Avaliablei <<

18、endl;cout << "輸入系統(tǒng)可用資源Avaliable:" << endl;for (int i = 0; i < N; i+)cin >> Avaliablei;cout << "經(jīng)修改后的系統(tǒng)可用資源為" << endl;for (int k = 0; k<N; k+)cout << namek << ":" << Avaliablek << endl;showdata();safe();(9) 作業(yè)增加

19、函數(shù),為計(jì)算機(jī)系統(tǒng)增加作業(yè)進(jìn)程,并指定其最大需求量,并展示系統(tǒng)狀態(tài)、進(jìn)行安全性檢測:void addprocess() /添加作業(yè)int flag = M;M = M + 1;cout << "請輸入該作業(yè)的最打需求量Max" << endl;for (int i = 0; i<N; i+)cout << namei << ":"cin >> Maxflagi;Needflagi = Maxflagi - Allocationflagi;showdata();safe();(10) 主函數(shù)

20、,首先,將資源名稱、數(shù)量,進(jìn)程的最大需求量、當(dāng)前占用量進(jìn)行定義:int main()int i, j, number, choice, m, n, flag;char ming;cout << "*資源管理系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)*" << endl;cout << "請首先輸入系統(tǒng)可供資源種類的數(shù)量:"cin >> n;N = n;for (i = 0; i<n; i+)cout << "資源" << i + 1 << "的名稱:"

21、cin >> ming;namei = ming;cout << "資源的數(shù)量:"cin >> number;if (number < 0 | number>100)cout << "錯(cuò)誤輸入,請輸入0-100內(nèi)的常數(shù)n"Avaliablei = number;cout << endl;cout << "請輸入作業(yè)的數(shù)量:"cin >> m;M = m;cout << "請輸入各進(jìn)程的最大需求量(" <

22、< m << "*" << n << "矩陣)Max:" << endl;for (i = 0; i<m; i+)for (j = 0; j<n; j+)cin >> Maxij;do flag = 0;cout << "請輸入各進(jìn)程已經(jīng)申請的資源量(" << m << "*" << n << "矩陣)Allocation:" << endl;fo

23、r (i = 0; i<m; i+)for (j = 0; j<n; j+)cin >> Allocationij;if (Allocationij>Maxij)flag = 1;Needij = Maxij - Allocationij;if (flag)cout << "錯(cuò)誤:申請的資源大于最大需求量,請重新輸入!n" while (flag);(11) 隨后更新可用資源量,并展示系統(tǒng)狀態(tài)、進(jìn)行安全性檢測:for (i = 0; i < n; i+)for (j = 0; j < m; j+)Avaliablei =

24、 Avaliablei - Allocationji;if (Avaliablei < 0)cout << "錯(cuò)誤:申請的資源大于系統(tǒng)資源總量!n"exit(EXIT_FAILURE);showdata();/顯示各種資源safe();/用銀行家算法判定系統(tǒng)是否安全(12) 進(jìn)入功能選擇菜單,并可按照提示進(jìn)一步執(zhí)行其他操作:choice = 1;while (choice)cout << "*銀行家算法演示*" << endl;cout << "1:增加資源" << e

25、ndl;cout << "2:刪除資源" << endl;cout << "3:修改資源" << endl;cout << "4:分配資源" << endl;cout << "5:增加作業(yè)" << endl;cout << "0:離開" << endl;cout << "*" << endl;cout << "請選擇功能號:"

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論