2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、<p>  課程設(shè)計:銀行家算法設(shè)計</p><p><b>  目錄</b></p><p><b>  一.設(shè)計目的:1</b></p><p><b>  二.設(shè)計內(nèi)容:1</b></p><p><b>  三.設(shè)計過程2</b>&

2、lt;/p><p><b>  實(shí)現(xiàn)功能2</b></p><p><b>  添加功能2</b></p><p><b>  設(shè)計思路2</b></p><p><b>  算法和流程圖2</b></p><p>  四.操作

3、界面截圖及分析4</p><p><b>  五.設(shè)計總結(jié):7</b></p><p>  附錄:各程序主要函數(shù)及注釋7</p><p><b>  設(shè)計的函數(shù)9</b></p><p>  check檢查安全性函數(shù)9</p><p><b>  主函數(shù)

4、11</b></p><p><b>  一.設(shè)計目的:</b></p><p>  本設(shè)計的目的是通過編寫和調(diào)試一個系統(tǒng)動態(tài)分配資源的簡單模擬程序,觀察死鎖產(chǎn)生的條件,并采用適當(dāng)?shù)乃惴?,有效地防止和避免死鎖地發(fā)生。</p><p><b>  二.設(shè)計內(nèi)容:</b></p><p> 

5、 編制銀行家算法通用程序,并檢測所給狀態(tài)的系統(tǒng)安全性。</p><p>  設(shè)進(jìn)程I提出請求Request[N],則銀行家算法按如下規(guī)則進(jìn)行判斷。</p><p>  (1)如果Request[N]<=NEED[I,N],則轉(zhuǎn)(2);否則,出錯。</p><p>  (2)如果Request[N]<=AVAILABLE,則轉(zhuǎn)(3);否則,出錯。</

6、p><p>  (3)系統(tǒng)試探分配資源,修改相關(guān)數(shù)據(jù):</p><p>  AVAILABLE=AVAILABLE-REQUEST</p><p>  ALLOCATION=ALLOCATION+REQUEST</p><p>  NEED=NEED-REQUEST</p><p>  (4)系統(tǒng)執(zhí)行安全性檢查,如安全,則

7、分配成立;否則試探險性分配作廢,系統(tǒng)恢復(fù)原狀,進(jìn)程等待。</p><p><b>  三.設(shè)計過程</b></p><p><b>  實(shí)現(xiàn)功能</b></p><p>  void showdata() //函數(shù)showdata,輸出資源分配情況</p><p>  void

8、changdata(int k) //函數(shù)changdata,改變可用資源和已經(jīng)拿到資源和還需要的資源的值</p><p>  void rstordata(int k) //函數(shù)rstordata,恢復(fù)可用資源和已經(jīng)拿到資源和 </p><p><b>  還需要的資源的值</b></p><p>  int check(

9、int s) //函數(shù)check,檢查是否安全</p><p>  void bank() //銀行家算法</p><p><b>  添加功能</b></p><p><b>  無</b></p><p><b>  設(shè)計思路</b&

10、gt;</p><p>  銀行家算法,顧名思義是來源于銀行的借貸業(yè)務(wù),一定數(shù)量的本金要應(yīng)多個客戶的借貸周轉(zhuǎn),為了防止銀行加資金無法周轉(zhuǎn)而倒閉,對每一筆貸款,必須考察其是否能限期歸還。在操作系統(tǒng)中研究資源分配策略時也有類似問題,系統(tǒng)中有限的資源要供多個進(jìn)程使用,必須保證得到的資源的進(jìn)程能在有限的時間內(nèi)歸還資源,以供其他進(jìn)程使用資源。如果資源分配不得到就會發(fā)生進(jìn)程循環(huán)等待資源,則進(jìn)程都無法繼續(xù)執(zhí)行下去的死鎖現(xiàn)象。&

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

12、圖</b></p><p>  1.銀行家算法: 設(shè)進(jìn)程i提出請求Request[n],則銀行家算法按如下規(guī)則進(jìn)行判斷。 (1)如果Request[n]>Need[i,n],則報錯返回。 (2)如果Request[n]>Available,則進(jìn)程i進(jìn)入等待資源狀態(tài),返回。 (3)假設(shè)進(jìn)程i的申請已獲批準(zhǔn),于是修改系統(tǒng)狀態(tài): Available=Available-Requ

