銀行家算法模擬實(shí)現(xiàn)課程設(shè)計(jì)_第1頁(yè)
已閱讀1頁(yè),還剩20頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、<p>  計(jì)算機(jī)操作系統(tǒng)程序設(shè)計(jì)</p><p><b>  課程考核報(bào)告</b></p><p><b>  銀行家算法模擬實(shí)現(xiàn)</b></p><p>  班 級(jí): 09軟件(1) </p><p>  學(xué) 號(hào): </p><p>

2、  姓 名: </p><p>  指導(dǎo)老師: </p><p>  2011年12月 19日</p><p><b>  目錄</b></p><p>  1. 課程設(shè)計(jì)簡(jiǎn)介------------------------------------------------3</

3、p><p>  1.1課程設(shè)計(jì)題目------------------------------------------------------------- 3</p><p>  1.2課程設(shè)計(jì)目的-----------------------------------------3</p><p>  1.3 課程設(shè)計(jì)要求-----------------------

4、-----------------3</p><p>  2 實(shí)驗(yàn)原理分析-------------------------------------------4</p><p>  2.1 算法的來(lái)源及基本思想---------------------------------4</p><p>  2.2 死鎖產(chǎn)生的條件--------------------

5、-------------------4</p><p>  2.3 模擬進(jìn)程申請(qǐng)資源-------------------------------------5</p><p>  3 概要設(shè)計(jì)------------------------------------------------5</p><p>  4 詳細(xì)設(shè)計(jì)----------------

6、--------------------------------7</p><p>  5 代碼設(shè)計(jì)------------------------------------------------8</p><p>  6 調(diào)試分析----------------------------------------------- 14</p><p>  7

7、心得體會(huì)------------------------------------------------21</p><p>  8 參考文獻(xiàn)------------------------------------------------21 </p><p>  1 課程設(shè)計(jì)簡(jiǎn)介:</p><p>  1.1 課程設(shè)計(jì)題目</p><

8、p>  銀行家算法的模擬實(shí)現(xiàn)。應(yīng)用銀行家算法驗(yàn)證進(jìn)程安全性檢查及分配資源。</p><p>  1.2 課程設(shè)計(jì)目的</p><p>  本設(shè)計(jì)的目的是通過(guò)編寫和調(diào)試一個(gè)系統(tǒng)動(dòng)態(tài)分配資源的簡(jiǎn)單模擬程序,觀察死鎖產(chǎn)生的條件,并采用適當(dāng)?shù)乃惴?,有效地防止和避免死鎖地發(fā)生。</p><p>  A、了解進(jìn)程產(chǎn)生死鎖的原因,了解為什么要進(jìn)行死鎖的避免。</p&

9、gt;<p>  B、掌握銀行家算法的數(shù)據(jù)結(jié)構(gòu),了解算法的執(zhí)行過(guò)程,加深對(duì)銀行家算法的理解。</p><p>  1.3 課程設(shè)計(jì)要求</p><p>  設(shè)計(jì)一個(gè)n 個(gè)并發(fā)進(jìn)程共享m 個(gè)系統(tǒng)資源的系統(tǒng)。進(jìn)程可動(dòng)態(tài)申請(qǐng)資源和釋放資源,系統(tǒng)按各進(jìn)程的申請(qǐng)動(dòng)態(tài)的分配資源。要求采用銀行家算法實(shí)現(xiàn)。</p><p>  初始化這組進(jìn)程的最大資源請(qǐng)求和依次申請(qǐng)

10、的資源序列。把各進(jìn)程已占用和需求資源情況記錄在進(jìn)程控制塊中。假定進(jìn)程控制塊的內(nèi)容包括:進(jìn)程名,狀態(tài),當(dāng)前申請(qǐng)量,資源需求總量,已占資源量,能執(zhí)行完標(biāo)志。其中,進(jìn)程的狀態(tài)有:就緒、等待和完成。當(dāng)系統(tǒng)不能滿足進(jìn)程的資源請(qǐng)求時(shí),進(jìn)程處于等待態(tài)。資源需求總量表示進(jìn)程運(yùn)行過(guò)程中對(duì)資源的總的需求量。</p><p>  已占資源量表示進(jìn)程目前已經(jīng)得到但還未歸還的資源量。因此,進(jìn)程在以后還需要的剩余資源量等于資源需要總量減去已

