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

下載本文檔

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

文檔簡介

1、<p>  課 程 設(shè) 計 報 告</p><p>  課程設(shè)計名稱: 銀行家算法模擬實現(xiàn) </p><p>  系 別: 二系 </p><p>  姓 名: </p><p>  班 級:

2、 </p><p>  學(xué) 號: </p><p>  成 績: </p><p>  指導(dǎo)教師: </p><p>  開課時間: 2014—20

3、15 學(xué)年 2 學(xué)期</p><p><b>  目錄</b></p><p>  第一章 需求目的1</p><p>  第二章 課題內(nèi)容1</p><p>  第三章 詳細設(shè)計1</p><p><b>  3.1初始化1</b></p>

4、<p>  3.2安全性檢查算法2</p><p>  3.3銀行家算法3</p><p>  第四章 調(diào)試分析4</p><p><b>  第五章 總結(jié)6</b></p><p><b>  第六章 附錄7</b></p><p><b> 

5、 第一章 需求目的</b></p><p>  1.1了解多道程序系統(tǒng)中,多個進程并發(fā)執(zhí)行的資源分配。</p><p>  1.2掌握死鎖的產(chǎn)生的原因、產(chǎn)生死鎖的必要條件和處理死鎖的基本方法。</p><p>  1.3掌握預(yù)防死鎖的方法,系統(tǒng)安全狀態(tài)的基本概念。</p><p>  1.4掌握銀行家算法,了解資源在進程并發(fā)執(zhí)行中

6、的資源分配策略。</p><p>  1.5理解死鎖避免在當(dāng)前計算機系統(tǒng)不常使用的原因。 </p><p><b>  第二章 課題內(nèi)容</b></p><p>  2.1復(fù)習(xí)銀行家算法,設(shè)計一個具有若干(不少于3種)資源和若干(不少于5個)進程的系統(tǒng)。</p><p>  2.2定義系統(tǒng)的初始狀態(tài),即進程獲得的資源數(shù)

7、,還需要的資源數(shù)以及系統(tǒng)可用的資源數(shù)。</p><p>  2.3以用戶輸入的方式提出資源請求,并用銀行家算法避免可能發(fā)生的死鎖,若系統(tǒng)安全,允許用戶繼續(xù)申請資源。</p><p>  2.4設(shè)計的系統(tǒng)要求結(jié)構(gòu)清晰,與用戶的交互界面友好,能動態(tài)地實現(xiàn)資源的申請和分配。</p><p><b>  第三章 詳細設(shè)計</b></p>

8、<p>  銀行家算法可分為幾個主要的功能模塊,其描述如下:</p><p><b>  3.1初始化</b></p><p>  由用戶輸入數(shù)據(jù),分別對運行的進程數(shù)、總的資源種類數(shù)、總資源數(shù)、各進程所需要的最大資源數(shù)量(Max),已分配的資源數(shù)量賦值。</p><p><b>  初始化算法流程圖:</b>&l

9、t;/p><p>  3.2安全性檢查算法</p><p>  (1)設(shè)置兩個工作向量Work=AVAILABLE;FINISH=false;</p><p>  (2)從進程集合中找到一個滿足下述條件的進程,</p><p>  FINISH==false;</p><p>  NEED<=Work;</p&

10、gt;<p>  如找到,執(zhí)行(3);否則,執(zhí)行(4)</p><p>  (3)設(shè)進程獲得資源,可順利執(zhí)行,直至完成,從而釋放資源。</p><p>  Work+=ALLOCATION;</p><p>  Finish=true;</p><p>  (4).如所有的進程Finish= true,則表示安全;否則系統(tǒng)不安全

11、。</p><p><b>  安全性算法流程圖:</b></p><p><b>  3.3銀行家算法</b></p><p>  在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統(tǒng)性能。在該方法中把系統(tǒng)的狀態(tài)分為安全狀態(tài)和不安全狀態(tài),只要能使系統(tǒng)始終都處于安全狀態(tài),便可以避免發(fā)生死鎖。</p>

12、;<p>  銀行家算法的基本思想是分配資源之前,判斷系統(tǒng)是否是安全的;若是,才分配。它是最具有代表性的避免死鎖的算法。</p><p>  設(shè)進程j提出請求REQUEST [i],則銀行家算法按如下規(guī)則進行判斷。</p><p>  (1).如果REQUEST [j] [i]<= NEED[j][i],則轉(zhuǎn)(2);否則,出錯。</p><p>

