操作系統(tǒng)課程設計---吃水果問題_第1頁
已閱讀1頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  目  錄</b></p><p>  1 題目內容及要求2</p><p>  1.1題目名稱2</p><p>  1.2題目描述2</p><p>  1.3解題思路2</p><p>  1.4程序清單6</p><p>

2、;  1.5提交結果框圖16</p><p><b>  2 總結20</b></p><p><b>  3 參考文獻20</b></p><p><b>  1 題目內容及要求</b></p><p><b>  題目名稱</b></p&

3、gt;<p>  進程同步模擬設計:吃水果問題</p><p><b>  題目描述</b></p><p>  桌子上有一只盤子,最多可容納兩個水果,每次只能放入或者取出一個水果。爸爸專門向盤子中放蘋果,媽媽專門向盤子中放橘子,兩個兒子專門等待吃盤子中的橘子,兩個女兒專門等吃盤子中的蘋果。</p><p><b>  

4、解題思路</b></p><p>  將問題轉換為信號量上的資源分配類型問題:</p><p>  這是進程同步問題的模擬,可以把向盤子放或取水果的每一個過程可以轉為一個進程的操作,這些進程是互斥的,同時也存在一定的同步關系。通過編程實踐時,實際是隨機的調用人一個進程的操作,而這些進程的操作相當于程序中的函數(shù)調用。而計算機在執(zhí)行時每一個時刻只能執(zhí)行一個操作,這就默認了互斥。同步

5、的模擬可以類似于函數(shù)調用時的前提關系即先決條件。這樣進程同步模擬就完全可以通過函數(shù)的調用來實現(xiàn)。</p><p>  具體的每一個操作的對應的函數(shù)的關系:</p><p>  爸爸向盤子中放一個蘋果:Father()</p><p>  媽媽向盤子中放一個橘子:Mother()</p><p>  兒子1從盤子取一個橘子:Son1()<

6、/p><p>  兒子2從盤子取一個橘子:Son2()</p><p>  女兒1從盤子取一個蘋果:Daugther1()</p><p>  兒子1從盤子取一個蘋果:Daugther2()</p><p><b>  具體實現(xiàn)方案:</b></p><p>  (1)用一個整型變量Plate_Siz

7、e表示盤子,初始值為0,當放水果時Plate_Size加1,取水果時Plate_Size減1。變量Plate_Size的最大值為2,當為2時表示盤子已經(jīng)滿,此時若進行放水果操作,放水果將處于等待狀態(tài);為0時表示盤子為空,此時若進行取水果操作,取水果操作將處于等待狀態(tài)。</p><p>  (2)整型變量orange和apple分別表示盤子中的橘子和蘋果數(shù)目,初始都為0,Plate_Size=apple+orang

8、e。</p><p>  (3)用6個bool型的變量 Father_lag,Mother_lag,Son1_lag,Son2_lag,Daughter1_lag,Daughter2_lag表示六個進程是否處于等待狀態(tài)。處于等待時,變量值為true。</p><p>  (4)兩個放水果進程進程同時處于等待狀態(tài)時,若有取水果的操作將自動執(zhí)行等待的放水果進程,執(zhí)行按等待的先后順序;兩個取蘋果

9、或橘子進程同時候處于等待狀態(tài),若有放蘋果或橘子的操作將自動執(zhí)行等待的取進程,進行按等待的先后順序。</p><p>  (5)用一個隨機的函數(shù)產生0—5的6個整數(shù),分別對應六個進程的調用。</p><p>  放水果操作流程圖設計(以Father為例,Mother類似):</p><p>  圖1 Father放水果操作流程圖</p><p&g

10、t;  取水果操作流程圖設計(以Son為例,Daughter類似):</p><p>  圖2 Son取水果(橘子)操作流程圖</p><p><b>  程序清單</b></p><p>  #include <iostream.h>   </p><p>  #include <ctime>

11、   </p><p>  #include <cstdlib> </p><p>  #include <cmath></p><p>  int apple=0;</p><p>  int orange=0;</p><p>  bool Father_lag;</p>&l

12、t;p>  bool Mother_lag;</p><p>  bool Son1_lag;</p><p>  bool Son2_lag;</p><p>  int son_a;</p><p>  int Daughter_b;</p><p>  bool Daughter1_lag;</p&g

