生產(chǎn)者消費(fèi)者問題設(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
生產(chǎn)者消費(fèi)者問題設(shè)計(jì)與實(shí)現(xiàn)_第2頁(yè)
生產(chǎn)者消費(fèi)者問題設(shè)計(jì)與實(shí)現(xiàn)_第3頁(yè)
生產(chǎn)者消費(fèi)者問題設(shè)計(jì)與實(shí)現(xiàn)_第4頁(yè)
生產(chǎn)者消費(fèi)者問題設(shè)計(jì)與實(shí)現(xiàn)_第5頁(yè)
已閱讀5頁(yè),還剩15頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、 操作系統(tǒng) 課程設(shè)計(jì)任務(wù)書 學(xué) 院計(jì)算機(jī)與信息工程專 業(yè)計(jì)算機(jī)科學(xué)與技術(shù)課程名稱操作系統(tǒng)題 目生產(chǎn)者消費(fèi)者問題設(shè)計(jì)與實(shí)現(xiàn)完成期限自2015年6月23日至2015年6月29日共1周內(nèi)容及任務(wù)一、項(xiàng)目的目的1.理生產(chǎn)者消費(fèi)者問題基本概念和工作原理,以及實(shí)現(xiàn)技術(shù);2.理解并掌握生產(chǎn)者消費(fèi)者問題相關(guān)算法,以及它的實(shí)現(xiàn)方法;3.掌握在eclipse環(huán)境下,系統(tǒng)開發(fā)的基本步驟和方法;4.掌握在eclipse環(huán)境下,設(shè)計(jì)和開發(fā)一個(gè)簡(jiǎn)單的生產(chǎn)者消費(fèi)者問題系統(tǒng)來模擬操作系統(tǒng)中生產(chǎn)者消費(fèi)者問題。二、項(xiàng)目任務(wù)的主要內(nèi)容和要求1.精讀并理解和掌握生產(chǎn)者消費(fèi)者問題;2.編寫程序來模擬生產(chǎn)者消費(fèi)者問題的實(shí)現(xiàn);3.編寫應(yīng)用

2、程序測(cè)試生產(chǎn)者消費(fèi)者問題,并顯示結(jié)果。三、項(xiàng)目設(shè)計(jì)(研究)思路本課程設(shè)計(jì)的基本思路是,首先理解和掌握生產(chǎn)者消費(fèi)者問題的基本思想和原理,然后根據(jù)理解的基本思想和原理編程實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題,最后通過數(shù)據(jù)分析生產(chǎn)者消費(fèi)者問題。四、具體成果形式和要求 成果:生產(chǎn)者消費(fèi)者問題程序語(yǔ)言實(shí)現(xiàn);設(shè)計(jì)說明書。要求:編寫好的生產(chǎn)者消費(fèi)者問題程序能夠正確啟動(dòng)運(yùn)行;設(shè)計(jì)說明書規(guī)范、合理。進(jìn)度安排起止日期工作內(nèi)容2015.6.23至2015.6.24熟悉相關(guān)內(nèi)容2015.6.25至2015.6.26系統(tǒng)設(shè)計(jì)和實(shí)現(xiàn)2015.6.27至2015.6.29系統(tǒng)實(shí)現(xiàn)和撰寫相關(guān)文檔主要參考資料1.計(jì)算機(jī)操作系統(tǒng)湯子瀛哲鳳屏 湯

3、小丹主編 西安電子科技大學(xué)出版社.2.計(jì)算機(jī)操作系統(tǒng)概論陳宏 楊忠耀主編 重慶郵電大學(xué)出版社.3.計(jì)算機(jī)操作系統(tǒng)基本知識(shí)廖成 崔陽(yáng) 主編 電子工業(yè)出版社.4.操作系統(tǒng)實(shí)現(xiàn)與設(shè)計(jì)陸剛 望能主編 電子工業(yè)出版社.5.java程序語(yǔ)言設(shè)計(jì)丁振凡主編,薛清華副主編清華大學(xué)出版社.指導(dǎo)教師意見(簽字): 年 月 日系(教研室)主任意見(簽字): 年 月 日目錄1.選題背景12.設(shè)計(jì)思路13.過程討論14.結(jié)果分析115.結(jié)論12參考文獻(xiàn)13致謝13附錄14指導(dǎo)教師評(píng)語(yǔ)19成績(jī)?cè)u(píng)定191.選題背景生產(chǎn)者消費(fèi)者問題是研究多線程程序時(shí)繞不開的經(jīng)典問題之一,它描述是有一塊緩沖區(qū)作為倉(cāng)庫(kù),生產(chǎn)者可以將產(chǎn)品放入倉(cāng)庫(kù)