11、占資源量。顯然每個(gè)進(jìn)程的資源需求總量不應(yīng)超過(guò)系統(tǒng)擁有的資源總量。</p><p>  銀行家算法分配資源的原則是:當(dāng)某個(gè)進(jìn)程提出資源請(qǐng)求時(shí),假定先分配資源給它,然后查找各進(jìn)程的剩余請(qǐng)求,檢查系統(tǒng)的剩余資源量是否由于進(jìn)程的分配而導(dǎo)致系統(tǒng)死鎖。若能,則讓進(jìn)程等待,否則,讓進(jìn)程的假分配變?yōu)檎娣峙洹?lt;/p><p>  查找各進(jìn)程的剩余請(qǐng)求,檢查系統(tǒng)的剩余資源量是否能滿足其中一進(jìn)程。如果能,則轉(zhuǎn)b

12、)。</p><p>  將資源分配給所需的進(jìn)程,這樣,該進(jìn)程已獲得資源最大請(qǐng)求,最終能運(yùn)行完成。標(biāo)記這個(gè)進(jìn)程為終止進(jìn)程,并將其占有的全部資源歸還給系統(tǒng)。</p><p>  重復(fù)第a)步和第b )步,直到所有進(jìn)程都標(biāo)記為終止進(jìn)程,或直到一個(gè)死鎖發(fā)生。若所有進(jìn)程都標(biāo)記為終止進(jìn)程,則系統(tǒng)的初始狀態(tài)是安全的,否則為不安全的。若安全,則正式將資源分配給它,否則假定的分配作廢,讓其等待。</

13、p><p>  2 實(shí)驗(yàn)原理分析:</p><p>  2.1 算法的來(lái)源及基本思想</p><p>  銀行家算法,顧名思義是來(lái)源于銀行的借貸業(yè)務(wù),通過(guò)這個(gè)算法可以用來(lái)解決生活中的實(shí)際問(wèn)題,如銀行貸款等。一定數(shù)量的本金要應(yīng)多個(gè)客戶的借貸周轉(zhuǎn),為了防止銀行加資金無(wú)法周轉(zhuǎn)而倒閉,對(duì)每一筆貸款,必須考察其是否能限期歸還。在操作系統(tǒng)中研究資源分配策略時(shí)也有類似問(wèn)題,系統(tǒng)中

14、有限的資源要供多個(gè)進(jìn)程使用,必須保證得到的資源的進(jìn)程能在有限的時(shí)間內(nèi)歸還資源,以供其他進(jìn)程使用資源。如果資源分配不得到就會(huì)發(fā)生進(jìn)程循環(huán)等待資源,則進(jìn)程都無(wú)法繼續(xù)執(zhí)行下去的死鎖現(xiàn)象。</p><p>  2.2 死鎖產(chǎn)生的條件</p><p>  銀行家算法是用來(lái)避免死鎖的一種重要方法,通過(guò)編寫一個(gè)簡(jiǎn)單的銀行家算法程序,加深了解有關(guān)資源申請(qǐng)、避免死鎖等概念,并體會(huì)和了解死鎖和避免死鎖的具體實(shí)

15、施方法。</p><p>  死鎖的產(chǎn)生,必須同時(shí)滿足四個(gè)條件:</p><p>  A、即一個(gè)資源每次只能由一個(gè)進(jìn)程使用;</p><p>  B、第二個(gè)為等待條件,即一個(gè)進(jìn)程請(qǐng)求資源不能滿足時(shí),它必須等待,單它仍繼續(xù)寶石已得到的所有其他資源;</p><p>  C、第三個(gè)為非剝奪條件,即在出現(xiàn)死鎖的系統(tǒng)中一定有不可剝奪使用的資源;<

16、;/p><p>  D、第四個(gè)為循環(huán)等待條件,系統(tǒng)中存在若干個(gè)循環(huán)等待的進(jìn)程,即其中每一個(gè)進(jìn)程分別等待它前一個(gè)進(jìn)程所持有的資源。</p><p>  防止死鎖的機(jī)構(gòu)只能確保上述四個(gè)條件之一不出現(xiàn),則系統(tǒng)就不會(huì)發(fā)生死鎖。銀行家算法是避免死鎖的方法中,施加的限制條件較弱的,有利于獲得令人滿意的系統(tǒng)性能的方法。在該方法中把系統(tǒng)的狀態(tài)分為安全狀態(tài)和不安全狀態(tài),只要能使系統(tǒng)始終都處于安全狀態(tài),便可以避免

