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

下載本文檔

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

文檔簡介

1、<p><b>  摘 要</b></p><p>  銀行家算法是最有代表性的避免死鎖的算法,該算法由于能用于銀行系統(tǒng)現(xiàn)金貸款的發(fā)放而得名。銀行家算法是在確保當前系統(tǒng)安全的前提下推進的。對進程請求先進行安全性檢查,來決定資源分配與否,從而確保系統(tǒng)的安全,有效的避免了死鎖的發(fā)生。</p><p>  該設計在理解和分析了銀行家算法的核心思想以及狀態(tài)的本質(zhì)涵

2、義的前提下,對算法的實現(xiàn)在總體上進行了設計,包括在對算法分模塊設計,并對各個模塊的算法思想通過流程圖表示,分塊編寫代碼,并進行測試,最后進行程序的測試,在設計思路上嚴格按照軟件工程的思想執(zhí)行,確保了設計和實現(xiàn)的可行,可信。 </p><p>  關鍵詞:銀行家算法;死鎖;避免死鎖;安全性序列</p><p><b>  目 錄</b></p>&l

3、t;p><b>  1緒論1</b></p><p><b>  1.1課題背景1</b></p><p>  1.2 課題意義1</p><p>  1.3 銀行家算法原理1</p><p><b>  1.4 死鎖2</b></p><p

4、>  1.5安全性序列2</p><p><b>  2需求分析3</b></p><p>  2.1 問題描述3</p><p>  2.2 基本要求3</p><p>  2.3死鎖的預防3</p><p><b>  3 設計思路4</b></p

5、><p><b>  3.1設計原理4</b></p><p><b>  3.2設計目的4</b></p><p>  3.3各模塊之間的調(diào)用圖4</p><p><b>  4詳細設計5</b></p><p>  4.1初始化程序設計5<

6、;/p><p>  4.2銀行家算法設計5</p><p>  4.3安全性檢查算法6</p><p><b>  4.4流程圖7</b></p><p>  5運行調(diào)試及結果說明8</p><p><b>  6總結11</b></p><p>

7、;<b>  參考文獻12</b></p><p><b>  致 謝13</b></p><p>  附錄(源程序):14</p><p><b>  1緒論</b></p><p><b>  1.1課題背景</b></p>&l

8、t;p>  在多道程序系統(tǒng)中,雖可以借助多個進程的并發(fā)執(zhí)行來改善系統(tǒng)的資源利用率,提高系統(tǒng)吞吐量,但可能發(fā)生一種危險——死鎖,即多個進程在運行過程中因爭奪資源而造成的一種僵局,若無外力作用,將無法再向前推進。如此,尋求一種避免死鎖的方法便顯得有為重要。死鎖的產(chǎn)生一般的原因有兩點:競爭資源和進程間推進順序非法。因此,我們只需在當前的有限資源下,找到一組合法的執(zhí)行順序,便能很好的避免死鎖,我們稱它為安全序列。而銀行家算法起源于銀行系統(tǒng)

9、的發(fā)放貸款,和計算機操作系統(tǒng)的資源分配完全符合,因此可以借鑒該算法的思想,設計出一種有效的算法程序,解決該問題。</p><p><b>  1.2 課題意義</b></p><p>  (1)運用操作系統(tǒng)學過的知識和方法設計和實現(xiàn),又是一次實戰(zhàn)演練,從而提高自己的分析問題,解決問題和動手能力;</p><p> ?。?)通過整個算法的設計與實

10、現(xiàn)進一步加深了對算法的理解和多道程序下的計算機系統(tǒng)資源分配現(xiàn)狀,為以后進一步的學習打下了良好的基礎。</p><p>  1.3 銀行家算法原理</p><p>  為保證資金的安全,銀行家規(guī)定:</p><p>  (1) 當一個顧客對資金的最大需求量不超過銀行家現(xiàn)有的資金時就可接納該顧客;</p><p>  (2) 顧客可以分歧貸款,但