4、,消費(fèi)者則可以從倉(cāng)庫(kù)中取走產(chǎn)品。解決生產(chǎn)者/消費(fèi)者問題的方法可分為兩類:(1)采用某種機(jī)制保護(hù)生產(chǎn)者和消費(fèi)者之間的同步;(2)在生產(chǎn)者和消費(fèi)者之間建立一個(gè)管道。第一種方式有較高的效率,并且易于實(shí)現(xiàn),代碼的可控制性較好,屬于常用的模式。第二種管道緩沖區(qū)不易控制,被傳輸數(shù)據(jù)對(duì)象不易于封裝等,實(shí)用性不強(qiáng)。因此本文只介紹同步機(jī)制實(shí)現(xiàn)的生產(chǎn)者/消費(fèi)者問題。同步問題核心在于:如何保證同一資源被多個(gè)線程并發(fā)訪問時(shí)的完整性。常用的同步方法是采用信號(hào)或加鎖機(jī)制,保證資源在任意時(shí)刻至多被一個(gè)線程訪問。Java語(yǔ)言在多線程編程上實(shí)現(xiàn)了完全對(duì)象化,提供了對(duì)同步機(jī)制的良好支持。在Java中一共有四種方法支持同步,其中前

5、三個(gè)是同步方法,一個(gè)是管道方法。2設(shè)計(jì)思路 2.1.生產(chǎn)者消費(fèi)者問題是一種同步問題的抽象描述。 2.2計(jì)算機(jī)系統(tǒng)中的每個(gè)進(jìn)程都可以消費(fèi)或生產(chǎn)某類資源。當(dāng)系統(tǒng)中某一進(jìn)程使用某一資源時(shí),可以看作是消耗,且該進(jìn)程稱為消費(fèi)者。2.3而當(dāng)某個(gè)進(jìn)程釋放資源時(shí),則它就相當(dāng)一個(gè)生產(chǎn)者3.過程論述首先,生產(chǎn)者和消費(fèi)者可能同時(shí)進(jìn)入緩沖區(qū),甚至可能同時(shí)讀/寫一個(gè)存儲(chǔ)單元,將導(dǎo)致執(zhí)行結(jié)果不確定。這顯然是不允許的。所以,必須使生產(chǎn)者和消費(fèi)者互斥進(jìn)入緩沖區(qū)。即某時(shí)刻只允許一個(gè)實(shí)體(生產(chǎn)者或消費(fèi)者)訪問緩沖區(qū),生產(chǎn)者互斥消費(fèi)者和其他任何生產(chǎn)者。 其次,生產(chǎn)者不能向滿的緩沖區(qū)寫數(shù)據(jù),消費(fèi)者也不能在空緩沖區(qū)中取數(shù)據(jù),即生產(chǎn)者與

6、消費(fèi)者必須同步。當(dāng)生產(chǎn)者產(chǎn)生出數(shù)據(jù),需要將其存入緩沖區(qū)之前,首先檢查緩沖區(qū)中是否有“空”存儲(chǔ)單元,若緩沖區(qū)存儲(chǔ)單元全部用完,則生產(chǎn)者必須阻塞等待,直到消費(fèi)者取走一個(gè)存儲(chǔ)單元的數(shù)據(jù),喚醒它。若緩沖區(qū)內(nèi)有“空”存儲(chǔ)單元,生產(chǎn)者需要判斷此時(shí)是否有別的生產(chǎn)者或消費(fèi)者正在使用緩沖區(qū),若是有,則阻塞等待,否則,獲得緩沖區(qū)的使用權(quán),將數(shù)據(jù)存入緩沖區(qū),釋放緩沖區(qū)的使用權(quán)。消費(fèi)者取數(shù)據(jù)之前,首先檢查緩沖區(qū)中是否存在裝有數(shù)據(jù)的存儲(chǔ)單元,若緩沖區(qū)為“空”,則阻塞等待,否則,判斷緩沖區(qū)是否正在被使用,若正被使用,若正被使用,則阻塞等待,否則,獲得緩沖區(qū)的使用權(quán),進(jìn)入緩沖區(qū)取數(shù)據(jù),釋放緩沖區(qū)的使用權(quán)。3.1系統(tǒng)流程圖3

