操作系統(tǒng)課程設計報告—多進程同步橘子蘋果問題_第1頁
已閱讀1頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  操作系統(tǒng)課程設計報告</p><p>  院(系): 計算機工程學院 </p><p>  專業(yè): 計算機科學與技術專業(yè) </p><p>  學生姓名: __ </p><p>  班級:__ 學號:    

2、 </p><p>  題目: 用多進程同步方法演示“桔子-蘋果”問題____ </p><p>  起迄日期: _2012.07.02_--2012.07.13_ ____</p><p>  設計地點: 現(xiàn)代教育中心    </p><p>  指 導 教 師: 熊曉蕓

3、 </p><p>  2011—2012年度 第 2 學期</p><p>  完成日期: 2012 年 7 月 13 日</p><p><b>  課程設計目的</b></p><p>  本次實驗進行操作系統(tǒng)課程設計的主要任務是模擬生產者和消費者的一個衍生,即實現(xiàn)“橘子-蘋果問

4、題”。這個問題中有兩個生產者,分別生產蘋果核橘子,有兩個消費者,分別消費橘子和蘋果。同時,因為兩個生產者和兩個消費者對同一個緩沖區(qū)進行操作,所以應互斥的訪問緩沖區(qū)以保證程序的正確性。本次實驗的目的就是加深各個進程正確有效的對資源的訪問,即同步和互斥。同時掌握信號量在互斥訪問中的使用。掌握生產者和消費者問題的流程和實現(xiàn)方法。同時提高編程的能力、對問題的解決能力及查閱文檔的能力。</p><p><b> 

5、 課程設計內容與要求</b></p><p>  1、通過研究Linux的進程同步機制和信號量,實現(xiàn)特殊的生產者與消費者問題的并發(fā)控制。</p><p>  2、說明:有兩類生產者,一類負責生產桔子,一類負責生產蘋果;有兩類消費者,一類負責消費桔子,一類負責消費蘋果;他們共享一個有20個存儲單元的有界緩沖區(qū),每個存儲單元只能放入一種產品(桔子/蘋果)。</p>&

6、lt;p><b>  3、設計要求:</b></p><p>  二類生產者與二類消費者數目均為20,即20個生產者負責生產桔子,20個生產者負責生產蘋果;20個消費者負責消費桔子,20個消費者負責消費蘋果</p><p>  二類生產者的生產速度與二類消費者的消費速度均可獨立在程序界面調節(jié),在運行中,該值調整后立即生效</p><p>

7、  多個生產者或多個消費者之間必須有共享對緩沖區(qū)進行操作的函數代碼,同時需要考慮算法的效率性</p><p>  每個生產者和消費者對有界緩沖區(qū)進行操作后,即時顯示有界緩沖區(qū)的全部內容、當前生產者與消費者的指針位置,以及生產者和消費者線程標識符</p><p>  采用可視化界面,可在運行過程中隨時暫停,查看當前生產者、消費者以及有界緩沖區(qū)的狀態(tài)</p><p>&

8、lt;b>  系統(tǒng)分析與設計</b></p><p><b>  1、系統(tǒng)分析</b></p><p>  1.此次任務是實現(xiàn)特殊生產者和消費者的演示程序,所需要處理的信息是生產者和消費者的個數,生產蘋果、橘子和消費蘋果、橘子的速度控制,緩沖區(qū)中橘子和蘋果的個數和當前生產、消費指針的位置。</p><p>  2.程序中需要處

9、理緩沖區(qū)的動態(tài)顯示、生產者和消費者的速度可以調節(jié),生產者和消費者個數可以改變。為了實現(xiàn)界面的友好性,應該對用戶標明清楚各個模塊的作用。同時實時的對程序進行暫停和停止。演示程序中用圖形顯示的方法描述緩沖區(qū)的使用情況,即當前緩沖區(qū)有多少個蘋果和橘子,還有生產和消費者的指針。</p><p>  3.系統(tǒng)對外的界面如下:</p><p>  可以調節(jié)橘子和蘋果的生產速度和消費蘋果和橘子的速度,在

10、文本框中輸入相應的速度,再按下修改按鍵即可實現(xiàn)速度的實時調節(jié)。</p><p>  在蘋果生產者、橘子生產者、蘋果消費者、橘子消費者中實現(xiàn)對個數按鈕的按下即可動態(tài)實時的調節(jié)生產者和消費者的個數的調節(jié)。</p><p>  在界面的最下面點擊開始按鈕,程序開始運行,暫停按鈕使程序暫停掛起,再點擊則可以繼續(xù)運行。停止按鈕實現(xiàn)此次程序的演示結束。</p><p>  4.