11、貸款的總數(shù)不能超過最大需求量;</p><p>  (3) 當銀行家現(xiàn)有的資金不能滿足顧客尚需的貸款數(shù)額時,對顧客的貸款可推遲支付,但總能使顧客在有限的時間里得到貸款;</p><p>  (4) 當顧客得到所需的全部資金后,一定能在有限的時間里歸還所有的資金,操作系統(tǒng)按照銀行家制定的規(guī)則為進程分配資源,當進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最

12、大需求量則按當前的申請量分配資源,否則就推遲分配。當進程在執(zhí)行中繼續(xù)申請資源時,先測試該進程已占用的資源數(shù)與本次申請的資源數(shù)之和是否超過了該進程對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統(tǒng)現(xiàn)存的資源能否滿足該進程尚需的最大資源量,若能滿足則按當前的申請量分配資源,否則也要推遲分配。</p><p><b>  1.4 死鎖</b></p><p>

13、  死鎖是進程死鎖的簡稱,是由Dijkstra于1965年研究銀行家算法時首先提出來的。是指多個進程循環(huán)等待它方占有的資源而無限期地僵持下去的局面。很顯然,如果沒有外力的作用,那麼死鎖涉及到的各個進程都將永遠處于封鎖狀態(tài)。</p><p>  它是計算機操作系統(tǒng)乃至并發(fā)程序設計中最難處理的問題之一。實際上,死鎖問題不僅在計算機系統(tǒng)中存在,在我們?nèi)粘I钪兴矎V泛存在。</p><p>  

14、在計算機系統(tǒng)中,涉及軟件,硬件資源都可能發(fā)生死鎖。例如:系統(tǒng)中只有一臺CD-ROM驅動器和一臺打印機,某一個進程占有了CD-ROM驅動器,又申請打印機;另一進程占有了打印機,還申請CD-ROM。結果,兩個進程都被阻塞,永遠也不能自行解除。</p><p><b>  1.5安全性序列</b></p><p>  安全序列的的實際意義在于:系統(tǒng)每次進行資源分配后,如果對

15、于系統(tǒng)中新的資源狀況,存在一個安全序列,則至少存在一條確保系統(tǒng)不會進入死鎖的路徑。按照該序列,銀行家可以實施一個有效的分配過程使得所有客戶得到滿足。</p><p>  銀行家算法的核心在于安全序列的產(chǎn)生。安全序列正是一種安全的進程推進順序。</p><p><b>  2需求分析</b></p><p><b>  2.1 問題描述

16、</b></p><p>  運用銀行家算法,避免死鎖的發(fā)生。在確保當前系統(tǒng)安全的前提下推進的。對進程請求先進行安全性檢查,來決定資源分配與否,從而確保系統(tǒng)的安全,有效的避免了死鎖的發(fā)生。</p><p>  問題的關鍵在于安全性算法,即找安全性序列。</p><p><b>  2.2 基本要求</b></p>&l

17、t;p> ?。?)從鍵盤輸入當前系統(tǒng)的資源信息,包括當前可用資源,每個進程對各類資源的最大需求量,每個進程當前已分配的各個資源量和每個進程尚需要的各個資源量,輸出結果顯示在DOS界面上;</p><p> ?。?)輸入進程請求,按照設計好的安全性算法進行檢查,得到結果并輸出整個執(zhí)行過程的相關信息和最終結果(主要包括資源分配表和安全序列)</p><p> ?。?)要求要有各種異常的處

18、理,程序的可控制性和可連續(xù)性執(zhí)行。包括對進程的存在有無檢查,請求向量的不合法檢查,試分配失敗后的數(shù)據(jù)恢復和重新接受進程請求等。</p><p><b>  2.3死鎖的預防</b></p><p>  出現(xiàn)死鎖有4個必要條件,只要確保至少一個必要條件不成立,就能預防死鎖發(fā)生。</p><p> ?。?)互斥。通常不能通過否定互斥條件來預防死鎖。

19、有些資源本身是非共享的。</p><p>  (2)占有并等待。當一個進程申請一個資源時,它不能占有其他資源。執(zhí)行前申請并獲得所有資源申請其他資源之前,必須釋放其現(xiàn)在已分配的所有資源,缺點是資源利用率可能比較低,可能發(fā)生饑餓。</p><p>  (3)非搶占。如果一個進程占有資源并申請另一個不能立即分配的資源,那么其現(xiàn)已分配的資源都被搶占。通常應用于其狀態(tài)可以保存和恢復的資源,如CPU寄