7、.1.1生產(chǎn)者流程圖:3.1.2消費(fèi)者流程圖:3.1.3主程序流程圖:3.1.4生產(chǎn)者:ProducerThread /定義生產(chǎn)者線程class ProducerThread implements Runnable int productNo = 0; /產(chǎn)品編號(hào)int id; /生產(chǎn)者IDpublic ProducerThread(int id)this.id = id;public void run()while(isRun)productNo+; /生產(chǎn)產(chǎn)品buffers.put(productNo, id); /將產(chǎn)品放入緩沖隊(duì)列tryThread.sleep(1000);catch(

8、Exception e)e.printStackTrace();3.1.5消費(fèi)者 ConsumerThread /定義消費(fèi)者線程class ConsumerThread implements Runnable int id; /消費(fèi)者IDpublic ConsumerThread(int id)this.id = id;public void run()while(isRun)buffers.get(id); /從緩沖隊(duì)列中取出產(chǎn)品tryThread.sleep(1000);catch(Exception e)e.printStackTrace();3.1.6緩沖區(qū)Buffer class B

9、uffer JTextArea ta;static final int productBufferNum = 10; /緩沖單元數(shù)ProductBuffer pBuffer = new ProductBufferproductBufferNum; /緩沖隊(duì)列int in = 0; /緩沖單元指針,用于放產(chǎn)品get()int out = 0; /緩沖單元指針,用于取產(chǎn)品put()int consumeProductNo; /記錄消費(fèi)產(chǎn)品的編號(hào)int usedBufferNum = 0; /記錄緩沖隊(duì)列已使用的緩沖單元個(gè)數(shù)public Buffer (JTextArea ta)this.ta =

10、ta;/初始化for(int j=0; j<productBufferNum; j+)pBufferj = new ProductBuffer();for(int i=0; i<productBufferNum; i+)pBduct = -1;pBufferi.hasProduct = false;/取產(chǎn)品public synchronized void get(int id)/緩沖隊(duì)列空則等待if(usedBufferNum <= 0)trysuper.wait();catch(Exception e)e.printStackTrace();consum

11、eProductNo = pBduct; /取出產(chǎn)品pBduct = 0; /清空緩沖單元pBufferout.hasProduct = false; /置"無產(chǎn)品"標(biāo)識(shí)usedBufferNum-;/輸出本次取產(chǎn)品后緩沖隊(duì)列的情況ta.append("消費(fèi)者"+id+"將產(chǎn)品"+consumeProductNo+"從緩沖單元"+out+"取出,緩沖隊(duì)列狀態(tài)如下:n");printBuffer();out=(out+1)%productBuffer

12、Num; /更新指針/喚醒等待線程super.notify();/放產(chǎn)品public synchronized void put(int productNo, int id)/緩沖隊(duì)列滿則等待if(usedBufferNum = productBufferNum)trysuper.wait();catch(Exception e)e.printStackTrace();pBduct = productNo; /放產(chǎn)品pBufferin.hasProduct = true; /置“有產(chǎn)品”標(biāo)識(shí)usedBufferNum+;/輸出本次放入產(chǎn)品后,緩沖隊(duì)列的情況ta.appen

13、d("生產(chǎn)者"+id+"將產(chǎn)品"+productNo+"放入緩沖單元"+in+",緩沖隊(duì)列狀態(tài)如下:n");printBuffer();in=(in+1)%productBufferNum; /更新指針/喚醒等待線程super.notify();/打印緩沖隊(duì)列當(dāng)前情況private void printBuffer()ta.append(" 緩沖單元編號(hào) 產(chǎn)品編號(hào) 緩沖單元狀態(tài)n");for(int i=0; i<productBufferNum; i+)ta.append("t

14、"+i+"t"+pBduct+"t"+pBufferi.hasProduct+"n");/*一個(gè)緩沖單元*/class ProductBuffer int product; /存放產(chǎn)品編號(hào)boolean hasProduct; /標(biāo)識(shí)該緩沖區(qū)是否有產(chǎn)品,true有產(chǎn)品,false無產(chǎn)品3.1.7圖形界面createUIpublic void createUI()JFrame frame = new JFrame("生產(chǎn)者消費(fèi)者");JPanel panel = new JPanel(n

15、ew BorderLayout();/ta.setBackground(Color.blue);JScrollPane scrPane = new JScrollPane(ta);panel.add(scrPane, BorderLayout.CENTER);JButton button = new JButton("停止");button.addActionListener(this);panel.add(button, BorderLayout.SOUTH);panel.setBackground(Color.BLUE);frame.add(panel);frame.s

16、etVisible(true);frame.setSize(1000,500);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);3.1.8事件驅(qū)動(dòng)actionPerformed/按鈕響應(yīng)事件public void actionPerformed(ActionEvent e)isRun = false; /控制線程結(jié)束System.out.println("停止");4.結(jié)果分析運(yùn)行主程序得到一個(gè)GUI窗口,在文本域中輸出結(jié)果,一共10個(gè)緩沖單元,三個(gè)生產(chǎn)者隨機(jī)生產(chǎn)產(chǎn)品依次從0編號(hào)的緩沖區(qū)放入產(chǎn)品,消費(fèi)者按照生產(chǎn)的先后