17、發(fā)生死鎖。</p><p>  2.3 模擬進(jìn)程申請(qǐng)資源</p><p>  把一個(gè)進(jìn)程需要和已占有資源的情況記錄在進(jìn)程控制中,假定進(jìn)程控制塊PCB其中“狀態(tài)”有就緒態(tài)、等待態(tài)和完成態(tài)。當(dāng)進(jìn)程在處于等待態(tài)時(shí),表示系統(tǒng)不能滿足該進(jìn)程當(dāng)前的資源申請(qǐng)?!百Y源需求總量”表示進(jìn)程在整個(gè)執(zhí)行過(guò)程中總共要申請(qǐng)的資源量。顯然,,每個(gè)進(jìn)程的資源需求總量不能超過(guò)系統(tǒng)擁有的資源總數(shù), 銀行算法進(jìn)行資源分配可以避

18、免死鎖.</p><p><b>  3 概要設(shè)計(jì):</b></p><p>  銀行家算法可分為個(gè)主要的功能模塊,其描述如下:</p><p><b>  1.初始化</b></p><p>  由用戶輸入數(shù)據(jù),分別對(duì)運(yùn)行的進(jìn)程數(shù)、總的資源種類數(shù)、總資源數(shù)、各進(jìn)程所需要的最大資源數(shù)量(Max),

19、已分配的資源數(shù)量賦值。</p><p><b>  2.安全性檢查算法</b></p><p>  (1)設(shè)置兩個(gè)工作向量Work=AVAILABLE;FINISH=false;</p><p>  (2)從進(jìn)程集合中找到一個(gè)滿足下述條件的進(jìn)程,</p><p>  FINISH==false;</p>&

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

21、所有的進(jìn)程Finish= true,則表示安全;否則系統(tǒng)不安全。</p><p><b>  3. 銀行家算法</b></p><p>  在避免死鎖的方法中,所施加的限制條件較弱,有可能獲得令人滿意的系統(tǒng)性能。在該方法中把系統(tǒng)的狀態(tài)分為安全狀態(tài)和不安全狀態(tài),只要能使系統(tǒng)始終都處于安全狀態(tài),便可以避免發(fā)生死鎖。</p><p>  銀行家算法的

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

23、[i]<= AVAILABLE[j][i],則轉(zhuǎn)(3);否則,出錯(cuò)。</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><p>  NEED[j][i]-

24、=REQUEST[j][i];</p><p><b>  用到的數(shù)據(jù)結(jié)構(gòu):</b></p><p>  實(shí)現(xiàn)銀行家算法要有若干數(shù)據(jù)結(jié)構(gòu),它們用來(lái)表示資源分配系統(tǒng)的狀態(tài)。令n表示系統(tǒng)中進(jìn)程的數(shù)目,m表示資源的分類數(shù)。還需要以下數(shù)據(jù)結(jié)構(gòu):</p><p>  1).Available是一個(gè)長(zhǎng)度為m的向量,它表示每類資源可用的數(shù)量。Availabl

25、e [j]=k,表示j類資源可用的數(shù)量為k。</p><p>  2).Max是一個(gè)n×m矩陣,它表示每個(gè)進(jìn)程對(duì)資源的最大需求。Max [i,j]=k,表示進(jìn)程pi至多可以申請(qǐng)k個(gè)j類資源單位。</p><p>  3).Allocation是一個(gè)n×m矩陣,它表示當(dāng)前分給每個(gè)進(jìn)程的資源數(shù)目。Allocation [i,j]=k,表示進(jìn)程i當(dāng)前分到k個(gè)j類資源。<

26、/p><p>  4).Need是一個(gè)n×m矩陣,它表示每個(gè)進(jìn)程還缺少多少資源。Need[i,j]=k,表示進(jìn)程pi尚需k個(gè)j類資源才能完成其任務(wù)。顯然Need[i,j]= Max [i,j]- Allocation [i,j]。</p><p><b>  4 詳細(xì)設(shè)計(jì):</b></p><p>  1主函數(shù)main()</p&