20、存器和內(nèi)存空間,不能適用于其他資源如打印機和磁帶驅動器。</p><p><b>  3 設計思路</b></p><p><b>  3.1設計原理</b></p><p>  我們可以把操作系統(tǒng)看作是銀行家,操作系統(tǒng)管理的資源相當于銀行家管理的資金,進程向操作系統(tǒng)請求分配資源相當于用戶向銀行家貸款。操作系統(tǒng)按照銀行家制

21、定的規(guī)則為進程分配資源,當進程首次申請資源時,要測試該進程對資源的最大需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量則按當前的申請量分配資源,否則就推遲分配。當進程在執(zhí)行中繼續(xù)申請資源時,先測試該進程已占用的資源數(shù)與本次申請的資源數(shù)之和是否超過了該進程對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統(tǒng)現(xiàn)存的資源能否滿足該進程尚需的最大資源量,若能滿足則按當前的申請量分配資源,否則也要推遲分配。</p>&l

22、t;p><b>  3.2設計目的</b></p><p>  學生通過該題目的設計過程,掌握銀行家算法實現(xiàn)的原理、軟件開發(fā)方法。模擬實現(xiàn)銀行家算法,用銀行家算法實現(xiàn)資源分配并提高解決實際問題的能力。</p><p>  3.3各模塊之間的調(diào)用圖</p><p>  圖3.1各模塊之間的調(diào)用圖</p><p>&l

23、t;b>  4詳細設計</b></p><p>  4.1初始化程序設計</p><p>  由用戶輸入數(shù)據(jù),分別對可利用資源向量矩陣AVAILABLE、最大需求矩陣MAX、分配矩陣ALLOCATION、需求矩陣NEED賦值。</p><p>  程序使用的全局變量:</p><p>  #define MAXPROCESS

24、 50 /*最大進程數(shù)*/ </p><p>  #define MAXRESOURCE 100 /*最大資源數(shù)*/</p><p>  int AVAILABLE[MAXRESOURCE]; /*可用資源數(shù)組*/</p><p>  int MAX[MAX

25、PROCESS][MAXRESOURCE]; /*最大需求矩陣*/</p><p>  int ALLOCATION[MAXPROCESS][MAXRESOURCE]; /*分配矩陣*/</p><p>  int NEED[MAXPROCESS][MAXRESOURCE]; /*需求矩陣*/</p><p>  int REQUEST[MAXP

26、ROCESS][MAXRESOURCE];//進程需要資源數(shù)</p><p>  int SUMMIT[MAXRESOURCE]={0} ; /*各種資源總量*/</p><p>  int NEEDc[MAXRESOURCE]={0}; /*輔助向量*/</p><p>  bool FINISH[MAXPROCESS];

27、 /*系統(tǒng)是否有足夠的資源分配*/</p><p>  int p[MAXPROCESS]; /*記錄序列*/</p><p>  int m,n; /*m個進程,n個資源*/</p><p>  4.2銀行家算法設計</p><p>  在避免死鎖的方法中,所施加的限

28、制條件較弱,有可能獲得令人滿意的系統(tǒng)性能。在該方法中把系統(tǒng)的狀態(tài)分為安全狀態(tài)和不安全狀態(tài),只要能使系統(tǒng)始終都處于安全狀態(tài),便可以避免發(fā)生死鎖。銀行家算法的基本思想是分配資源之前,判斷系統(tǒng)是否是安全的;若是,才分配。</p><p>  設進程cusneed提出請求REQUEST [i],則銀行家算法按如下規(guī)則進行判斷。</p><p>  (1)如果REQUEST [cusneed] [i

29、]<= NEED[cusneed][i],則轉(2);否則,出錯。</p><p>  (2)如果REQUEST [cusneed] [i]<= AVAILABLE[cusneed][i],則轉(3);否則,出錯。</p><p>  (3)系統(tǒng)試探分配資源,修改相關數(shù)據(jù):</p><p>  AVAILABLE[i]-=REQUEST[cusneed]