13、  (2).如果REQUEST [j] [i]<= AVAILABLE[j][i],則轉(zhuǎn)(3);否則,出錯。</p><p>  (3).系統(tǒng)試探分配資源,修改相關(guān)數(shù)據(jù):</p><p>  AVAILABLE[i]-=REQUEST[j][i];</p><p>  ALLOCATION[j][i]+=REQUEST[j][i];</p>&l

14、t;p>  NEED[j][i]-=REQUEST[j][i];</p><p><b>  銀行家算法流程圖:</b></p><p><b>  第四章 調(diào)試分析</b></p><p>  系統(tǒng)中的進程和資源數(shù):</p><p>  系統(tǒng)目前可用資源和各進程所需資源:</p>

15、<p><b>  資源申請:</b></p><p><b>  安全性檢測:</b></p><p><b>  第五章 總結(jié)</b></p><p>  一周的操作系統(tǒng)課程設(shè)計,我學(xué)到了很多課本上沒有的知識。想要完成模擬銀行家算法的C語言程序,首先就是要徹底熟悉算法,了解算法的基本

16、原理,才能開始著手程序設(shè)計在程序設(shè)計設(shè)計過程中,遇到了一些困難,通過向同學(xué)詢問,翻閱資料等,問題被一一解決了。首先就是在知識層面上了解了銀行家算法這種進程調(diào)度和避免死鎖的算法,并用C語言程序真正模擬出安全性檢查和銀行家算法過程,復(fù)習(xí)了之前所學(xué)C語言和數(shù)據(jù)結(jié)構(gòu)的知識;在編程過程中雖然遇到很多困難,解決問題的過程中,同時也鍛煉了我不怕困難,勇于迎接挑戰(zhàn)的精神,為以后的工作打下了堅實的基礎(chǔ)。</p><p><b

17、>  第六章 附錄</b></p><p>  #include<string.h></p><p>  #include<stdio.h></p><p>  #include<stdlib.h></p><p>  #define FALSE 0 </p><p&g

18、t;  #define TRUE 1 </p><p>  #define W 10</p><p>  #define R 20</p><p>  int M ; //總進程數(shù)</p><p>  int N ; //資源種類</p><p>  int ALL_RESOURCE[W];//各種資源的數(shù)目總和<

19、;/p><p>  int MAX[W][R]; //M個進程對N類資源最大資源需求量</p><p>  int AVAILABLE[R]; //系統(tǒng)可用資源數(shù)</p><p>  int ALLOCATION[W][R]; //M個進程已經(jīng)得到N類資源的資源量</p><p>  int NEED[W][R]; //M個進程還需要N類資源的資

20、源量</p><p>  int Request[R]; //請求資源個數(shù)</p><p>  void showdata() //函數(shù)showdata,輸出資源分配情況</p><p><b>  { </b></p><p><b>  int i,j; </b></p><

21、p>  printf("\n\n各種資源的總數(shù)量(all):\n"); </p><p>  for (j=0;j<N;j++)</p><p>  printf(" 資源 %d: %d\n",j+1,ALL_RESOURCE[j]);</p><p>  printf("\n\n");

22、 </p><p>  printf("系統(tǒng)目前各種資源可用的數(shù)為(available):\n");</p><p>  for (j=0;j<N;j++)</p><p>  printf(" 資源 %d: %d\n", j+1, AVAILABLE[j]); </p><p>  p

23、rintf("\n\n"); </p><p>  printf("各進程還需要的資源量(need):\n\n"); </p><p>  printf(" 進程 ");</p><p>  for(i=0;i<N;i++)</p><p>  printf("

24、資源%d ",i+1); </p><p>  printf("\n");</p><p>  for (i=0;i<M;i++) </p><p><b>  { </b></p><p>  printf("進程p%d:",i+1);</p>&l

25、t;p>  for (j=0;j<N;j++)</p><p>  printf(" %d ",NEED[i][j]);</p><p>  printf("\n"); </p><p><b>  } </b></p><p>  printf("\n

26、\n");</p><p>  printf(" 各進程已經(jīng)得到的資源量(allocation): \n\n"); </p><p>  printf(" 進程 ");</p><p>  for(i=0;i<N;i++)</p><p>  printf(" 資源%d &q

27、uot;,i+1);</p><p>  printf("\n"); </p><p>  for (i=0;i<M;i++) </p><p><b>  { </b></p><p>  printf("進程p%d: ",i+1);</p><p>

28、;  for (j=0;j<N;j++)</p><p>  printf(" %d ",ALLOCATION[i][j]);</p><p>  printf("\n");</p><p><b>  } </b></p><p>  printf("\n&

29、quot;);</p><p><b>  } </b></p><p>  void changdata(int k) //函數(shù)changdata,改變可用資源和已經(jīng)拿到資源和還需要的資源的值</p><p><b>  { </b></p><p><b>  int j; </