27、gt;<p>  要求在主函數(shù)中輸入運(yùn)行的進(jìn)程數(shù)、總的資源種類數(shù)、總資源數(shù)、各進(jìn)程所需要的最大資源數(shù)量(Max),已分配的資源數(shù)量,并對(duì)這些數(shù)據(jù)進(jìn)行有效性檢驗(yàn),不符合條件的數(shù)據(jù)要進(jìn)行重新輸入。</p><p>  2函數(shù)showdata( )</p><p>  Showdata()函數(shù)用來(lái)輸出資源的分配情況。對(duì)各進(jìn)程資源的總數(shù)量、系統(tǒng)目前可利用的資源數(shù)量、各進(jìn)程還需要的資源

28、數(shù)量及各進(jìn)程已分配的資源數(shù)量進(jìn)行輸出。</p><p>  3函數(shù)bank( )</p><p>  Bank()函數(shù)為銀行家算法,對(duì)需申請(qǐng)資源的進(jìn)程號(hào)j和所要申請(qǐng)的資源數(shù)量Request[j]進(jìn)行輸入,并分別將Request[j]與Need[i][j]和Available[j]進(jìn)行比較,觀察所要申請(qǐng)的資源數(shù)目是否合理。如合理,則判斷此時(shí)系統(tǒng)是否安全,若安全則輸出資源的分配情況,否則輸出原

29、來(lái)的系統(tǒng)資源分配情況,重新輸入申請(qǐng)資源的數(shù)量。</p><p>  4函數(shù)changdata( )</p><p>  Changdata()函數(shù)用來(lái)改變可用資源和已經(jīng)拿到資源和還需要的資源的值。當(dāng)申請(qǐng)的資源數(shù)目合理時(shí),對(duì)現(xiàn)在的系統(tǒng)資源分配情況進(jìn)行刷新。</p><p>  5函數(shù)chkerr()</p><p>  Chkerr()函數(shù)用來(lái)

30、檢查系統(tǒng)此時(shí)的安全性。如果系統(tǒng)能夠找到一個(gè)安全執(zhí)行的序列,則各進(jìn)程能正常運(yùn)行終結(jié),否則,此進(jìn)程進(jìn)入阻塞狀態(tài)。</p><p>  6函數(shù) rstordata( )</p><p>  Changdata()函數(shù),改變可用資源和已經(jīng)拿到資源和還需要的資源的值。若判斷出申請(qǐng)資源后系統(tǒng)是安全的,則要改變系統(tǒng)現(xiàn)在的資源分配情況:</p><p>  Available[j]

31、= 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><p><b>  代碼設(shè)計(jì):</b></p><p>

32、;  #include<string.h></p><p>  #include<stdio.h></p><p>  #include<stdlib.h></p><p>  #define FALSE 0 </p><p>  #define TRUE 1 </p><p>  

33、#define W 10</p><p>  #define R 20</p><p>  int M ; //總進(jìn)程數(shù)</p><p>  int N ; //資源種類 </p><p>  int ALL_RESOURCE[W];//各種資源的數(shù)目總和</p><p>  int MAX[W][R]; //M個(gè)進(jìn)程

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

35、//請(qǐng)求資源個(gè)數(shù)</p><p>  void showdata() //函數(shù)showdata,輸出資源分配情況</p><p><b>  { </b></p><p><b>  int i,j; </b></p><p>  printf("\n\n各種資源的總數(shù)量(all):\n&

36、quot;); </p><p>  for (j=0;j<N;j++)</p><p>  printf(" 資源 %d: %d\n",j+1,ALL_RESOURCE[j]);</p><p>  printf("\n\n"); </p><p>  printf("系統(tǒng)目前

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

38、p>  printf("各進(jìn)程還需要的資源量(need):\n\n"); </p><p>  printf(" 進(jìn)程 ");</p><p>  for(i=0;i<N;i++)</p><p>  printf(" 資源%d ",i+1); </p><p>  

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

40、<p>  printf(" %d ",NEED[i][j]);</p><p>  printf("\n"); </p><p><b>  } </b></p><p>  printf("\n\n");</p><p>  printf(&

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

42、quot;\n"); </p><p>  for (i=0;i<M;i++) </p><p><b>  { </b></p><p>  printf("進(jìn)程p%d: ",i+1);</p><p>  for (j=0;j<N;j++)</p><p&

43、gt;  printf(" %d ",ALLOCATION[i][j]);</p><p>  printf("\n");</p><p><b>  } </b></p><p>  printf("\n");</p><p><b>  }

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