13、est Allocation=Allocation+Request Need=Need-Request(4)系統(tǒng)執(zhí)行安全性檢查,如安全,則分配成立;否則試探險性分配作廢,系統(tǒng)恢復(fù)原狀,進(jìn)程等待。 </p><p>  2.安全性檢查 (1)設(shè)置兩個工作向量Work=Available;Finish[M]=False(2)從進(jìn)程集合中找到一個滿足下述條件的進(jìn)程, Finish [i]

14、=False Need<=Work 如找到,執(zhí)行(3);否則,執(zhí)行(4) (3)設(shè)進(jìn)程獲得資源,可順利執(zhí)行,直至完成,從而釋放資源。 Work=Work+Allocation Finish=True GO TO 2 (4)如所有的進(jìn)程Finish[M]=true,則表示安全;否則系統(tǒng)不安全。 </p><p>  四.操作界面截圖及分析</p>&

15、lt;p><b>  1.輸入數(shù)據(jù)</b></p><p><b>  2.輸出數(shù)據(jù)</b></p><p>  3.銀行家算法檢查安全性</p><p> ?。?)輸入正確的進(jìn)程請求序列,結(jié)果:</p><p> ?。?)輸入錯誤的進(jìn)程請求序列,結(jié)果:</p><p>

16、;  4.測試輸入非法數(shù)據(jù):</p><p><b>  五.設(shè)計總結(jié):</b></p><p>  銀行家算法就是為了使系統(tǒng)保持安全狀態(tài),避免死鎖的發(fā)生。我們可以把操作系統(tǒng)看作是銀行家,操作系統(tǒng)管理的資源相當(dāng)于銀行家管理的資金,進(jìn)程向操作系統(tǒng)請求分配資源相當(dāng)于用戶向銀行家貸款。操作系統(tǒng)按照銀行家制定的規(guī)則為進(jìn)程分配資源,當(dāng)進(jìn)程首次申請資源時,要測試該進(jìn)程對資源的最大

17、需求量,如果系統(tǒng)現(xiàn)存的資源可以滿足它的最大需求量則按當(dāng)前的申請量分配資源,否則就推遲分配。當(dāng)進(jìn)程在執(zhí)行中繼續(xù)申請資源時,先測試該進(jìn)程已占用的資源數(shù)與本次申請的資源數(shù)之和是否超過了該進(jìn)程對資源的最大需求量。若超過則拒絕分配資源,若沒有超過則再測試系統(tǒng)現(xiàn)存的資源能否滿足該進(jìn)程尚需的最大資源量, 若能滿足則按當(dāng)前的申請量分配資源,否則也要推遲分配。 </p><p>  在實(shí)現(xiàn)過程中沒遇到什么大問題,主要是一開始沒深刻

18、理解銀行家算法原理,以致出現(xiàn)了邏輯上的錯誤,于是我花了好一段時間去研究該算法,網(wǎng)上有各種各樣的解釋方法,把它們都看了之后,我感覺算是理解透了。在真正理解了原理之后,再去實(shí)現(xiàn),問題就不大了。也由此我得到了一個經(jīng)驗(yàn),磨刀不費(fèi)斬柴功,做好分析設(shè)計、明白清楚實(shí)現(xiàn)原理,代碼實(shí)現(xiàn)就可以事半功倍了。若能滿足則按當(dāng)前的申請量分配資源,否則也要推遲分配。 </p><p>  附錄:各程序主要函數(shù)及注釋</p>&l

19、t;p> ?。ㄓ眉t色黑體標(biāo)注自己設(shè)計的函數(shù))</p><p>  #include "string.h" </p><p>  #include "iostream"</p><p>  using namespace std;</p><p>  #define FALSE 0 </p&g

20、t;<p>  #define TRUE 1 </p><p>  #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];//

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

22、個進(jìn)程還需要N類資源的資源量</p><p>  int Request[R]; //請求資源個數(shù)</p><p>  ///////////////////////////////////////////////////////////////////////////////////////////////</p><p>  void showdata() //