17、順序消費(fèi)產(chǎn)品。當(dāng)緩沖單元有產(chǎn)品時(shí),狀態(tài)欄顯示true,否則顯示false。并且當(dāng)消費(fèi)者取走產(chǎn)品后,產(chǎn)品編號(hào)會(huì)變成0.5.結(jié)論這次生產(chǎn)者與消費(fèi)者之間的關(guān)系的實(shí)驗(yàn)我用Java語(yǔ)言編寫的,用關(guān)鍵字synchronized來實(shí)現(xiàn)多個(gè)線程同步,用繼承Thread來將生產(chǎn)者線程與消費(fèi)者線程實(shí)例化。其實(shí),在做這個(gè)實(shí)驗(yàn)之前我的Java語(yǔ)言編程老師講過這些知識(shí),正好可以鞏固Java的一些知識(shí)。我還學(xué)過C+語(yǔ)言,這是大一下學(xué)期學(xué)的事了,我想要實(shí)現(xiàn)書上的P、V操作可以用C+語(yǔ)言來編寫。  總之,通過該實(shí)驗(yàn)我更加清楚的認(rèn)識(shí)到生產(chǎn)者與消費(fèi)者這個(gè)經(jīng)典問題實(shí)際上是線程同步問題的抽象描述,即計(jì)算機(jī)系統(tǒng)中的每個(gè)進(jìn)程都

18、可以消費(fèi)(使用)或生產(chǎn)(釋放)數(shù)據(jù),進(jìn)程釋放數(shù)據(jù)相當(dāng)于生產(chǎn)者,使用數(shù)據(jù)相當(dāng)于消費(fèi)者。 從Java 的多線程機(jī)制出發(fā), 研究了操作系統(tǒng)中經(jīng)典的同步問題生產(chǎn)者消費(fèi)者問題, 提出了兩種解決此問題的模型, 及其Java 解決方案。提出的兩個(gè)模型充分利用了Java 中面向?qū)ο蠛凸艹虣C(jī)制, 模擬了操作系統(tǒng)中進(jìn)程同步的經(jīng)典問題生產(chǎn)者消費(fèi)者問題。在第一個(gè)模型中, 我們按照生產(chǎn)者消費(fèi)者問題典型的解決方案給出了Java 解決模型; 在第二個(gè)模型中, 我們分析了信號(hào)量mutex 在問題中所起的作用, 并為了提高緩沖區(qū)讀寫的效率, 提出了將信號(hào)量mutex 分為兩個(gè)分別控制生產(chǎn)者和消費(fèi)者的信號(hào)量,并討論了此方案的可行

19、性。參考文獻(xiàn)1 計(jì)算機(jī)操作系統(tǒng)湯子瀛哲鳳屏 湯小丹主編 西安電子科技大學(xué)出版社2 計(jì)算機(jī)操作系統(tǒng)概論陳宏 楊忠耀主編 重慶郵電大學(xué)出版社3 計(jì)算機(jī)操作系統(tǒng)基本知識(shí)廖成 崔陽(yáng) 主編 電子工業(yè)出版社4 操作系統(tǒng)實(shí)現(xiàn)與設(shè)計(jì)陸剛 望能主編 電子工業(yè)出版社5 java程序語(yǔ)言設(shè)計(jì)丁振凡主編,薛清華副主編清華大學(xué)出版社致謝本組全體成員在此向所有關(guān)心我們的及幫助我們的老師和同學(xué)們致以最真誠(chéng)的感謝。在本次畢業(yè)設(shè)計(jì)中,尤其要感謝楊傳健老師,對(duì)我們的課程設(shè)計(jì)時(shí)刻的關(guān)注,當(dāng)我們遇到困難時(shí)給了我們很大的幫助,交給了我們團(tuán)隊(duì)的合作理念,使得我們能夠按時(shí)完成這次的課程設(shè)計(jì)。學(xué)生簽名: 填表日期: 年 月 日附錄impor

20、t java.awt.BorderLayout;import java.awt.Color;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;/import Producer_and_Customer.ConsumerThread