45、;N;j++) </p><p><b>  { </b></p><p>  AVAILABLE[j]=AVAILABLE[j]-Request[j]; </p><p>  ALLOCATION[k][j]=ALLOCATION[k][j]+Request[j]; </p><p>  NEED[k][j]=NEED

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

47、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><p>  int chkerr(int s) //函數(shù)chkerr,檢查是

48、否安全</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><p>  for(j=0;j<N;j++) </p>

49、<p><b>  {</b></p><p>  WORK=AVAILABLE[j]; </p><p><b>  i=s; </b></p><p><b>  do</b></p><p><b>  { </b></p>

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

51、>  i=0; </b></p><p><b>  } </b></p><p><b>  else </b></p><p><b>  { i++; </b></p><p><b>  } </b></p><

52、;p>  }while(i<M);</p><p>  for(i=0;i<M;i++) </p><p>  if(FINISH[i]==FALSE) </p><p><b>  {</b></p><p>  printf("\n");</p><p>

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

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

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

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

57、<p>  printf(" 請(qǐng)輸入需申請(qǐng)資源的進(jìn)程號(hào)(從P1到P%d,否則重輸入!):",M); </p><p>  printf("p");</p><p>  scanf("%d",&i); </p><p>  if(i<1||i>M)</p><

58、p>  printf(" 輸入的進(jìn)程號(hào)不存在,重新輸入!\n"); </p><p><b>  } </b></p><p>  printf(" 請(qǐng)輸入進(jìn)程P%d申請(qǐng)的資源數(shù):\n",i); </p><p>  for (j=0;j<N;j++) </p><p>

59、;<b>  { </b></p><p>  printf(" 資源%d:",j+1); </p><p>  scanf("%d",&Request[j]);</p><p>  if(Request[j]>NEED[i-1][j]) //若請(qǐng)求的資源數(shù)大于進(jìn)程還需要i類資源的資源量j&

60、lt;/p><p><b>  { </b></p><p>  printf(" 進(jìn)程P%d申請(qǐng)的資源數(shù)大于進(jìn)程P%d還需要%d類資源的資源量!",i,i,j); </p><p>  printf("申請(qǐng)不合理,出錯(cuò)!請(qǐng)重新選擇!\n\n"); </p><p>  flag=&#

61、39;N'; </p><p><b>  break; </b></p><p><b>  } </b></p><p><b>  else </b></p><p><b>  {</b></p><p>  if(

62、Request[j]>AVAILABLE[j]) //若請(qǐng)求的資源數(shù)大于可用資源數(shù)</p><p><b>  { </b></p><p>  printf("進(jìn)程P%d申請(qǐng)的資源數(shù)大于系統(tǒng)可用%d類資源的資源量!",i,j); </p><p>  printf("申請(qǐng)不合理,出錯(cuò)!請(qǐng)重新選擇!\n\n&

63、quot;); </p><p>  flag='N'; </p><p><b>  break; </b></p><p><b>  } </b></p><p><b>  } </b></p><p><b>  }

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

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

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

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

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

69、******************************** \n");</p><p>  printf(" 銀行家算法的模擬實(shí)現(xiàn) \n");</p><p>  printf(" 20090307143 吳天一 \n&quo

70、t;);</p><p>  printf(" *************************************** \n\n");</p><p>  printf("請(qǐng)輸入總進(jìn)程數(shù):");</p><p>  scanf("%d",&M);</p><

71、;p>  printf("請(qǐng)輸入總資源種類:");</p><p>  scanf("%d",&N);</p><p>  printf("請(qǐng)輸入總資源數(shù)(all_resource):");</p><p>  for(i=0;i<N;i++)</p><p> 