30、b></p><p>  for (j=0;j<N;j++) </p><p><b>  { </b></p><p>  AVAILABLE[j]=AVAILABLE[j]-Request[j]; </p><p>  ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j

31、]; </p><p>  NEED[k][j]=NEED[k][j]-Request[j];}}</p><p>  void rstordata(int k) //函數(shù)rstordata,恢復(fù)可用資源和已經(jīng)拿到資源和還需要的資源的值</p><p><b>  {int j; </b></p><p>  for (

32、j=0;j<N;j++) </p><p>  { AVAILABLE[j]=AVAILABLE[j]+Request[j]; </p><p>  ALLOCATION[k][j]=ALLOCATION[k][j]-Request[j]; </p><p>  NEED[k][j]=NEED[k][j]+Request[j];}}</p>&l

33、t;p>  int chkerr(int s) //函數(shù)chkerr,檢查是否安全</p><p>  { int WORK,FINISH[W]; </p><p>  int i,j,k=0; </p><p>  for(i=0;i<M;i++)</p><p>  FINISH[i]=FALSE; </p>&

34、lt;p>  for(j=0;j<N;j++) </p><p><b>  {</b></p><p>  WORK=AVAILABLE[j]; </p><p><b>  i=s; </b></p><p><b>  do</b></p>&l

35、t;p><b>  { </b></p><p>  if(FINISH[i]==FALSE&&NEED[i][j]<=WORK)</p><p><b>  {</b></p><p>  WORK=WORK+ALLOCATION[i][j]; </p><p>  F

36、INISH[i]=TRUE; </p><p><b>  i=0; </b></p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { i++; </b></p><p&

37、gt;<b>  } </b></p><p>  }while(i<M);</p><p>  for(i=0;i<M;i++) </p><p>  if(FINISH[i]==FALSE) </p><p><b>  {</b></p><p>  pri

38、ntf("\n");</p><p>  printf(" 系統(tǒng)不安全!!! 本次資源申請不成功!!!\n"); </p><p>  printf("\n");</p><p>  return 1; </p><p><b>  } </b></p&g

39、t;<p><b>  } </b></p><p>  printf("\n");</p><p>  printf(" 經(jīng)安全性檢查,系統(tǒng)安全,本次分配成功。\n"); </p><p>  printf("\n");</p><p>  re

40、turn 0; </p><p><b>  }</b></p><p>  void bank() //銀行家算法</p><p><b>  {</b></p><p>  int i=0,j=0; </p><p>  char flag='Y';

41、</p><p>  while(flag=='Y'||flag=='y') </p><p><b>  { </b></p><p><b>  i=-1; </b></p><p>  while(i<0||i>=M) </p><

42、;p><b>  { </b></p><p>  printf(" 請輸入需申請資源的進程號(從P1到P%d,否則重輸入!):",M); </p><p>  printf("p");</p><p>  scanf("%d",&i); </p><

43、p>  if(i<1||i>M)</p><p>  printf(" 輸入的進程號不存在,重新輸入!\n"); </p><p><b>  } </b></p><p>  printf(" 請輸入進程P%d申請的資源數(shù):\n",i); </p><p>  

44、for (j=0;j<N;j++) </p><p><b>  { </b></p><p>  printf(" 資源%d:",j+1); </p><p>  scanf("%d",&Request[j]);</p><p>  if(Request[j]>

45、;NEED[i-1][j]) //若請求的資源數(shù)大于進程還需要i類資源的資源量j</p><p><b>  { </b></p><p>  printf(" 進程P%d申請的資源數(shù)大于進程P%d還需要%d類資源的資源量!",i,i,j); </p><p>  printf("申請不合理,出錯!請重新選擇!\n

46、\n"); </p><p>  flag='N'; </p><p><b>  break; </b></p><p><b>  } </b></p><p><b>  else </b></p><p><b&g

47、t;  {</b></p><p>  if(Request[j]>AVAILABLE[j]) //若請求的資源數(shù)大于可用資源數(shù)</p><p><b>  { </b></p><p>  printf("進程P%d申請的資源數(shù)大于系統(tǒng)可用%d類資源的資源量!",i,j); </p><

48、;p>  printf("申請不合理,出錯!請重新選擇!\n\n"); </p><p>  flag='N'; </p><p><b>  break; </b></p><p><b>  } </b></p><p><b>  } <

49、;/b></p><p><b>  } </b></p><p>  if(flag=='Y'||flag=='y') </p><p><b>  { </b></p><p>  changdata(i-1); //調(diào)用changdata(i)函數(shù),改變資

50、源數(shù)</p><p>  if(chkerr(i-1)) //若系統(tǒng)安全</p><p><b>  { </b></p><p>  rstordata(i-1); //調(diào)用rstordata(i)函數(shù),恢復(fù)資源數(shù)</p><p>  showdata(); //輸出資源分配情況</p><p&

51、gt;<b>  } </b></p><p>  else //若系統(tǒng)不安全 </p><p>  showdata(); </p><p>  } //輸出資源分配情況 </p><p>  else //若flag=N||flag=n</p><p>  showdat