23、函數(shù)showdata,輸出資源分配情況</p><p><b>  { </b></p><p><b>  int i,j; </b></p><p>  cout<<"各種資源的總數(shù)量(all):"<<endl; </p><p>  cout<

24、<" "; </p><p>  for (j=0;j<N;j++)cout<<" 資源"<<j<<": "<<ALL_RESOURCE[j]; </p><p>  cout<<endl<<endl; </p><p> 

25、 cout<<"系統(tǒng)目前各種資源可用的數(shù)為(available):"<<endl; </p><p>  cout<<" "; </p><p>  for (j=0;j<N;j++)cout<<" 資源"<<j<<": "<&

26、lt;AVAILABLE[j]; </p><p>  cout<<endl<<endl; </p><p>  cout<<" 各進(jìn)程還需要的資源量(need):"<<endl<<endl; </p><p>  cout<<" 資源0"&l

27、t;<" 資源1"<<" 資源2"<<endl;</p><p>  for (i=0;i<M;i++) </p><p>  for (i=0;i<M;i++) </p><p><b>  { </b></p><p> 

28、 cout<<"進(jìn)程p"<<i<<": "; </p><p>  for (j=0;j<N;j++)cout<<NEED[i][j]<<" ";; </p><p>  cout<<endl; </p><p>

29、;<b>  } </b></p><p>  cout<<endl; </p><p>  cout<<" 各進(jìn)程已經(jīng)得到的資源量(allocation): "<<endl<<endl; </p><p>  cout<<" 資源0"

30、;<<" 資源1"<<" 資源2"<<endl;</p><p>  for (i=0;i<M;i++) </p><p><b>  { </b></p><p>  cout<<"進(jìn)程p"<<i<

31、;<": "; </p><p>  for (j=0;j<N;j++)cout<<ALLOCATION[i][j]<<" "; </p><p>  cout<<endl; </p><p><b>  } </b></p>

32、<p>  cout<<endl; </p><p><b>  } </b></p><p>  ///////////////////////////////////////////////////////////////////////////</p><p>  void changdata(int k) //函

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

34、><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><p><b>  }</b&

35、gt;</p><p><b>  }</b></p><p>  //////////////////////////////////////////////////////////////////////////////</p><p>  void rstordata(int k) //函數(shù)rstordata,恢復(fù)可用資源和已經(jīng)拿到資源和

36、還需要的資源的值</p><p><b>  {</b></p><p><b>  int j; </b></p><p>  for (j=0;j<N;j++) </p><p><b>  {</b></p><p>  AVAILABLE[

37、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><b>  }</b></p><

38、p><b>  }</b></p><p>  //////////////////////////////////////////////////////////////////////////////////</p><p><b>  //設(shè)計的函數(shù)</b></p><p>  //check檢查安全性函數(shù)&l

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

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

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

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

43、lt;p>  }while(i<M);</p><p>  for(i=0;i<M;i++) </p><p>  if(FINISH[i]==FALSE) </p><p><b>  {</b></p><p>  cout<<endl; </p><p>  c

44、out<<" 系統(tǒng)不安全!!! 本次資源申請不成功!!!"<<endl; </p><p>  cout<<endl; </p><p>  return 1; </p><p><b>  } </b></p><p><b>  } </b>

45、;</p><p>  cout<<endl; </p><p>  cout<<" 經(jīng)安全性檢查,系統(tǒng)安全,本次分配成功。"<<endl; </p><p>  cout<<endl; </p><p>  return 0; </p><p>&l

46、t;b>  }</b></p><p>  //////////////////////////////////////////////////////////////////////////////////////</p><p>  void bank() //銀行家算法</p><p><b>  {</b><

47、/p><p>  int i=0,j=0; </p><p>  char flag='Y'; </p><p>  while(flag=='Y'||flag=='y') </p><p><b>  { </b></p><p><b> 

48、 i=-1; </b></p><p>  while(i<0||i>=M) </p><p><b>  { </b></p><p>  cout<<" 請輸入需申請資源的進(jìn)程號(從P0到P"<<M-1<<",否則重輸入!):"; </

49、p><p>  cout<<"p";cin>>i; </p><p>  if(i<0||i>=M)cout<<" 輸入的進(jìn)程號不存在,重新輸入!"<<endl; </p><p><b>  } </b></p><p> 

50、 cout<<" 請輸入進(jìn)程P"<<i<<"申請的資源數(shù):"<<endl; </p><p>  for (j=0;j<N;j++) </p><p><b>  { </b></p><p>  cout<<" 資源"

51、<<j<<": "; </p><p>  cin>>Request[j];</p><p>  if(Request[j]>NEED[i][j]) //若請求的資源數(shù)大于進(jìn)程還需要i類資源的資源量j</p><p><b>  { </b></p><p>

52、  cout<<" 進(jìn)程P"<<i<<"申請的資源數(shù)大于進(jìn)程P"<<i<<"還需要"<<j<<"類資源的資源量!"; </p><p>  cout<<"申請不合理,出錯!請重新選擇!"<<endl<&

53、lt;endl; </p><p>  flag='N'; </p><p><b>  break; </b></p><p><b>  } </b></p><p><b>  else </b></p><p><b>

54、  {</b></p><p>  if(Request[j]>AVAILABLE[j]) //若請求的資源數(shù)大于可用資源數(shù)</p><p><b>  { </b></p><p>  cout<<" 進(jìn)程P"<<i<<"申請的資源數(shù)大于系統(tǒng)可用"&

55、lt;<j<<"類資源的資源量!"; </p><p>  cout<<"申請不合理,出錯!請重新選擇!"<<endl<<endl; </p><p>  flag='N'; </p><p><b>  break; </b><

56、/p><p><b>  } </b></p><p><b>  } </b></p><p><b>  } </b></p><p>  if(flag=='Y'||flag=='y') </p><p><b&g