72、 scanf("%d",&ALL_RESOURCE[i]);</p><p>  printf("依次輸入各進(jìn)程所需要的最大資源數(shù)量(max):\n");</p><p>  for (i=0;i<M;i++)</p><p><b>  {</b></p><p>

73、  for (j=0;j<N;j++)</p><p><b>  {</b></p><p><b>  do</b></p><p><b>  {</b></p><p>  scanf("%d",&MAX[i][j]);</p&g

74、t;<p>  if (MAX[i][j]>ALL_RESOURCE[j])</p><p>  printf("\n占有資源超過(guò)了聲明的該資源總數(shù),請(qǐng)重新輸入!\n");</p><p>  }while (MAX[i][j]>ALL_RESOURCE[j]);</p><p><b>  }</b&g

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

76、t;p>  for (j=0;j<N;j++)</p><p><b>  {</b></p><p><b>  do</b></p><p><b>  {</b></p><p>  scanf("%d",&ALLOCATION[i

77、][j]);</p><p>  if (ALLOCATION[i][j]>MAX[i][j])</p><p>  printf("\n占有資源超過(guò)了聲明的最大資源,請(qǐng)重新輸入\n");</p><p>  }while (ALLOCATION[i][j]>MAX[i][j]);</p><p><b&

78、gt;  }</b></p><p>  }//初始化資源數(shù)量</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++)

79、</p><p><b>  {</b></p><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;&

80、lt;/p><p><b>  }</b></p><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]-ALLOCA

81、TION[i][j];</p><p>  showdata();</p><p><b>  bank();</b></p><p><b>  }</b></p><p><b>  調(diào)試分析:</b></p><p>  輸出結(jié)果如下圖所示:<

82、;/p><p>  當(dāng)輸入進(jìn)程數(shù)和資源種類數(shù)及總資源量、所需最大資源數(shù)量Max和已分配資源量時(shí),系統(tǒng)調(diào)用后showdata()函數(shù),顯示現(xiàn)在系統(tǒng)的資源分配情況。當(dāng)輸入需要申請(qǐng)的進(jìn)程號(hào)和其所需的資源數(shù)目時(shí),系統(tǒng)調(diào)用bank()函數(shù),在進(jìn)行安全性檢驗(yàn),若此時(shí)系統(tǒng)安全,則系統(tǒng)為其分配資源,若此時(shí)系統(tǒng)沒(méi)有通過(guò)安全性檢驗(yàn),則顯示提示語(yǔ)句,恢復(fù)系統(tǒng)原來(lái)的資源分配情況,再重新進(jìn)行選擇。</p><p>  

83、下圖所顯示的程序運(yùn)行結(jié)果所輸入的數(shù)據(jù)都是有效的,無(wú)效數(shù)據(jù)的輸入這里因?yàn)槠脑驔](méi)有給出。當(dāng)輸入的結(jié)果大于其范圍時(shí),程序會(huì)輸出提示語(yǔ)句,此后再重新輸入數(shù)據(jù)。</p><p>  以課本P110銀行家算法之例為例</p><p><b>  資源不足時(shí)</b></p><p><b>  資源足夠時(shí)</b></p>

84、;<p>  資源足夠且請(qǐng)求分配資源足夠時(shí)</p><p>  資源足夠但請(qǐng)求資源不足時(shí)</p><p><b>  心得體會(huì)</b></p><p>  一周的操作系統(tǒng)課程設(shè)計(jì),我學(xué)到了很多課本上沒(méi)有的知識(shí)。想要完成模擬銀行家算法的C語(yǔ)言程序,首先就是要徹底熟悉算法,了解算法的基本原理,才能開始著手程序設(shè)計(jì)在程序設(shè)計(jì)設(shè)計(jì)過(guò)程中,

85、遇到了一些困難,通過(guò)向同學(xué)詢問(wèn),翻閱資料等,問(wèn)題被一一解決了。首先就是在知識(shí)層面上了解了銀行家算法這種進(jìn)程調(diào)度和避免死鎖的算法,并用C語(yǔ)言程序真正模擬出安全性檢查和銀行家算法過(guò)程,復(fù)習(xí)了之前所學(xué)C語(yǔ)言和數(shù)據(jù)結(jié)構(gòu)的知識(shí);在編程過(guò)程中雖然遇到很多困難,解決問(wèn)題的過(guò)程中,同時(shí)也鍛煉了我不怕困難,勇于迎接挑戰(zhàn)的精神,為以后的挑戰(zhàn)磨練了必勝的信心。</p><p><b>  參考文獻(xiàn)</b><

溫馨提示

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

評(píng)論

0/150

提交評(píng)論