11、此次使用java平臺實現(xiàn),保證了程序在各種機器的運行,只需要事前建立java的運行環(huán)境即可,便于程序的移植</p><p><b>  5.系統(tǒng)界面如下:</b></p><p><b>  2、系統(tǒng)設計:</b></p><p><b>  2.1、模塊設計:</b></p><

12、p>  2.2、數據結構說明:</p><p>  1.緩沖區(qū)的數據結構:雙端隊列</p><p>  說明:左端放置生產蘋果的指針,右端放置生產橘子的指針。</p><p>  2.緩沖區(qū)操作的類圖,實現(xiàn)對緩沖區(qū)的實際操作</p><p>  2.3、算法流程圖:</p><p><b>  1.生產

13、蘋果算法</b></p><p><b>  2.消費蘋果算法</b></p><p><b>  3.繪圖算法</b></p><p>  4.生產蘋果者人工智能算法(生產橘子人工智能相似)</p><p>  5.蘋果消費者人工智能算法(生產橘子算法類似)</p>&l

14、t;p>  四、系統(tǒng)測試與調試分析</p><p><b>  1、系統(tǒng)測試</b></p><p> ?。?)因為當蘋果生產者在緩沖區(qū)滿了以后自動阻塞,需要蘋果消費者喚醒,所以需要測試喚醒的實現(xiàn)是否正常。</p><p>  (2)因為當蘋果生產者在緩沖區(qū)滿了以后自動阻塞,需要蘋果消費者喚醒,所以需要測試</p><

15、p>  喚醒的實現(xiàn)是否正常。</p><p> ?。?)測試生產者和消費者的速度是否可以調節(jié)</p><p> ?。?)實現(xiàn)了人工智能操作:即系統(tǒng)自動保持生產者和消費者的相對平衡,測試功能的正確實現(xiàn)</p><p><b>  2、調試分析:</b></p><p> ?。?)程序編寫過程中,因為有兩個生產者和消費

16、者,極易把操作寫錯。在編寫增加蘋果數量額函數中,程序中午無法增加蘋果數量。</p><p>  解決辦法:在函數中查找錯誤,對蘋果的操作寫成了對橘子的操作,導致程序出現(xiàn)問題。</p><p>  (2)在對緩沖區(qū)進行繪圖的時候,java的JComponent組件內繪圖位置出現(xiàn)錯誤。</p><p>  解決辦法:JComponent內繪圖時因為JComponent內

17、使用的是相對坐標,所以不能使用面板的絕對坐標,換成相對坐標正確繪圖。</p><p> ?。?)實現(xiàn)人工智能操作的時候,點擊相應按鈕無法執(zhí)行</p><p>  解決辦法:在排查完畢后,發(fā)現(xiàn)按鍵響應沒有對程序已經設計的標志值進行修改,致使程序沒有按預期執(zhí)行,修改完標志值即可以。</p><p><b>  五、用戶手冊</b></p>

18、;<p>  1.使用的語言和平臺</p><p>  本次實驗使用的是java 語言的eclipse平臺</p><p>  2.對于程序運行環(huán)境的注意事項</p><p>  需要安裝java運行環(huán)境,eclipss平臺不需要安裝,只需要下載完成就可以使用。</p><p><b>  3.程序使用步驟</b

19、></p><p>  圖1:系統(tǒng)登錄界面。</p><p>  圖2:生產者速度調節(jié) 圖3:消費者速度調節(jié)</p><p>  圖4:生產者數量調節(jié) 圖5:消費者數量調節(jié)</p><p><b>  圖 6::控制界面</b></p&g

20、t;<p>  圖7:動態(tài)可視化緩沖區(qū)</p><p><b>  4.程序使用步驟:</b></p><p>  1)單擊開始按鈕,程序開始初始化執(zhí)行</p><p>  2)點擊增加按鈕分別增加生產者和消費者,可以看到可視化緩沖區(qū)開始運動</p><p>  3)在速度調節(jié)部分調節(jié)生產者和消費者的速度,

21、可以看到緩沖區(qū)出現(xiàn)預期的產品種類和數量的變化。</p><p>  4)在程序運行狀態(tài),可以點擊“人工智能”按鈕,可以實現(xiàn)人工智能自動操作緩沖區(qū),保持緩沖區(qū)的產品數量和種類的穩(wěn)定,不至于產品數量過多或過少,也不會出現(xiàn)某種產品數量過多或者過少。</p><p><b>  六、程序清單</b></p><p>  public void incr

