操作系統(tǒng)課程設(shè)計報告---生產(chǎn)者消費者同步算法_第1頁
已閱讀1頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  操作系統(tǒng)</b></p><p><b>  課程設(shè)計說明書</b></p><p>  題 目: 生產(chǎn)者消費者同步算法 </p><p>  院 系: 國際教育學(xué)院 </p><p><b>  目錄</b

2、></p><p><b>  一、概述1</b></p><p>  二、 使用的基本概念和原理1</p><p><b>  2.1多道程序1</b></p><p><b>  2.1進程2</b></p><p><b>

3、  2.3線程2</b></p><p>  2.4同步和互斥的概念3</p><p><b>  三、 總體設(shè)計3</b></p><p>  四、 詳細編碼設(shè)計4</p><p>  4.1 UI界面主線程4</p><p><b>  4.2管程類5<

4、/b></p><p><b>  4.3生產(chǎn)者類6</b></p><p><b>  4.4消費者類7</b></p><p>  五、運行效果截圖:7</p><p><b>  六、總結(jié)8</b></p><p><b>

5、  一、概述</b></p><p><b>  目的;</b></p><p>  根據(jù)進程同步機制,編寫一個解決下述問題的程序,可顯示緩沖池狀態(tài)、放數(shù)據(jù)、取數(shù)據(jù)等過程。</p><p>  問題:一組生產(chǎn)者向一組消費者提供消息,它們共享一個有界緩沖池,生產(chǎn)者向其中投放消息,消費者從中取得消息。假定這些生產(chǎn)者和消費者互相等效,只要

6、緩沖池未滿,生產(chǎn)者可將消息送入緩沖池;只要緩沖池未空,消費者可從緩沖池取走一個消息。</p><p>  主要完成的任務(wù);通過多線程編程實現(xiàn)生產(chǎn)者消費者同步算法。</p><p>  使用的開發(fā)工具;Eclipse,語言Java</p><p>  解決的主要問題:上述問題。</p><p>  二、 使用的基本概念和原理</p>

7、<p><b>  2.1多道程序</b></p><p>  多道程序設(shè)計是指在主存中同時存放多道用戶作業(yè),使它們都處于執(zhí)行的開始點和開始點之間,這些程序共享計算機系統(tǒng)資源。</p><p>  多道程序設(shè)計的主要優(yōu)點有:</p><p>  (1)提高CPU的利用率。在多道程序環(huán)境下,多個程序共享計算機資源當某個程序等待I/O

8、操作時,CPU可以執(zhí)行其他程序,大大提高CPU的利用率。</p><p>  (2)提高設(shè)備的利用率。在多道程序環(huán)境下,多個程序共享系統(tǒng)的設(shè)備,大大提高系統(tǒng)設(shè)備的利用率。</p><p>  (3)提高系統(tǒng)的吞吐量。在多道程序環(huán)境下,減少了程序的等待時間,提高了系統(tǒng)的吞吐量。</p><p><b>  2.1進程</b></p>

9、<p>  進程是一個具有一定獨立功能的程序關(guān)于某個數(shù)據(jù)集合的一次運行活動。它是操作系統(tǒng)動態(tài)執(zhí)行的基本單元,在傳統(tǒng)的操作系統(tǒng)中,進程既是基本的分配單元,也是基本的執(zhí)行單元。</p><p><b>  2.3線程</b></p><p>  線程,有時被稱為輕量級進程(Lightweight Process,LWP),是程序執(zhí)行流的最小單元。一個標準的線程

10、由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統(tǒng)獨立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創(chuàng)建和撤消另一個線程,同一進程中的多個線程之間可以并發(fā)執(zhí)行。由于線程之間的相互制約,致使線程在運行中呈現(xiàn)出間斷性。線程也有就緒、阻塞和運行三種基本狀態(tài)。每一個程序都至少有一個線程,那就是程序本身

11、。</p><p>  線程是程序中一個單一的順序控制流程。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。</p><p>  2.4同步和互斥的概念</p><p>  進程互斥是進程之間發(fā)生的一種間接性作用,一般是程序不希望的。通常的情況是兩個或兩個以上的進程需要同時訪問某個共享變量。我們一般將發(fā)生能夠問共享變量的程序段成為臨界區(qū)。兩個進程不能同時進入

12、臨界區(qū),否則就會導(dǎo)致數(shù)據(jù)的不一致,產(chǎn)生與時間有關(guān)的錯誤。解決互斥問題應(yīng)該滿足互斥和公平兩個原則,即任意時刻只能允許一個進程處于同一共享變量的臨界區(qū),而且不能讓任一進程無限期地等待?;コ鈫栴}可以用硬件方法解決,我們不作展開;也可以用軟件方法,這將會在本講詳細介紹。</p><p>  同步是指在互斥的基礎(chǔ)上(大多數(shù)情況),通過其它機制實現(xiàn)訪問者對資源的有序訪問。在大多數(shù)情況下,同步已經(jīng)實現(xiàn)了互斥,特別是所有寫入資源