57、t;  { </b></p><p>  changdata(i); //調(diào)用changdata(i)函數(shù),改變資源數(shù)</p><p>  if(check(i)) //若系統(tǒng)不安全</p><p><b>  { </b></p><p>  rstordata(i); //調(diào)用rstordata(i)函數(shù)

58、,恢復(fù)資源數(shù)</p><p>  showdata(); //輸出資源分配情況</p><p><b>  } </b></p><p>  else //若系統(tǒng)安全 </p><p>  showdata(); //輸出資源分配情況 </p><p><b>  } &

59、lt;/b></p><p>  else //若flag=N||flag=n</p><p>  showdata(); </p><p>  cout<<endl; </p><p>  cout<<" 是否繼續(xù)銀行家算法演示,按'Y'或'y'鍵繼續(xù),按&#

60、39;N'或'n'鍵退出演示: "; </p><p>  cin>>flag; </p><p><b>  } </b></p><p><b>  } </b></p><p>  /////////////////////////////////

61、/////////////////////////////////////////////////////////////</p><p><b>  //主函數(shù)</b></p><p>  void main() //主函數(shù)</p><p><b>  { </b></p><p>  int i

62、=0,j=0,p; </p><p>  cout<<"請輸入總進(jìn)程數(shù):"<<endl;</p><p><b>  cin>>M;</b></p><p>  cout<<"請輸入總資源種類:"<<endl;</p><p&

63、gt;<b>  cin>>N;</b></p><p>  cout<<"請輸入總資源數(shù)(all_resource):"<<endl;</p><p>  for(i=0;i<N;i++)</p><p>  cin>>ALL_RESOURCE[i];</p>

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

65、><b>  {</b></p><p><b>  do</b></p><p><b>  {</b></p><p>  cin>>MAX[i][j];</p><p>  if (MAX[i][j]>ALL_RESOURCE[j])</p&

66、gt;<p>  cout<<endl<<"該進(jìn)程進(jìn)程所需要的最大資源數(shù)量超過了聲明的該資源總數(shù),請重新輸入"<<endl;</p><p>  }while (MAX[i][j]>ALL_RESOURCE[j]);</p><p><b>  }</b></p><p&g

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

68、  for (j=0;j<N;j++)</p><p><b>  {</b></p><p><b>  do</b></p><p><b>  {</b></p><p>  cin>>ALLOCATION[i][j];</p><p

69、>  if (ALLOCATION[i][j]>MAX[i][j])</p><p>  cout<<endl<<"占有資源超過了聲明的最大資源,請重新輸入"<<endl;</p><p>  }while (ALLOCATION[i][j]>MAX[i][j]);</p><p><b

70、>  }</b></p><p><b>  }</b></p><p>  //初始化資源數(shù)量,</p><p>  for (j=0;j<N;j++)</p><p>  { p=ALL_RESOURCE[j];</p><p>  for (i=0;i<M;i+

71、+)</p><p><b>  {</b></p><p>  p=p-ALLOCATION[i][j];//減去已經(jīng)被占據(jù)的資源</p><p>  AVAILABLE[j]=p;//計算出剩余各類可利用資源總數(shù)Available[j]</p><p>  if(AVAILABLE[j]<0)</p>

72、;<p>  AVAILABLE[j]=0;</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>

溫馨提示

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

評論

0/150

提交評論