30、[i];</p><p>  ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];</p><p>  NEED[cusneed][i]-=REQUEST[cusneed][i];</p><p>  (4)系統(tǒng)執(zhí)行安全性檢查,如安全,則分配成立;否則試探險性分配作廢,系統(tǒng)恢復原狀,進程等待。</p><p&g

31、t;  (5)對于某一進程i,若對所有的j,有NEED[i][j]=0,則表此進程資源分配完畢,應將占用資源釋放。</p><p>  4.3安全性檢查算法</p><p>  (1)設置兩個工作向量Work=AVAILABLE;FINISH</p><p>  (2)從進程集合中找到一個滿足下述條件的進程,</p><p>  FINISH

32、==false;</p><p>  NEED<=Work;</p><p>  如找到,執(zhí)行(3);否則,執(zhí)行(4)</p><p>  (3)設進程獲得資源,可順利執(zhí)行,直至完成,從而釋放資源。</p><p>  Work+=ALLOCATION;</p><p>  Finish=true;</p&

33、gt;<p><b>  GOTO 2</b></p><p>  (4)如所有的進程Finish= true,則表示安全;否則系統(tǒng)不安全。</p><p><b>  4.4流程圖</b></p><p>  圖4.1程序設計流程圖</p><p>  5運行調(diào)試及結果說明</

34、p><p>  初始化時若已分配資源多于最多所需資源則會報錯,需重新輸入(如圖5.1所示):</p><p><b>  圖5.1為輸入報錯</b></p><p>  初始化后狀態(tài)顯示圖5.2</p><p><b>  圖5.2為正確輸入</b></p><p>  資源分配

35、時請求量超過需求量或現(xiàn)有資源數(shù)同樣會報錯(如圖5.3)</p><p>  圖5.3為超出需求量報錯顯示</p><p>  特殊情況:若申請資源數(shù)既不大于資源需求量,又不大于現(xiàn)有資源數(shù),但仍有可能導致死鎖,如上圖所示。此時會顯示系統(tǒng)不安全,請求被拒絕。</p><p>  圖5.4為拒絕分配資源</p><p>  Sum=0,表某一進程資

36、源分配完畢,資源釋放(請結合圖5.4)</p><p>  圖5.5資源分配完畢資源釋放</p><p><b>  6總結</b></p><p>  本次設計中首先要解決的問題是對所做題目的理解。簡單的文字描述總是生澀難懂,像銀行家算法這一問題,如果單看題目要求往往不知如何下手,更不要談下一步的設計過程。但倘若聯(lián)系實際生活中銀行貸款這一現(xiàn)象

37、,再來看問題時,一切開始顯得清晰,再加上老師的指點,便可以把自己究竟該作何工作搞清楚。這也給我一啟示,我們要解決的諸多問題都源自生活,若要解決它,聯(lián)系實際是個很不錯的選擇。</p><p>  明白了需求,下一個難點是如何通過軟件實現(xiàn)。我所做的銀行家算法這一題目,為了防止死鎖,需要進行大量的判斷,這也導致了一個問題,即在進行調(diào)試時,一旦出現(xiàn)問題,往往難以找到問題所在,針對這一問題,我編寫了一些監(jiān)測行(請參看源程序

38、),這樣能比較容易的找到問題的原因所在,這也是此次課程設計中在編程方面的一個收獲。</p><p>  通過本次課程設計,我對軟件的開發(fā)的過程有了較為深入的了解,雖然只是對一個問題的簡單模擬,但麻雀雖小五臟俱全,我對相關問題的解決已經(jīng)有了一定的認識,對軟件技術這門課程也有了更為透徹的感悟。本次課程設計,鍛煉了我分析問題和解決問題的能力,為今后相關問題的解決積累了寶貴經(jīng)驗,也增強了自己的耐心與自信,受益匪淺。<