13、的情況必定是互斥的。少數(shù)情況是指可以允許多個訪問者同時訪問資源。</p><p><b>  三、 總體設(shè)計</b></p><p>  基本的技術(shù)路線:面向?qū)ο?lt;/p><p>  軟件的總體結(jié)構(gòu)、模塊關(guān)系、總體流程;</p><p><b>  總體分為4個模塊:</b></p>

14、<p>  用戶圖形界面模塊UI.java</p><p>  消費者Consumer.java</p><p>  生產(chǎn)者 Producer.java</p><p>  管程Pool.java</p><p>  模塊關(guān)系:UI負責(zé)通過界面接收設(shè)置的參數(shù),然后按照相應(yīng)的參數(shù)啟動消費者線程和生產(chǎn)者線程。管程被消費者線程和生產(chǎn)者線程

15、調(diào)用,以完成對共享緩沖區(qū)的數(shù)據(jù)操作。</p><p>  總體流程:啟動UI顯示圖形界面,輸入?yún)?shù),然后設(shè)置管程緩沖大小,啟動消費者生產(chǎn)者線程同時把管城對象傳遞給它們。</p><p><b>  四、 詳細編碼設(shè)計</b></p><p>  總體執(zhí)行過程是:輸入?yún)?shù)、點擊設(shè)置使之生效、然后點擊開始</p><p> 

16、 4.1 UI界面主線程</p><p>  里面有幾個重要的屬性;</p><p>  private int CustomerSize; //消費者的數(shù)量</p><p>  private int ProducerSize; //生產(chǎn)者的數(shù)量</p><p>  private int

17、 PoolSize; //緩沖區(qū)大小</p><p>  public Pool pool; //管城對象</p><p>  public int buySpeed; //消費間隔,控制消費速度</p><p>  public int pro

18、duceSpeed; //生產(chǎn)間隔,控制生產(chǎn)速度</p><p>  public long inProductCount=0; //已經(jīng)生產(chǎn)產(chǎn)品的數(shù)量</p><p>  public long outProductCount=0; //已經(jīng)消費的產(chǎn)品數(shù)量</p><p>  public long cur

19、rentProductCount=0; //當前的產(chǎn)品數(shù)量</p><p>  public boolean isStop=false; //強制線程退出的信號量</p><p>  這些屬性是在點擊界面的設(shè)置按鈕后把用戶輸入的參數(shù)進行相應(yīng)的賦值。</p><p>  當點擊開始按鈕后執(zhí)行下面的主要代碼:</p><p&g

20、t;  //一些必要的初始化</p><p>  isStop=false;</p><p>  inProductCount=0;</p><p>  outProductCount=0;</p><p>  currentProductCount=0;</p><p>  this.pool=new Pool(th

21、is);//初始化管程</p><p>  this.pool.MAX_SIZE=this.PoolSize;//設(shè)置倉庫大小</p><p>  //開啟消費者線程和生產(chǎn)者線程</p><p>  //啟動線程同時把ui界面對象傳遞到線程中,使線程獲得必要的設(shè)置信息</p><p>  for(int i=0;i<this.Custo

22、merSize;i++){</p><p>  new Thread(new Customer(this)).start();</p><p><b>  }</b></p><p>  for(int i=0;i<this.ProducerSize;i++){</p><p>  new Thread(new P

23、roducer(this)).start();</p><p><b>  }</b></p><p>  消費者和生產(chǎn)者的同步和他們各自之間的互斥都是在管程里面實現(xiàn)的.</p><p><b>  4.2管程類</b></p><p>  import java.util.Date;</p&

24、gt;<p>  import java.util.Stack;</p><p>  public class Pool {</p><p>  private Stack<Integer> products;//用一個棧模擬一個緩沖區(qū)</p><p>  public int MAX_SIZE; //棧能到

25、達的最大值</p><p>  private UI ui; //接收轉(zhuǎn)遞進來的ui對象,以實現(xiàn)操作界面顯示相關(guān)信息</p><p>  public Pool(UI ui){</p><p>  this.ui=ui;</p><p>  this.products=new Stack<Integer>();</p>

26、;<p><b>  }</b></p><p>  public synchronized void getProduct(){</p><p>  //synchronized實現(xiàn)了消費者線程間的互斥保證同一時刻只能有一個線程調(diào)用該方法</p><p>  while(this.products.isEmpty()){<

27、/p><p>  //products是一個棧結(jié)構(gòu)通過判斷它的空實現(xiàn)消費者線程和生產(chǎn)者線程之間的同步 try {</p><p>  wait();//棧是空的,不能取數(shù)據(jù),線程等待</p><p>  } catch (InterruptedException e) {</p><p>  e.printStackTrace

28、();}}</p><p>  int product;</p><p>  product=products.pop();//棧沒有空,取數(shù)據(jù)</p><p>  ui.addInfo("消費者【"+Thread.currentThread().getId()+"】從倉庫取出產(chǎn)品【"+product+</p>