52、a(); </p><p>  printf("\n");</p><p>  printf("是否繼續(xù)銀行家算法演示,按'Y'或'y'鍵繼續(xù),按'N'或'n'鍵退出演示: "); </p><p>  scanf("%c",&flag

53、);</p><p><b>  } </b></p><p><b>  } </b></p><p>  void main() //主函數(shù)</p><p><b>  { </b></p><p>  int i=0,j=0,p; </p&

54、gt;<p>  printf(" *************************************** \n");</p><p>  printf(" 銀行家算法的模擬實現(xiàn) \n");</p><p>  printf(" ******

55、********************************* \n\n");</p><p>  printf("請輸入總進程數(shù):");</p><p>  scanf("%d",&M);</p><p>  printf("請輸入總資源種類:");</p>&

56、lt;p>  scanf("%d",&N);</p><p>  printf("請輸入總資源數(shù)(all_resource):");</p><p>  for(i=0;i<N;i++)</p><p>  scanf("%d",&ALL_RESOURCE[i]);</p&

57、gt;<p>  printf("依次輸入各進程所需要的最大資源數(shù)量(max):\n");</p><p>  for (i=0;i<M;i++)</p><p><b>  {</b></p><p>  for (j=0;j<N;j++)</p><p><b>

58、;  {</b></p><p><b>  do</b></p><p><b>  {</b></p><p>  scanf("%d",&MAX[i][j]);</p><p>  if (MAX[i][j]>ALL_RESOURCE[j])<

59、;/p><p>  printf("\n占有資源超過了聲明的該資源總數(shù),請重新輸入!\n");</p><p>  }while (MAX[i][j]>ALL_RESOURCE[j]);</p><p><b>  }</b></p><p><b>  }</b></p

60、><p>  printf("依次輸入各進程已經(jīng)占據(jù)的資源數(shù)量(allocation):\n");</p><p>  for (i=0;i<M;i++)</p><p><b>  {</b></p><p>  for (j=0;j<N;j++)</p><p>&

61、lt;b>  {</b></p><p><b>  do</b></p><p><b>  {</b></p><p>  scanf("%d",&ALLOCATION[i][j]);</p><p>  if (ALLOCATION[i][j]&g

62、t;MAX[i][j])</p><p>  printf("\n占有資源超過了聲明的最大資源,請重新輸入\n");</p><p>  }while (ALLOCATION[i][j]>MAX[i][j]);</p><p><b>  }</b></p><p>  }//初始化資源數(shù)量&l

63、t;/p><p>  for (j=0;j<N;j++)</p><p><b>  { </b></p><p>  p=ALL_RESOURCE[j];</p><p>  for (i=0;i<M;i++)</p><p><b>  {</b></p&g

64、t;<p>  p=p-ALLOCATION[i][j];//減去已經(jīng)被占據(jù)的資源</p><p>  AVAILABLE[j]=p;</p><p>  if(AVAILABLE[j]<0)</p><p>  AVAILABLE[j]=0;</p><p><b>  }</b></p>

65、;<p><b>  }</b></p><p>  for (i=0;i<M;i++)</p><p>  for(j=0;j<N;j++)</p><p>  NEED[i][j]=MAX[i][j]-ALLOCATION[i][j];</p><p>  showdata();</p

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論