22、easeapple()</p><p><b>  {</b></p><p>  empty.acquire(); //相當于信號量的P操作,申請空緩沖區(qū)</p><p>  mutex.acquire(); //互斥信號量</p><p>  if(pointapple+1 != pointorange){&

23、lt;/p><p>  pointapple++;</p><p>  if(pointapple == 20)</p><p>  pointapple=19;</p><p>  isFull[pointapple] = true; //將生產了產品的標志位設置為滿applenum++;</p><p>

24、  storage[pointapple] = 'A';//存儲生產的產品</p><p>  pool[pointapple] = 1;//標志此位置生產的是蘋果,1表示蘋果</p><p><b>  }</b></p><p>  String str2 = Thread.currentThread().getName()

25、;</p><p>  Apple.textArea2.append("生產者生產了一個蘋果" + str2 + " 運行\(zhòng)n");</p><p><b>  number++;</b></p><p>  Apple.textArea1.append("倉庫中的產品個數為" + n

26、umber + "\n");</p><p>  Apple.textArea1.append("它們是:\n");</p><p>  for (int j = 0; j < 20; j++)</p><p><b>  {</b></p><p>  if(storage

27、[j] != '0')</p><p>  Apple.textArea1.append("("+j+")"+storage[j] + " ");</p><p><b>  else </b></p><p>  Apple.textArea1.append(&quo

28、t; ");</p><p><b>  }</b></p><p>  Apple.textArea1.append("\n");</p><p>  mutex.release();//釋放互斥鎖</p><p>  full.release();//增加滿信號量的值</p>

29、<p>  apple.release();//增加蘋果信號量的值</p><p><b>  }</b></p><p>  public void increaseorange()</p><p><b>  {</b></p><p>  empty.acquire();//相當

30、于信號量的P操作,申請空緩沖區(qū)</p><p>  mutex.acquire();//互斥進入臨界區(qū)</p><p>  if(pointapple+1!= pointorange){</p><p>  pointorange--;</p><p>  if(pointorange < 0)</p><p>

31、  pointorange = 0;</p><p>  isFull[pointorange] = true;//將此位置設置成滿狀態(tài)</p><p>  orangenum++;</p><p>  storage[pointorange] = 'O';//存儲生產產品,O表示橘子</p><p>  pool[point

32、orange] = 2;//標志此位置是橘子,2表示橘子</p><p><b>  }</b></p><p>  String str2 = Thread.currentThread().getName();</p><p>  Apple.textArea2.append("生產者生產了一個橘子" + str2 + &

33、quot; 運行\(zhòng)n");</p><p><b>  number++;</b></p><p>  Apple.textArea1.append("倉庫中的數字個數為" + number + "\n");</p><p>  Apple.textArea1.append("它們是:

34、\n");</p><p>  for (int j = 0; j < 20; j++)</p><p><b>  {</b></p><p>  if(storage[j] != '0')</p><p>  Apple.textArea1.append("("+j

35、+")"+storage[j] + " ");</p><p><b>  else </b></p><p>  Apple.textArea1.append(" ");</p><p><b>  }</b></p><p>  App

36、le.textArea1.append("\n");</p><p>  mutex.release();//退出臨界區(qū)</p><p>  full.release();//增加滿信號量的值</p><p>  orange.release();//增加橘子信號量的值</p><p><b>  }</b

37、></p><p>  public void decreaseapple()</p><p><b>  {</b></p><p>  apple.acquire();//申請獲得蘋果</p><p>  full.acquire();//申請滿緩沖區(qū)</p><p>  mutex.a

38、cquire();//互斥進入臨界區(qū)</p><p>  String str2 = Thread.currentThread().getName();</p><p>  Apple.textArea2.append("消費者" + str2 + " 運行\(zhòng)n");</p><p><b>  number--;&

39、lt;/b></p><p>  applenum--;</p><p>  isFull[pointapple] = false;//此位置設置為空</p><p>  pool[pointapple] = 0;//標志此位置是空位置,0表示空</p><p>  Apple.textArea2.append("蘋果消費一個

40、" +storage[applepool[applenum]]+ " 運行\(zhòng)n");</p><p>  storage[pointapple] = '0';</p><p>  pointapple--; //蘋果指針減1</p><p>  Apple.textArea1.append("倉庫中的數字個

41、數為" + number + "\n");</p><p>  Apple.textArea1.append("它們是:\n");</p><p>  for (int j = 0; j < 20; j++)</p><p><b>  {</b></p><p>

42、  if(storage[j] != '0')</p><p>  Apple.textArea1.append("("+j+")"+storage[j] + " ");</p><p><b>  else </b></p><p>  Apple.textArea1

43、.append(" ");</p><p><b>  }</b></p><p>  Apple.textArea1.append("\n");</p><p>  mutex.release();//退出臨界區(qū)</p><p>  empty.release();//空緩沖區(qū)信

44、號量+1</p><p><b>  }</b></p><p>  public void decreaseorange()</p><p><b>  {</b></p><p>  orange.acquire();//申請獲得橘子</p><p>  full.acq

45、uire();//申請滿緩沖區(qū)</p><p>  mutex.acquire();//互斥進入臨界區(qū)</p><p>  String str2 = Thread.currentThread().getName();</p><p>  Apple.textArea2.append("消費者" + str2 + " 運行\(zhòng)n"

46、;);</p><p><b>  number--;</b></p><p>  orangenum--; </p><p>  isFull[pointorange] = false;</p><p>  pool[pointorange] = 0;</p><p>  Apple.t

