版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)生產(chǎn)者消費(fèi)者
- 操作系統(tǒng)生產(chǎn)者與消費(fèi)者課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)——生產(chǎn)者消費(fèi)者問(wèn)題
- 操作系統(tǒng)課程設(shè)計(jì)——生產(chǎn)者消費(fèi)者問(wèn)題
- 生產(chǎn)者消費(fèi)者問(wèn)題操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告-生產(chǎn)者與消費(fèi)者算法的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題
- 生產(chǎn)者與消費(fèi)者報(bào)告
- 利用信號(hào)量,pv,管程等解決生產(chǎn)者消費(fèi)者問(wèn)題——操作系統(tǒng)原理課程設(shè)計(jì)提優(yōu)論文
- 實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題和實(shí)現(xiàn)銀行家算法的課程設(shè)計(jì)
- 6:生產(chǎn)者消費(fèi)者問(wèn)題
- 6:生產(chǎn)者消費(fèi)者問(wèn)題
- 生產(chǎn)者和消費(fèi)者問(wèn)題實(shí)驗(yàn)報(bào)告
- 多進(jìn)程同步方法演示“生產(chǎn)者-消費(fèi)者”問(wèn)題
- 大連理工大學(xué)軟件學(xué)院操作系統(tǒng)上機(jī)實(shí)驗(yàn)之生產(chǎn)者與消費(fèi)者問(wèn)題
- 操作系統(tǒng)課程設(shè)計(jì)--讀者寫者問(wèn)題
- 操作系統(tǒng)課程設(shè)計(jì)-讀者寫者問(wèn)題
- 操作系統(tǒng)課程設(shè)計(jì)——讀者寫者問(wèn)題
- 讀者與寫者-操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 實(shí)驗(yàn)二 進(jìn)程的互斥與同步(生產(chǎn)者與消費(fèi)者問(wèn)題)實(shí)驗(yàn)報(bào)告 實(shí)驗(yàn)?zāi)康?bb
評(píng)論
0/150
提交評(píng)論