2023年全國(guó)碩士研究生考試考研英語(yǔ)一試題真題(含答案詳解+作文范文)_第1頁(yè)
已閱讀1頁(yè),還剩9頁(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><b>  操作系統(tǒng)</b></p><p><b>  課程設(shè)計(jì)說(shuō)明書</b></p><p>  題 目: 生產(chǎn)者消費(fèi)者同步算法 </p><p>  院 系: 國(guó)際教育學(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進(jìn)程2</b></p><p><b>

3、  2.3線程2</b></p><p>  2.4同步和互斥的概念3</p><p><b>  三、 總體設(shè)計(jì)3</b></p><p>  四、 詳細(xì)編碼設(shè)計(jì)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消費(fèi)者類7</b></p><p>  五、運(yùn)行效果截圖:7</p><p><b>  六、總結(jié)8</b></p><p><b>

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

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

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

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

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

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

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

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

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

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

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

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

17、 PoolSize; //緩沖區(qū)大小</p><p>  public Pool pool; //管城對(duì)象</p><p>  public int buySpeed; //消費(fèi)間隔,控制消費(fèi)速度</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)消費(fèi)的產(chǎn)品數(shù)量</p><p>  public long cur

19、rentProductCount=0; //當(dāng)前的產(chǎn)品數(shù)量</p><p>  public boolean isStop=false; //強(qiáng)制線程退出的信號(hào)量</p><p>  這些屬性是在點(diǎn)擊界面的設(shè)置按鈕后把用戶輸入的參數(shù)進(jìn)行相應(yīng)的賦值。</p><p>  當(dāng)點(diǎn)擊開(kāi)始按鈕后執(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è)置倉(cāng)庫(kù)大小</p><p>  //開(kāi)啟消費(fèi)者線程和生產(chǎn)者線程</p><p>  //啟動(dòng)線程同時(shí)把ui界面對(duì)象傳遞到線程中,使線程獲得必要的設(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>  消費(fèi)者和生產(chǎn)者的同步和他們各自之間的互斥都是在管程里面實(shí)現(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;//用一個(gè)棧模擬一個(gè)緩沖區(qū)</p><p>  public int MAX_SIZE; //棧能到

25、達(dá)的最大值</p><p>  private UI ui; //接收轉(zhuǎn)遞進(jìn)來(lái)的ui對(duì)象,以實(shí)現(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實(shí)現(xiàn)了消費(fèi)者線程間的互斥保證同一時(shí)刻只能有一個(gè)線程調(diào)用該方法</p><p>  while(this.products.isEmpty()){<

27、/p><p>  //products是一個(gè)棧結(jié)構(gòu)通過(guò)判斷它的空實(shí)現(xiàn)消費(fèi)者線程和生產(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();//棧沒(méi)有空,取數(shù)據(jù)</p><p>  ui.addInfo("消費(fèi)者【"+Thread.currentThread().getId()+"】從倉(cāng)庫(kù)取出產(chǎn)品【"+product+</p>

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

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

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

32、個(gè)棧結(jié)構(gòu)通過(guò)判斷它的滿實(shí)現(xiàn)消費(fèi)者線程和生產(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);//棧沒(méi)有滿,繼續(xù)生產(chǎn)</p><p>  ui.addInfo("生產(chǎn)者【"+Thread.currentThread().getId()+"】將產(chǎn)品【"+product+<

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

35、roductCount=products.size();</p><p>  ui.refreshStatus();</p><p>  notifyAll();//生產(chǎn)完畢,通知消費(fèi)者消費(fèi)</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;//接收傳遞進(jìn)來(lái)的界面對(duì)象,以實(shí)現(xiàn)在線程中操作界面顯示信息</p><p><b>  }</b></p><p>  public void run() {</p><p>  while(!ui.isStop) {</p><p>  //如果信號(hào)量ui.isStop是false則一直消費(fèi)下去,否

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>  "---當(dāng)前時(shí)間戳:"+new Date().getTime());}}</p><p><b>  4.4消費(fèi)者類</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)用管程的消費(fèi)方法消費(fèi)產(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("消費(fèi)者"+Thread.currentThread().getId()+"停止購(gòu)物成功." +</p><p>  "---當(dāng)前時(shí)間戳:"+ne

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

溫馨提示

  • 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)論