47、extArea2.append("橘子消費一個" + storage[orangepool[orangenum]] + " 運行\(zhòng)n");</p><p>  storage[pointorange] = '0';</p><p>  pointorange++; //橘子指針右移一位</p>

48、<p>  Apple.textArea1.append("倉庫中的數字個數為" + number + "\n");</p><p>  Apple.textArea1.append("它們是:\n");</p><p>  for (int j = 0; j < 20; j++)</p><

49、p><b>  {</b></p><p>  if(storage[j] != '0')</p><p>  Apple.textArea1.append("("+j+")"+storage[j] + " ");</p><p><b>  else

50、</b></p><p>  Apple.textArea1.append(" ");</p><p><b>  }</b></p><p>  Apple.textArea1.append("\n");</p><p>  mutex.release();//退出臨

51、界區(qū)</p><p>  empty.release();//空信號量+1</p><p><b>  }</b></p><p>  class Semaphore{</p><p>  int value;</p><p>  public Semaphore(int v){</p>

52、;<p>  this.value = v;</p><p><b>  }</b></p><p>  //定義P原語操作,原語操作就是執(zhí)行時不能中斷,所以synchronized修飾</p><p>  public synchronized void acquire(){</p><p><

53、;b>  value--;</b></p><p>  if(value<0){</p><p><b>  try {</b></p><p>  this.wait();</p><p>  } catch (InterruptedException e) {</p><p

54、>  e.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  public synchronized void release(){</

55、p><p><b>  value++;</b></p><p>  if(value<=0){</p><p>  this.notify();</p><p><b>  }</b></p><p><b>  }</b></p>&

56、lt;p><b>  }</b></p><p><b>  }</b></p><p>  public static int increaseappleProducer()//增加蘋果生產者線程</p><p><b>  {</b></p><p>  if(i1

57、< 20)</p><p><b>  {</b></p><p>  appleincrease[i1] = new Increaseapple(myStorage);</p><p>  appleincrease[i1].start();</p><p><b>  i1++;</b>&

58、lt;/p><p><b>  }</b></p><p>  return i1;</p><p><b>  }</b></p><p>  public static int increaseorangeProducer()//增加橘子生產者線程</p><p><b

59、>  {</b></p><p>  if(i2 < 20)</p><p><b>  {</b></p><p>  orangeincrease[i2] = new Increaseorange(myStorage);</p><p>  orangeincrease[i2].start()

60、;</p><p><b>  i2++;</b></p><p><b>  }</b></p><p>  return i2;</p><p><b>  }</b></p><p>  public static int decreaseappl

61、eProducer()//減少蘋果生產者線程</p><p><b>  {</b></p><p>  if(i1 > 0)</p><p><b>  {</b></p><p>  appleincrease[i1 - 1].out = true;</p><p>

62、;  appleincrease[i1 - 1] = null;</p><p><b>  i1--;</b></p><p><b>  }</b></p><p>  return i1;</p><p><b>  }</b></p><p> 

63、 public static int decreaseorangeProducer()//減少橘子生產者線程</p><p><b>  {</b></p><p>  if(i2 > 0)</p><p><b>  {</b></p><p>  orangeincrease[i2 - 1

64、].out = true;</p><p>  orangeincrease[i2 - 1] = null;</p><p><b>  i2--;</b></p><p><b>  }</b></p><p>  return i2;</p><p><b> 

65、 }</b></p><p>  public static int increaseappleConsumer()//增加蘋果消費者線程</p><p><b>  {</b></p><p>  if(d1 < 20)</p><p><b>  {</b></p&g

66、t;<p>  appledecrease[d1] = new Decreaseapple(myStorage);</p><p>  appledecrease[d1].start();</p><p><b>  d1++;</b></p><p><b>  }</b></p><p