13、t;<p>  bool Daughter2_lag;</p><p>  void Print()</p><p><b>  {</b></p><p>  cout<<" 現(xiàn)在盤子里有"<<apple<<"個蘋果,&quo

14、t;<<orange<<"個橘子,"<<"共有"<<apple+orange<<"個水果."<<endl;</p><p>  if(Father_lag==true)</p><p>  cout<<"

15、 Father進程處于等待狀態(tài),"<<endl;</p><p>  if(Mother_lag==true)</p><p>  cout<<" Mother進程處于等待狀態(tài),"<<endl;</p><p>  if(Son1_lag==true)<

16、/p><p>  cout<<" Son1進程處于等待狀態(tài),"<<endl;</p><p>  if(Son2_lag==true) </p><p>  cout<<" Son2進程處于等待狀態(tài), "<<

17、endl;</p><p>  if(Daughter1_lag==true)</p><p>  cout<<" Daughter1進程處于等待狀態(tài),"<<endl;</p><p>  if(Daughter2_lag==true)</p><p>  co

18、ut<<" Daughter2進程處于等待狀態(tài),"<<endl;</p><p>  if(((Father_lag==false)&&(Mother_lag==false)&&(Son1_lag==false)&&(Son2_lag==false)&&(Daughte

19、r1_lag==false)&&(Daughter2_lag==false))!=true)</p><p>  cout<<endl;</p><p><b>  }</b></p><p>  void Father() //Father進程</p><p><b>  {&

20、lt;/b></p><p><b>  apple++;</b></p><p><b>  Print();</b></p><p><b>  }</b></p><p>  void Mother() //Mother進程</p><p>

21、<b>  {</b></p><p><b>  orange++;</b></p><p><b>  Print();</b></p><p><b>  }</b></p><p>  void Son1() //Son1進程</p>

22、<p><b>  {</b></p><p><b>  orange--;</b></p><p><b>  Print();</b></p><p><b>  }</b></p><p>  void Son2() //Son2進

23、程</p><p><b>  {</b></p><p><b>  orange--;</b></p><p><b>  Print();</b></p><p><b>  }</b></p><p>  void Daug

24、hter1() //Daughter1進程</p><p><b>  {</b></p><p><b>  apple--;</b></p><p><b>  Print();</b></p><p><b>  }</b></p>

25、<p>  void Daughter2() //Daughter2進程</p><p><b>  {</b></p><p><b>  apple--;</b></p><p><b>  Print();</b></p><p><b>  }&l