39、;/p><p><b>  參考文獻</b></p><p>  [1] 嚴蔚敏,吳偉民.數(shù)據(jù)結構(C語言版).清華大學出版社.1999年 </p><p>  [2] 湯小丹,梁紅兵,哲鳳屏,湯子嬴.計算機操作系統(tǒng)(第三版).西安電子科技大學出版社;</p><p>  [3] 湯子瀛,哲鳳屏.計算機操作系統(tǒng)[M].西安:

40、西安電子科技大學學出版社.1996年</p><p>  [4] 王萬森.計算機操作系統(tǒng)原理[M].北京:高等教育出版社.2001年</p><p>  [5] 周長林,左萬歷.計算機操作系統(tǒng)教程[M].北京:高等教育出版社.1994年</p><p>  [6] 黃廷輝,王宇英.計算機操作系統(tǒng)實踐教程[M].北京:清華大學出版社. 2007年5月</p>

41、;<p>  [7] 殷兆麟.計算機操作系統(tǒng)[M].北京:清華大學出版社.2007年3月</p><p>  [8] 張堯學,史美林,張高.計算機操作系統(tǒng)教程[M].北京:清華大學出版社.1993年</p><p><b>  致 謝</b></p><p>  在這次操作系統(tǒng)銀行家算法實現(xiàn)程序設計中,我得到了馬生菊老師的認真指

42、導和幫助,同時也感謝我的隊友劉城輝同學,因為他才提高了我設計進度和效率。我和劉城輝同學共同完成這次課程設計,在程序設計過程中難免會遇到各種問題,謝謝馬老師的耐心指導,謝謝同伴的包容,在這次課程設計中我感覺我有了很大的提高,我相信自己以后會做得更好。</p><p>  通過本次設計,我的知識領域得到了進一步擴展,專業(yè)技能進一步提高,同時增強了分析和解決實際問題的綜合能力。首先,我們要感謝學校給我們提供了此次課程設

43、計的機會,能讓我們在一起學習與研究,讓我們有機會對所學的理論知識進行實踐。</p><p>  最后,在我設計完成后對程序的測試,并在同學與隊友的幫助下才得以完成沒有他們,也許就難以發(fā)現(xiàn)一些潛在的錯誤,在此一并表示感謝。</p><p><b>  附錄(源程序):</b></p><p>  #include <iostream>

44、</p><p>  #include <windows.h> </p><p>  #include <time.h> </p><p>  using namespace std;</p><p>  #define MAXPROCESS 50 /*最大進程數(shù)*/ &

45、lt;/p><p>  #define MAXRESOURCE 100 /*最大資源數(shù)*/</p><p>  int AVAILABLE[MAXRESOURCE]; /*可用資源數(shù)組*/</p><p>  int MAX[MAXPROCESS][MAXRESOURCE];

46、/*最大需求矩陣*/</p><p>  int ALLOCATION[MAXPROCESS][MAXRESOURCE]; /*分配矩陣*/</p><p>  int NEED[MAXPROCESS][MAXRESOURCE]; /*需求矩陣*/</p><p>  int REQUEST[MAXPROCESS][MAXRESOURCE

47、]; /*進程需要資源數(shù)*/</p><p>  int SUMMIT[MAXRESOURCE]={0} ; /*各種資源總量*/</p><p>  int NEEDc[MAXRESOURCE]={0}; /*輔助向量*/</p><p>  bool FINISH[MAXPROCESS];

48、 /*系統(tǒng)是否有足夠的資源分配*/</p><p>  int p[MAXPROCESS]; /*記錄序列*/</p><p>  int m,n; /*m個進程,n個資源*/</p><p>  void Init();&l

49、t;/p><p>  bool Safe();</p><p>  void Bank();</p><p>  void main()</p><p><b>  { </b></p><p>  system("color 01f"); //設置當前窗口的背景色和前景色 0

50、= 黑色 8 = 灰色 </p><p><b>  Init();</b></p><p><b>  Safe();</b></p><p><b>  Bank();</b></p><p><b>  }</b></p><p&