21、;/import Producer_and_Customer.ProducerThread;/* * 定義臨界資源:緩沖隊(duì)列 * */class Buffer JTextArea ta;static final int productBufferNum = 10; /緩沖單元數(shù)ProductBuffer pBuffer = new ProductBufferproductBufferNum; /緩沖隊(duì)列int in = 0; /緩沖單元指針,用于放產(chǎn)品get()int out = 0; /緩沖單元指針,用于取產(chǎn)品put()int consumeProductNo; /記錄消費(fèi)產(chǎn)品的編號(hào)int

22、usedBufferNum = 0; /記錄緩沖隊(duì)列已使用的緩沖單元個(gè)數(shù)public Buffer (JTextArea ta)this.ta = ta;/初始化for(int j=0; j<productBufferNum; j+)pBufferj = new ProductBuffer();for(int i=0; i<productBufferNum; i+)pBduct = -1;pBufferi.hasProduct = false;/取產(chǎn)品public synchronized void get(int id)/緩沖隊(duì)列空則等待if(usedBuff

23、erNum <= 0)trysuper.wait();catch(Exception e)e.printStackTrace();consumeProductNo = pBduct; /取出產(chǎn)品pBduct = 0; /清空緩沖單元pBufferout.hasProduct = false; /置"無產(chǎn)品"標(biāo)識(shí)usedBufferNum-;/輸出本次取產(chǎn)品后緩沖隊(duì)列的情況ta.append("消費(fèi)者"+id+"將產(chǎn)品"+consumeProductNo+"從緩沖單元&qu

24、ot;+out+"取出,緩沖隊(duì)列狀態(tài)如下:n");printBuffer();out=(out+1)%productBufferNum; /更新指針/喚醒等待線程super.notify();/放產(chǎn)品public synchronized void put(int productNo, int id)/緩沖隊(duì)列滿則等待if(usedBufferNum = productBufferNum)trysuper.wait();catch(Exception e)e.printStackTrace();pBduct = productNo; /放產(chǎn)品pBuff

25、erin.hasProduct = true; /置“有產(chǎn)品”標(biāo)識(shí)usedBufferNum+;/輸出本次放入產(chǎn)品后,緩沖隊(duì)列的情況ta.append("生產(chǎn)者"+id+"將產(chǎn)品"+productNo+"放入緩沖單元"+in+",緩沖隊(duì)列狀態(tài)如下:n");printBuffer();in=(in+1)%productBufferNum; /更新指針/喚醒等待線程super.notify();/打印緩沖隊(duì)列當(dāng)前情況private void printBuffer()ta.append(" 緩沖單元編號(hào) 產(chǎn)品

26、編號(hào) 緩沖單元狀態(tài)n");for(int i=0; i<productBufferNum; i+)ta.append("t"+i+"t"+pBduct+"t"+pBufferi.hasProduct+"n");/*一個(gè)緩沖單元*/class ProductBuffer int product; /存放產(chǎn)品編號(hào)boolean hasProduct; /標(biāo)識(shí)該緩沖區(qū)是否有產(chǎn)品,true有產(chǎn)品,false無產(chǎn)品/* * 生產(chǎn)者消費(fèi)者問題實(shí)現(xiàn)(可以有多個(gè)生產(chǎn)者消費(fèi)者) * */publi

27、c class Producer_and_Customer implements ActionListenerprivate JPanel jp=new JPanel10;boolean isRun = true;/用于控制線程結(jié)束JTextArea ta = new JTextArea();Buffer buffers = new Buffer(ta); /緩沖隊(duì)列static final int producerNum = 3; /生產(chǎn)者個(gè)數(shù)static final int consumerNum = 3; /消費(fèi)者個(gè)數(shù)ProducerThread proThread = new Prod

28、ucerThreadproducerNum;ConsumerThread conThread = new ConsumerThreadconsumerNum;Thread producer = new ThreadproducerNum;Thread consumer = new ThreadconsumerNum;public Producer_and_Customer()createUI();/createNewUI();/創(chuàng)建多個(gè)生產(chǎn)者和消費(fèi)者線程并開始執(zhí)行for(int i=0; i<producerNum; i+)proThreadi = new ProducerThread(

29、i+1);produceri = new Thread(proThreadi);produceri.start();for(int j=0; j<consumerNum; j+)conThreadj = new ConsumerThread(j+1);consumerj = new Thread(conThreadj);consumerj.start();private void createNewUI() JFrame frame=new JFrame("Leo");/創(chuàng)建界面public void createUI()JFrame frame = new JFrame("生產(chǎn)者消費(fèi)者");JPanel panel = new JPanel(new BorderLayout();/ta.setBackground(Color.blue);JScrollPane scrPane = new JScrollPane(ta);panel.add(scrPane, BorderLayout.CENTER);JButton butto

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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)論