26、t;/b></p><p>  void main()</p><p><b>  {</b></p><p><b>  int i;</b></p><p>  int Plate_Size;//水果數(shù)量</p><p>  int MonFa_c;//用于爸爸媽媽

27、等待次序的區(qū)別</p><p>  int Son_a;//用于兩個兒子等待次序的區(qū)別</p><p>  int daughter_b;//用于兩個女兒等待次序的區(qū)別</p><p>  int k;//產生進程調用的數(shù)量</p><p>  srand((unsigned)time(NULL));//srand()函數(shù)產生一個以當前時間開

28、始的隨機種子 </p><p>  for(k=0;k<10;k++)</p><p><b>  { </b></p><p>  cout<<endl;</p><p>  cout<<"***********************************"<

29、<"第"<<k+1<<"次操作"<<"***********************************"<<endl;</p><p>  i=rand()%6; //隨進生成1-5.</p><p>  Plate_Size=apple+orange;</

30、p><p><b>  switch(i)</b></p><p><b>  {</b></p><p><b>  case 0:</b></p><p>  cout<<" Father調用."<&l

31、t;endl;</p><p>  if(Plate_Size==2)</p><p><b>  {</b></p><p>  Father_lag=true;//Father()等待</p><p><b>  Print();</b></p><p>  if(Mot

32、her_lag==false)</p><p>  MonFa_c=1;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  Father()

33、;</b></p><p>  if((Daughter1_lag==true)&&(Daughter2_lag==true))</p><p><b>  {</b></p><p>  if(Daughter_b==1)</p><p><b>  {</b><

34、/p><p>  Daughter1_lag=false;//Daughter1等待取消</p><p>  cout<<" 處于等待的Daughter1自動被調用"<<endl;</p><p>  Daughter1(); //處于等待的Daughter1自動調用</p>

35、<p>  Daughter_b=2;</p><p><b>  }</b></p><p><b>  else </b></p><p><b>  {</b></p><p>  Daughter2_lag=false;//Daughter2等待取消&

36、lt;/p><p>  cout<<" 處于等待的Daughter2自動被調用"<<endl;</p><p>  Daughter2(); //處于等待的Daughter2()自動調用</p><p>  Daughter_b=1;</p><p><b&

37、gt;  }</b></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if(Daughter1_lag==true)</p><p><b

38、>  {</b></p><p>  Daughter1_lag=false;//Daughter1等待取消</p><p>  cout<<" 處于等待的Daughter1自動被調用"<<endl;</p><p>  Daughter1(); //處于等待的Da

39、ughter1()自動調用</p><p>  Daughter_b=0;</p><p><b>  }</b></p><p>  else if(Daughter2_lag==true)</p><p><b>  {</b></p><p>  Daughter2_l

40、ag=false;//Daughter2等待取消</p><p>  cout<<" 處于等待的Daughter1自動被調用"<<endl;</p><p>  Daughter2(); //處于等待的Daughter2()自動調用</p><p>  Daughter_b=0;&l

41、t;/p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  case 1:</b

42、></p><p>  cout<<" Mother調用."<<endl;</p><p>  if(Plate_Size==2)</p><p><b>  {</b></p><p>  Mother_lag=true; //等待

43、</p><p><b>  Print();</b></p><p>  if(Father_lag==false)</p><p>  MonFa_c=2;</p><p><b>  }</b></p><p><b>  else</b><

44、/p><p><b>  {</b></p><p><b>  Mother();</b></p><p>  if((Son1_lag==true)&&(Son2_lag==true))</p><p><b>  {</b></p><p&

45、gt;  if(Son_a==1)</p><p><b>  {</b></p><p>  Son1_lag=false;//Son1等待取消</p><p>  cout<<" 處于等待的Son1自動被調用"<<endl;</p><p&

46、gt;  Son1(); //處于等待的Son1()自動調用</p><p><b>  Son_a=2;</b></p><p><b>  }</b></p><p><b>  else </b></p><p><b>  {</b>&

47、lt;/p><p>  Son2_lag=false;//Son2等待取消</p><p>  cout<<" 處于等待的Son2自動被調用"<<endl;</p><p>  Son2(); //處于等待的Son2()自動調用</p><p><b>

48、  Son_a=1;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else </b></p><p><b>  {</b></p><p>  i

49、f(Son1_lag==true)</p><p><b>  {</b></p><p>  Son1_lag=false; //Son1等待取消</p><p>  cout<<" 處于等待的Son1自動被調用"<<endl;</p><p

50、>  Son1(); //處于等待的Son1()自動調用</p><p><b>  Son_a=0;</b></p><p><b>  }</b></p><p>  else if(Son2_lag==true)</p><p><b>  {</b>&l

51、t;/p><p>  Son2_lag=false; //Son2等待取消</p><p>  cout<<" 處于等待的Son2自動被調用"<<endl;</p><p>  Son2(); //處于等待的Son2()自動調用</p><p><

52、b>  Son_a=0;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  break;</b></p><p&

53、gt;<b>  case 2: </b></p><p>  cout<<" Son1調用."<<endl;</p><p>  if(orange==0)</p><p><b>  {</b></p><p> 

54、 Son1_lag=true; //Son1處于等待</p><p><b>  Print();</b></p><p>  if(Son2_lag==false)</p><p>  Son_a=1; //用于判斷Son1和Son2等待的先后性</p><p><b>  }</b&g

55、t;</p><p><b>  else</b></p><p><b>  {</b></p><p><b>  Son1();</b></p><p>  if((Father_lag==true)&&(Mother_lag==true))</p&

56、gt;<p><b>  {</b></p><p>  if(MonFa_c==1) //Father和Mother同時處于等待,但Father先等待,因此先調用</p><p><b>  {</b></p><p>  Father_lag=false;</p><p> 

57、 cout<<" 處于等待的Father自動被調用"<<endl;</p><p><b>  Father();</b></p><p>  MonFa_c=2;</p><p><b>  }</b></p><p&g

58、t;  else //Father和Mother同時處于等待,但Mother先等待,因此先調用</p><p><b>  {</b></p><p>  Mother_lag=false;</p><p>  cout<<" 處于等待的Mother自動被調用"<<

59、;endl;</p><p><b>  Mother();</b></p><p>  MonFa_c=1;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  else</b&g

60、t;</p><p><b>  {</b></p><p>  if(Father_lag==true) //只有Father處于等待,調用</p><p><b>  {</b></p><p>  Father_lag=false;</p><p>  cout<

61、;<" 處于等待的Father自動被調用"<<endl;</p><p><b>  Father();</b></p><p>  MonFa_c=0;</p><p><b>  }</b></p><p>  else

62、 if(Mother_lag==true)//只有Mother處于等待,調用</p><p><b>  {</b></p><p>  Mother_lag=false;</p><p>  cout<<" 處于等待的Mother自動被調用"<<endl;<

63、;/p><p><b>  Mother();</b></p><p>  MonFa_c=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p>

64、<p><b>  break;</b></p><p><b>  case 3:</b></p><p>  cout<<" Son2調用."<<endl;</p><p>  if(orange==0)</p>

65、<p><b>  {</b></p><p>  Son2_lag=true; //Son2處于等待</p><p><b>  Print();</b></p><p>  if(Son1_lag==false)</p><p><b>  Son_a=2;</b

66、></p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p><b>  Son2();</b></p><p>  if((Father_l

67、ag==true)&&(Mother_lag==true))</p><p><b>  {</b></p><p>  if(MonFa_c==1)//Father和Mother同時處于等待,但Father先等待,因此先調用</p><p><b>  {</b></p><p>

68、  Father_lag=false;</p><p>  cout<<" 處于等待的Father自動被調用"<<endl;</p><p><b>  Father();</b></p><p>  MonFa_c=2;</p><p>

69、<b>  }</b></p><p>  else //Father和Mother同時處于等待,但Mother先等待,因此先調用</p><p><b>  {</b></p><p>  Mother_lag=false;</p><p>  cout<<"

70、 處于等待的Mother自動被調用"<<endl;</p><p><b>  Mother();</b></p><p>  MonFa_c=1;</p><p><b>  }</b></p><p><b>  }</b>

71、</p><p><b>  else</b></p><p><b>  {</b></p><p>  if(Father_lag==true) //只有Father處于等待,調用</p><p><b>  {</b></p><p>  Fa

72、ther_lag=false;</p><p>  cout<<" 處于等待的Father自動被調用"<<endl;</p><p><b>  Father();</b></p><p>  MonFa_c=0;</p><p><

73、b>  }</b></p><p>  else if(Mother_lag==true) //只有Mother處于等待,調用</p><p><b>  {</b></p><p>  Mother_lag=false;</p><p>  cout<<"

74、 處于等待的Mother自動被調用"<<endl;</p><p><b>  Mother();</b></p><p>  MonFa_c=0;</p><p><b>  }</b></p><p><b>  }</b></p

75、><p><b>  }</b></p><p><b>  break;</b></p><p><b>  case 4:</b></p><p>  cout<<" Daughter1調用."<<

76、;endl;</p><p>  if(apple==0)</p><p><b>  {</b></p><p>  Daughter1_lag=true; //Daughter1等待</p><p><b>  Print();</b></p><p>  if(Dau

77、ghter2_lag==false)</p><p>  Daughter_b=1;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  Daughter1()

78、; </p><p>  if((Father_lag==true)&&(Mother_lag==true))</p><p><b>  {</b></p><p>  if(MonFa_c==1) //Father和Mother同時處于等待,但Father先</p><p>  {

79、 //等待,因此先調用</p><p>  Father_lag=false;</p><p>  cout<<" 處于等待的Father自動被調用"<<endl;</p><p><b>  Father();</b></p><p&g

80、t;  MonFa_c=2;</p><p><b>  }</b></p><p>  else //Father和Mother同時處于等待,但Mother先等待,因此先調用</p><p><b>  {</b></p><p>  Mother_lag=false;</p>

81、<p>  cout<<" 處于等待的Mother自動被調用"<<endl;</p><p><b>  Mother();</b></p><p>  MonFa_c=1;</p><p><b>  }</b></p>

82、;<p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><p>  if(Father_lag==true) //只有Father處于等待,調用</p><p><b>  {&l

83、t;/b></p><p>  Father_lag=false;</p><p>  cout<<" 處于等待的Father自動被調用"<<endl;</p><p><b>  Father();</b></p><p>  Mo

84、nFa_c=0;</p><p><b>  }</b></p><p>  else if(Mother_lag==true) //只有Mother處于等待,調用</p><p><b>  {</b></p><p>  Mother_lag=false;</p><p&g

85、t;  cout<<" 處于等待的Mother自動被調用"<<endl;</p><p><b>  Mother();</b></p><p>  MonFa_c=0;</p><p><b>  }</b></p><

86、p><b>  }</b></p><p><b>  }</b></p><p><b>  break;</b></p><p><b>  case 5:</b></p><p>  cout<<"

87、 Daughter2調用."<<endl;</p><p>  if(apple==0)</p><p><b>  {</b></p><p>  Daughter2_lag=true;//Daughter2等待</p><p>  Print();</p>

88、<p>  if(Daughter1_lag==false)</p><p>  Daughter_b=2;</p><p><b>  }</b></p><p><b>  else</b></p><p><b>  {</b></p><

89、;p>  Daughter2();</p><p>  if((Father_lag==true)&&(Mother_lag==true))</p><p><b>  {</b></p><p>  if(MonFa_c==1) //Father和Mother同時處于等待,但Father先等待,因此先調用</p&

90、gt;<p><b>  {</b></p><p>  Father_lag=false;</p><p>  cout<<" 處于等待的Father自動被調用"<<endl;</p><p><b>  Father();</b&

91、gt;</p><p>  MonFa_c=2;</p><p><b>  }</b></p><p>  else //Father和Mother同時處于等待,但Mother先等待,因此先調用</p><p>  { Mother_lag=false;</p><p>  cout<

92、;<" 處于等待的Mother自動被調用"<<endl;</p><p><b>  Mother();</b></p><p>  MonFa_c=1;</p><p><b>  }</b></p><p><b&

93、gt;  }</b></p><p><b>  else </b></p><p><b>  {</b></p><p>  if(Father_lag==true) //只有Father處于等待,調用</p><p>  { Father_lag=false;</p&g

94、t;<p>  cout<<" 處于等待的Father自動被調用"<<endl;</p><p><b>  Father();</b></p><p>  MonFa_c=0;</p><p><b>  }</b></

95、p><p>  else if(Mother_lag==true) //只有Mother處于等待,調用</p><p>  { Mother_lag=false;</p><p>  cout<<" 處于等待的Mother自動被調用"<<endl;</p><p

96、><b>  Mother();</b></p><p>  MonFa_c=0;</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><

97、;b>  break;</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  提交結果框圖</b></p><p&g

98、t;  由于程序是模擬產生10次隨機的操作,執(zhí)行相應的函數(shù)來模擬進程同步??梢詫⒊绦蜻\行兩次將會得到不同的結果。</p><p>  第一次產生結果如下:</p><p>  圖3 第一次隨機操作結果</p><p>  圖4 第一次隨機操作結果</p><p>  圖5 第二次隨機操作結果</p><p>  圖

99、6 第二次隨機操作結果</p><p><b>  2 總結</b></p><p>  此次試驗是完全在自己獨立完成的,首先在分析問題并把問題轉化為編程問題,我覺得個人把握的很好,對進程同步模擬理解的比較透徹;其次我用了個隨機函數(shù)來調用相應的進程函數(shù),這對進程間的同步和等待狀態(tài)有很好的說明,和十分的全面;再次我設了六個bool型的變量來表示各進程時候處于等待狀態(tài),還

100、設置了相應的整型變量來解決等待進程在適當?shù)臈l件下自動調用的先后問題。這些我個人認為我設計的比較出色。</p><p>  這次自己的收獲還是不小,首先使我提高了分析問題,并根據(jù)需求轉化成相應的程序結構的能力;其次也豐富了自己編寫程序,調試程序的經(jīng)驗,這使得我編程時可能出現(xiàn)的錯誤的認識,并如何去避免產生了新的認識。</p><p>  對于此題我覺得除了可以用隨機函數(shù)來產生隨機數(shù)來調用相應的

101、進程函數(shù),也可以用人輸入的方式來選擇調用相應的進程函數(shù),這樣可以會麻煩些,不過對進程同步的模擬可能會更加透徹。</p><p>  總的來說這次試驗比較成功,加深我了進程的理解,同時也提高了自己的編程的能力。編程是個長久的過程,平時要多去動手實踐,去提高自己分析問題、發(fā)現(xiàn)問題、解決問題的能力。</p><p><b>  3 參考文獻</b></p>&

溫馨提示

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

評論

0/150

提交評論