51、gt;  void Init() /*初始化算法*/</p><p><b>  {int i,j;</b></p><p>  cout<<" "<<endl;</p><p>  cout<<"

52、 銀行家算法模擬"<<endl;</p><p>  cout<<" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;</p><p>  cout<<"

53、 "<<endl;</p><p>  cout<<" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;</p>

54、<p>  cout<<" "<<endl;</p><p>  cout<<" 算法簡介:"<<endl;</p><p>  cout<<" 在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意"<<e

55、ndl;</p><p>  cout<<" 的系統(tǒng)性能。在該方法中把系統(tǒng)的狀態(tài)分為安全狀態(tài)和不安全狀態(tài),只要"<<endl;</p><p>  cout<<" 能使系統(tǒng)始終都處于安全狀態(tài),便可以避免發(fā)生死鎖"<<endl;</p><p>  cout&l

56、t;<" 銀行家算法的基本思想是分配資源之前,判斷系統(tǒng)是否是安全的;若是"<<endl;</p><p>  cout<<" ,才分配。它是最具有代表性的避免死鎖的算法。"<<endl;</p><p>  cout<<" "<<e

57、ndl;</p><p>  cout<<" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;</p><p>  cout<<" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

58、~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;</p><p>  cout<<" "<<endl;</p><p>  cout<<" 請稍候...6秒后跳入主界面" <<endl;</p&g

59、t;<p>  Sleep(6000); </p><p>  system("cls"); </p><p>  cout<<" "<<endl;</p><p>  cout <<" 運行界面&

60、quot;<<endl; </p><p>  cout<<">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

61、>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"<<endl;</p><p>  cout<<"

62、請輸入進程的數(shù)目:"<<endl;</p><p><b>  cin>>m;</b></p><p>  cout<<"請輸入資源的種類:"<<endl;</p><p><b>  cin>>n;</b></p>&

63、lt;p>  cout<<"請輸入每個進程最多所需的各資源數(shù),按照"<<m<<"x"<<n<<"矩陣輸入"<<endl;</p><p>  for(i=0;i<m;i++)</p><p>  for(j=0;j<n;j++)</p&

64、gt;<p>  cin>>MAX[i][j];</p><p>  cout<<"請輸入每個進程已分配的各資源數(shù),也按照"<<m<<"x"<<n<<"矩陣輸入"<<endl;</p><p>  for(i=0;i<m;i++

65、)</p><p><b>  {</b></p><p>  for(j=0;j<n;j++)</p><p><b>  {</b></p><p>  cin>>ALLOCATION[i][j];</p><p>  NEED[i][j]=MAX[i]

66、[j]-ALLOCATION[i][j];</p><p>  if(NEED[i][j]<0)</p><p><b>  {</b></p><p>  cout<<"您輸入的第"<<i+1<<"個進程所擁有的第"<<j+1<<&quo

67、t;個資源數(shù)錯誤,請重新輸入:"<<endl;</p><p><b>  j--;</b></p><p><b>  continue;</b></p><p><b>  }</b></p><p><b>  }</b><

68、;/p><p><b>  }</b></p><p>  for(j=0;j<n;j++) //已分配各資源總數(shù)</p><p><b>  {</b></p><p>  for(i=0;i<m;i++)</p><p>  NEEDc[j]

69、=ALLOCATION[i][j]+NEEDc[j];</p><p><b>  }</b></p><p>  cout<<"請輸入各個資源現(xiàn)有的數(shù)目:"<<endl;</p><p>  for(i=0;i<n;i++)</p><p><b>  {&l

70、t;/b></p><p>  cin>>AVAILABLE[i];</p><p><b>  }</b></p><p>  for(i=0;i<n;i++) //總資源數(shù)</p><p><b>  {</b></p><p&g

71、t;  SUMMIT[i]=AVAILABLE[i]+ NEEDc[i];</p><p><b>  }</b></p><p>  cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;

72、</p><p>  cout<<"初始化后狀態(tài)顯示:"<<endl;</p><p>  cout<<"每個進程最多所需的各資源數(shù)"<<endl;</p><p>  for(i=0;i<m;i++)</p><p>  {for(j=0;j<

73、;n;j++)</p><p>  cout<<""<<MAX[i][j]<<" ";</p><p><b>  if(j=n-1)</b></p><p>  cout<<" "<<endl;</p>&

74、lt;p><b>  }</b></p><p>  cout<<"每個進程已分配的各資源數(shù)"<<endl;</p><p>  for(i=0;i<m;i++)</p><p>  {for(j=0;j<n;j++)</p><p>  cout<&l

75、t;""<<ALLOCATION[i][j]<<" ";</p><p><b>  if(j=n-1)</b></p><p>  cout<<" "<<endl;</p><p><b>  }</b><

76、;/p><p>  cout<<"各個資源現(xiàn)有的數(shù)目:"<<endl;</p><p>  for(i=0;i<n;i++)</p><p>  cout<<""<<AVAILABLE[i]<<" ";</p><p>

77、;  cout<<" "<<endl;</p><p>  cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;</p><p><b>  }</b