67、>  return d1;</p><p><b>  }</b></p><p>  public static int increaseorangeConsumer()//增加橘子消費者線程</p><p><b>  {</b></p><p>  if(d2 < 20)</

68、p><p><b>  {</b></p><p>  orangedecrease[d2] = new Decreaseorange(myStorage);</p><p>  orangedecrease[d2].start();</p><p><b>  d2++;</b></p>

69、<p><b>  }</b></p><p>  return d2;</p><p><b>  }</b></p><p>  public static int decreaseappleConsumer()//減少蘋果消費者線程</p><p><b>  {<

70、;/b></p><p>  if(d1 > 0)</p><p><b>  {</b></p><p>  appledecrease[d1 - 1].out = true;</p><p>  appledecrease[d1 - 1] = null;</p><p><b

71、>  d1--;</b></p><p><b>  }</b></p><p>  return d1;</p><p><b>  }</b></p><p>  public static int decreaseorangeConsumer()//減少橘子消費者線程<

72、/p><p><b>  {</b></p><p>  if(d2 > 0)</p><p><b>  {</b></p><p>  orangedecrease[d2 - 1].out = true;</p><p>  orangedecrease[d2 - 1]

73、 = null;</p><p><b>  d2--;</b></p><p><b>  }</b></p><p>  return d2;</p><p><b>  }</b></p><p><b>  七、體會與自我評價</

74、b></p><p>  對于此次課程設計,我使用的是做圖形用戶界面比較容易的java語言,但是自己對java的掌握也不是很深入,尤其是這門不斷發(fā)展壯大的語言,里面包含了各方面的操作,所以掌握起來難度不小,此次課設基本上都是在開學后的這兩周內完成的。</p><p>  這次實驗中需要用到的操作種類很多很雜亂,我都是先在紙上設計完完畢,之后再一點點的將它在計算機中實現(xiàn)預期的效果,在一

75、點點的設計中,每當攻克了一個自己認為難的地方的時候,就會有一種喜悅感產生,促使我去解決更多的問題,這就是學習的樂趣吧,只是單純的將自己的任務完善,追求更高的要求。后來自己做程序做上癮了,不斷有新奇的想法蹦出來,我就開始癡迷的設計實現(xiàn),結果到現(xiàn)在程序的質量已經遠遠超過了我的預期。我自此明白了學習追求上的快樂。此次課程設計在實現(xiàn)緩沖區(qū)動態(tài)圖形顯示的時候自己遇到了困境,在查閱了多方資料后仍然沒有什么進展,自己開始著急,擔心會做不完,不過依舊每

76、天呆在電腦前,不斷的積累經驗,最后才找到繪圖的方法,成果的在界面中描繪出了自己想要的圖形。</p><p>  自己一直都想去追求更高的分數,做的盡善盡美,力圖超額完成老師的任務,不斷的添加自己想到的新功能。但最后完成課程設計的時候,我終于明白,分數不過是個數字,知識才是自己的。通過這次課程設計,我確實學到了很多東西,多年后我可能已經忘記這次課設最后打了多少分,但這些學到的東西卻可以使我受益終生。除了知識技術上的

77、東西,我更鍛煉了自己的快速學習能力;我學會了如何快速有效地從圖書館、網絡獲取自己需要的信息;我嘗到了在周圍很多同學拷來拷去時孤軍奮戰(zhàn)的痛苦;我體會了夜以繼日完成一個項目時中途過程的艱辛及最終完成后巨大的成就感……我更加深了人生的信心,以后面對任何一個困難的項目,我想我都不會懼怕,并最終能夠成功地將其完成。</p><p>  感謝老師,感謝此次課程設計。雖然在其中吃了不少苦頭,但我毫不后悔,因為我滿載而歸。<

78、;/p><p><b>  八、參考文獻</b></p><p>  [1] 湯子瀛 編著,《計算機操作系統(tǒng)(修訂版)》,西安電子科技大學出版社,2001</p><p>  [2] 操作系統(tǒng)教程與實驗 胡明慶,高巍,鐘梅 清華大學出版社 2007.1 </p><p>  [3] Cay S.Horstmann ,Gay

79、cornell著 ,《java核心技術》(第八版),機械工業(yè)出版社 2008</p><p>  [4] BrucEckel著, 《java編程思想》(第四版)機械工業(yè)出版社 2007</p><p>  [5] Rogers Cadenhead著,梅興文譯,Java編程入門經典,人民郵電出版社,2007</p><p>  九、課程設計評價(由任課教師填寫)<

溫馨提示

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

評論

0/150

提交評論