29、<p>  "】成功。當前庫存量【"+products.size()+"】" +</p><p>  "---當前時間戳:"+new Date().getTime());</p><p>  ui.outProductCount++;</p><p>  ui.currentProductCoun

30、t=products.size();</p><p>  ui.refreshStatus();</p><p>  notifyAll();//取完數(shù)據(jù)同時生產(chǎn)線程生產(chǎn)產(chǎn)品</p><p><b>  }</b></p><p>  public synchronized void setProduct(){</

31、p><p>  //synchronized實現(xiàn)了生產(chǎn)者線程間的互斥保證同一時刻只能有一個線程調(diào)用該方法</p><p>  int product=(int)(Math.random()*10000);</p><p>  while(this.products.size()==MAX_SIZE){</p><p>  //products是一

32、個棧結(jié)構(gòu)通過判斷它的滿實現(xiàn)消費者線程和生產(chǎn)者線程之間的同步</p><p><b>  try {</b></p><p>  wait();//棧滿了,不能繼續(xù)生產(chǎn),線程等待</p><p>  } catch (InterruptedException e) {</p><p>  e.printStackTrace

33、();}</p><p><b>  }</b></p><p>  this.products.push(product);//棧沒有滿,繼續(xù)生產(chǎn)</p><p>  ui.addInfo("生產(chǎn)者【"+Thread.currentThread().getId()+"】將產(chǎn)品【"+product+<

34、;/p><p>  "】放入倉庫。當前庫存量【"+products.size()+"】" +</p><p>  "---當前時間戳:"+new Date().getTime());</p><p>  ui.inProductCount++;</p><p>  ui.currentP

35、roductCount=products.size();</p><p>  ui.refreshStatus();</p><p>  notifyAll();//生產(chǎn)完畢,通知消費者消費</p><p><b>  }}</b></p><p><b>  4.3生產(chǎn)者類</b></p&g

36、t;<p>  import java.util.Date;</p><p>  public class Producer implements Runnable{</p><p><b>  UI ui;</b></p><p>  public Producer(UI ui){</p><p>  t

37、his.ui=ui;//接收傳遞進來的界面對象,以實現(xiàn)在線程中操作界面顯示信息</p><p><b>  }</b></p><p>  public void run() {</p><p>  while(!ui.isStop) {</p><p>  //如果信號量ui.isStop是false則一直消費下去,否

38、則退出循環(huán)線程自然消亡</p><p>  ui.pool.setProduct();//調(diào)用管程生產(chǎn)方法生產(chǎn)產(chǎn)品</p><p><b>  try {</b></p><p>  Thread.currentThread().sleep(ui.produceSpeed);</p><p>  } catch (Int

39、erruptedException e) {</p><p>  e.printStackTrace();</p><p><b>  }</b></p><p><b>  }</b></p><p>  //線程退出前在界面中提示本線程退出</p><p>  ui.ad

40、dInfo("生產(chǎn)者【"+Thread.currentThread().getId()+"】停止生產(chǎn)成功." +</p><p>  "---當前時間戳:"+new Date().getTime());}}</p><p><b>  4.4消費者類</b></p><p>  (結(jié)構(gòu)

41、同上不用再注釋)</p><p>  import java.util.Date;</p><p>  public class Customer implements Runnable{</p><p><b>  UI ui;</b></p><p>  public Customer(UI ui){</p&g

42、t;<p>  this.ui=ui;</p><p><b>  }</b></p><p>  public void run() {</p><p>  while (!ui.isStop) {</p><p>  ui.pool.getProduct();//調(diào)用管程的消費方法消費產(chǎn)品</p&

43、gt;<p><b>  try {</b></p><p>  Thread.currentThread().sleep(ui.buySpeed);</p><p>  } catch (InterruptedException e) {</p><p>  e.printStackTrace();</p><

44、;p><b>  }</b></p><p><b>  }</b></p><p>  ui.addInfo("消費者"+Thread.currentThread().getId()+"停止購物成功." +</p><p>  "---當前時間戳:"+ne

45、w Date().getTime());</p><p><b>  }}</b></p><p><b>  五、運行效果截圖:</b></p><p><b>  六、總結(jié)</b></p><p>  通過本次課程設(shè),使我對線程(進程)之間的同步和互斥有了非常直觀的理解,學(xué)

溫馨提示

  • 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)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論