78、></p><p>  void Bank() /*銀行家算法*/</p><p><b>  {</b></p><p>  int i,j,cusneed;</p><p>  char again;</p><p>  int sum=0;

79、 /*監(jiān)測某一進程資源是否分配完畢*/</p><p>  int add=0;</p><p><b>  while(1)</b></p><p><b>  {</b></p><p>  cout<<"請輸入要申請資源的進程號(注:第1個進程號為0,依次類推)&q

80、uot;<<endl;</p><p>  cin>>cusneed;</p><p>  cout<<"請輸入進程所請求的各資源的數(shù)量"<<endl;</p><p>  for(i=0;i<n;i++)</p><p><b>  {</b>&

81、lt;/p><p>  cin>>REQUEST[cusneed][i];</p><p>  if(REQUEST[cusneed][i]>NEED[cusneed][i])</p><p><b>  {</b></p><p>  cout<<"您輸入的本個請求數(shù)超過進程的需求量

82、!請重新輸入!"<<endl;</p><p><b>  i--;</b></p><p><b>  continue;</b></p><p><b>  }</b></p><p>  if(REQUEST[cusneed][i]>AVAIL

83、ABLE[i])</p><p><b>  {</b></p><p>  cout<<"您輸入的本個請求數(shù)超過系統(tǒng)有的資源數(shù)!請重新輸入!"<<endl;</p><p><b>  i--;</b></p><p><b>  contin

84、ue;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  for(i=0;i<n;i++) //資源分配</p><p><b>  {</b></p>

85、<p>  AVAILABLE[i]-=REQUEST[cusneed][i];</p><p>  ALLOCATION[cusneed][i]+=REQUEST[cusneed][i];</p><p>  NEED[cusneed][i]-=REQUEST[cusneed][i];</p><p><b>  }</b><

86、/p><p>  if(Safe())</p><p><b>  {</b></p><p>  cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;</p&g

87、t;<p>  cout<<"同意分配請求!"<<endl;</p><p>  cout<<"此次分配后狀態(tài)顯示:"<<endl;</p><p>  cout<<"當前每個進程最多尚需的各資源數(shù)"<<endl;</p><

88、p>  for(i=0;i<m;i++)</p><p>  {for(j=0;j<n;j++)</p><p>  cout<<""<<NEED[i][j]<<" ";</p><p><b>  if(j=n-1)</b></p>

89、<p>  cout<<" "<<endl;</p><p><b>  }</b></p><p>  cout<<"當前每個進程已分配過的各資源數(shù)"<<endl;</p><p>  for(i=0;i<m;i++)</p>

90、<p>  {for(j=0;j<n;j++)</p><p>  cout<<""<<ALLOCATION[i][j]<<" ";</p><p><b>  if(j=n-1)</b></p><p>  cout<<"

91、 "<<endl;</p><p><b>  }</b></p><p>  for(i=0;i<m;i++)</p><p>  for(j=0;j<n;j++)</p><p>  add=NEED[i][j]+add; //是否已分配完畢</p><p&

92、gt;  if(add!=0)</p><p><b>  {</b></p><p>  for(i=0;i<n;i++) </p><p>  sum=NEED[cusneed][i]+sum;</p><p>  cout<<"sum值:"<<sum<<

93、;""<<endl;</p><p>  cout<<" "<<endl;</p><p>  if (sum==0)</p><p>  { for(i=0;i<n;i++)</p><p>  AVAILABLE[i]= ALLOCATION[cusneed

94、][i]+AVAILABLE[i];</p><p><b>  }</b></p><p><b>  sum=0;</b></p><p>  cout<<"各個資源現(xiàn)有的數(shù)目:"<<endl;</p><p>  for(i=0;i<n;i++

95、)</p><p>  cout<<""<<AVAILABLE[i]<<" ";</p><p>  cout<<" "<<endl;</p><p><b>  add=0; </b></p><p&

96、gt;<b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  cout<<"各個資源現(xiàn)有的數(shù)目:"<<endl;</p><p>  for(i=0;i<

97、;n;i++)</p><p>  cout<<""<<SUMMIT[i]<<" ";</p><p>  cout<<" "<<endl;</p><p><b>  }</b></p><p>

98、  cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;</p><p><b>  }</b></p><p><b>  else</b></p>

99、<p><b>  {</b></p><p>  cout<<"您的請求被拒絕!"<<endl; //撤消資源分配</p><p>  for(i=0;i<n;i++)</p><p><b>  {</b></p><p>  AVA

100、ILABLE[i]+=REQUEST[cusneed][i];</p><p>  ALLOCATION[cusneed][i]-=REQUEST[cusneed][i];</p><p>  NEED[cusneed][i]+=REQUEST[cusneed][i];</p><p><b>  }</b></p><p&

101、gt;<b>  }</b></p><p>  for(i=0;i<m;i++)</p><p><b>  {</b></p><p>  FINISH[i]=false;</p><p><b>  }</b></p><p>  cout&

102、lt;<"您還想再次請求分配嗎?是請按y/Y,否請按其它鍵"<<endl;</p><p>  cin>>again;</p><p>  if(again=='y'||again=='Y')</p><p><b>  {</b></p><

103、p><b>  continue;</b></p><p><b>  }</b></p><p>  break; //跳出while</p><p>  } </p><p><b>  }<

104、/b></p><p>  bool Safe() /*安全性算法*/</p><p><b>  {</b></p><p>  int i,j,k,l=0;</p><p>  int Work[MAXRESOURCE];

105、 /*工作數(shù)組*/</p><p>  for(i=0;i<n;i++)</p><p>  Work[i]=AVAILABLE[i];</p><p>  for(i=0;i<m;i++)</p><p><b>  {</b></p><p>  FINISH[i

106、]=false;</p><p><b>  }</b></p><p>  for(i=0;i<m;i++)</p><p><b>  { </b></p><p>  if(FINISH[i]==true)</p><p><b>  {</

107、b></p><p><b>  continue;</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  for(j=0;j

108、<n;j++)</p><p><b>  {</b></p><p>  if(NEED[i][j]>Work[j])</p><p><b>  {</b></p><p><b>  break;</b></p><p><b&g

109、t;  }</b></p><p><b>  }</b></p><p><b>  if(j==n)</b></p><p><b>  { </b></p><p>  FINISH[i]=true; //FINISH在此被賦值,表進程i可順利進行&l

110、t;/p><p>  for(k=0;k<n;k++) //并假設已執(zhí)行完成</p><p><b>  {</b></p><p>  Work[k]+=ALLOCATION[i][k];</p><p><b>  }</b></p><p><b> 

111、 p[l++]=i;</b></p><p>  i=-1; //再從i=0開始判斷</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><

112、;p>  continue; </p><p><b>  }</b></p><p><b>  }</b></p><p>  if(l==m) //所有進程都可完成</p><p><b>  {</b></p>&l

113、t;p>  cout<<"系統(tǒng)是安全的"<<endl;</p><p>  cout<<"安全序列:"<<endl;</p><p>  for(i=0;i<l;i++)</p><p><b>  {</b></p><p&

114、gt;  cout<<p[i];</p><p>  if(i!=l-1) //最后一項不輸--></p><p><b>  {</b></p><p>  cout<<"-->";</p><p><b>  }</b></p&

115、gt;<p><b>  }</b></p><p>  cout<<""<<endl;</p><p>  return true;</p><p><b>  }</b></p><p><b>  }</b><

溫馨提示

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

評論

0/150

提交評論