完整版生產(chǎn)者-消費(fèi)者問題_第1頁
完整版生產(chǎn)者-消費(fèi)者問題_第2頁
完整版生產(chǎn)者-消費(fèi)者問題_第3頁
完整版生產(chǎn)者-消費(fèi)者問題_第4頁
完整版生產(chǎn)者-消費(fèi)者問題_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、置嫉工建院課程設(shè)計(jì)報(bào)告課程名:操作系統(tǒng)專 業(yè)學(xué)生姓名班 級學(xué) 號(hào)指導(dǎo)教師完成日期博雅學(xué)院“操作系統(tǒng)課程設(shè)計(jì)報(bào)告生產(chǎn)者-消費(fèi)者問題的模擬實(shí)現(xiàn)1 .課程設(shè)計(jì)的目的本課程設(shè)計(jì)是學(xué)習(xí)完“操作系統(tǒng)原理課程后進(jìn)行的一次全面的綜合練習(xí),通 過課程設(shè)計(jì),更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,加深對操作系統(tǒng)根底理論和 重要算法的理解,增強(qiáng)學(xué)生的動(dòng)手水平.2 .設(shè)計(jì)內(nèi)容2.1 概述用多進(jìn)程同步方法解決生產(chǎn)者-消費(fèi)者問題,C或C+語言實(shí)現(xiàn).通過研究Linux的進(jìn)程機(jī)制和信號(hào)量實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題的并發(fā)限制.說明:有界緩沖區(qū)內(nèi)設(shè)有20個(gè)存儲(chǔ)單元,放入/取出的數(shù)據(jù)項(xiàng)設(shè)定為1-20這20個(gè) 整型數(shù).設(shè)計(jì)要求:1每個(gè)生產(chǎn)者和

2、消費(fèi)者對有界緩沖區(qū)進(jìn)行操作后,即時(shí)顯示有界緩沖區(qū)的全部內(nèi)容,當(dāng)前指針位置和生產(chǎn)者/消費(fèi)者縣城的標(biāo)識(shí)符.2生產(chǎn)者和消費(fèi)者各 有兩個(gè)以上.3多個(gè)生產(chǎn)者或多個(gè)消費(fèi)者之間須有共享對緩沖區(qū)進(jìn)行操作的函數(shù)代 碼.2.2 設(shè)計(jì)原理多進(jìn)程是一種非常簡潔的多任務(wù)操作方式.在Linux系統(tǒng)下,啟動(dòng)一個(gè)新的進(jìn)程必須分配給它獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來維護(hù)它的代碼段、堆棧段和 數(shù)據(jù)段,這是一種煩瑣的多任務(wù)工作方式.生產(chǎn)者-消費(fèi)者方案是多進(jìn)程應(yīng)用程序開發(fā)中最常用的構(gòu)造之一.因此困難也在 于此.由于在一個(gè)應(yīng)用程序中可以屢次重復(fù)生產(chǎn)者-消費(fèi)者行為,其代碼也可以如此. 設(shè)計(jì)中創(chuàng)立了 Consumer類,該類通過在一些多

3、進(jìn)程應(yīng)用程序中促進(jìn)代碼重用以及 簡化代碼調(diào)試和維護(hù)來解決這個(gè)問題.多進(jìn)程應(yīng)用程序通常利用生產(chǎn)者-消費(fèi)者編程方案,其中由生產(chǎn)者進(jìn)程創(chuàng)立重復(fù)性作業(yè),將其傳遞給作業(yè)隊(duì)列,然后由消費(fèi)者進(jìn) 程處理作業(yè).多進(jìn)程是一種使應(yīng)用程序能同時(shí)處理多個(gè)操作的編程技術(shù).通常有兩種不同類型的多進(jìn)程操作使用多個(gè)進(jìn)程:適時(shí)事件,當(dāng)作業(yè)必須在特定的時(shí)間或在特定的問 隔內(nèi)調(diào)度執(zhí)行時(shí);后臺(tái)處理,當(dāng)后臺(tái)事件必須與當(dāng)前執(zhí)行流并行處理或執(zhí)行時(shí);適 時(shí)事件的例如包括程序提醒、超時(shí)事件以及諸如輪詢和刷新之類的重復(fù)性操作.后 臺(tái)處理的例如包括等待發(fā)送的包或等待處理的已接收的消息.生產(chǎn)者-消費(fèi)者方案很適合于后臺(tái)處理類別的情況.這些情況通常圍繞一

4、個(gè)作業(yè) “生產(chǎn)者方和一個(gè)作業(yè)“消費(fèi)者方.當(dāng)然,關(guān)于作業(yè)并行執(zhí)行還有其它考慮事 項(xiàng).在大多數(shù)情況下,對于使用同一資源的作業(yè),應(yīng)以FCFS的方式按順序處理,這 可以通過使用單進(jìn)程的消費(fèi)者輕松實(shí)現(xiàn).通過使用這種方法,使用單個(gè)進(jìn)程來訪問 單個(gè)資源,而不是用多個(gè)進(jìn)程來訪問單個(gè)資源.要啟用標(biāo)準(zhǔn)消費(fèi)者,當(dāng)作業(yè)到來時(shí) 創(chuàng)立一個(gè)作業(yè)隊(duì)列來存儲(chǔ)所有作業(yè).生產(chǎn)者進(jìn)程通過將新對象添加到消費(fèi)者隊(duì)列來 交付這個(gè)要處理的新對象.然后消費(fèi)者進(jìn)程從隊(duì)列取出每個(gè)對象,并依次處理.當(dāng) 隊(duì)列為空時(shí),消費(fèi)者進(jìn)入休眠.當(dāng)新的對象添加到空隊(duì)列時(shí),消費(fèi)者會(huì)醒來并處理 該對象.2.3 詳細(xì)設(shè)計(jì)及編碼(1)調(diào)試問題分析為解決生產(chǎn)者/消費(fèi)者問題,

5、應(yīng)該設(shè)置兩個(gè)資源信號(hào)量,其中一個(gè)表示空緩沖區(qū) 的數(shù)目,用Full表示,其初始值為有界緩沖區(qū)的大小 BUFFER_NUM ;另一個(gè)表示 緩沖區(qū)中產(chǎn)品的數(shù)目,用 Empty表示,其初始值為00另外,由于有界緩沖區(qū)是一 個(gè)臨界資源,必須互斥使用,所以還需要再設(shè)置一個(gè)互斥信號(hào)量 Mutex,起初值為1.在生產(chǎn)者/消費(fèi)者問題中,信號(hào)量實(shí)現(xiàn)兩種功能.首先,它是生產(chǎn)產(chǎn)品和消費(fèi)產(chǎn) 品的計(jì)數(shù)器,計(jì)數(shù)器的初始值是可利用的資源數(shù)目(有界緩沖區(qū)的長度).其次,它是 保證產(chǎn)品的生產(chǎn)者和消費(fèi)者之間動(dòng)作同步的同步器.生產(chǎn)者要生產(chǎn)一個(gè)產(chǎn)品時(shí),首先對資源信號(hào)量Full和互斥信號(hào)量Mutex進(jìn)行P操作,申請資源.如果可以通過的話

6、,就生產(chǎn)一個(gè)產(chǎn)品,并把產(chǎn)品送入緩沖區(qū).然 后對互斥信號(hào)量Mutex和資源信號(hào)量Empty進(jìn)行V操作,釋放資源.消費(fèi)者要消費(fèi)一個(gè)產(chǎn)品時(shí),首先對資源信號(hào)量Empty和互斥信號(hào)量Mutex進(jìn)行P操作,申請資源.如果可以通過的話,就從緩沖區(qū)取出一個(gè)產(chǎn)品并消費(fèi)掉.然后 對互斥信號(hào)量Mutex和資源信號(hào)量Full進(jìn)行V操作,釋放資源.如果緩沖區(qū)中已經(jīng)沒有可用資源,就把申請資源的進(jìn)程添加到等待隊(duì)列的隊(duì)尾. 如果有一個(gè)資源被釋放,在等待隊(duì)列中的第一個(gè)進(jìn)程被喚醒并取得這個(gè)資源的使用 權(quán).(2)流程圖圖2-1生產(chǎn)者流程圖圖2-2消費(fèi)者流程圖(3)源程序#include #include #include #inc

7、lude typedef HANDLE Semaphore; / 信號(hào)量的 Windows 原型#define P(S) WaitForSingleObject(S,INFINITE) / 定義 Windows下的 P操作#define V(S) ReleaseSemaphore(S,1,NULL) / 定義 Windows下的 V作#define rate 1000# define CONSUMER_NUM 2 /*消費(fèi)者個(gè)數(shù)*/# define PRODUCER_NUM 3/*生產(chǎn)者個(gè)數(shù) */# define BUFFER_NUM 20/*緩沖區(qū)個(gè)數(shù)*/雪碧char *thing8 = 豆

8、漿,油條,燒餅,牛奶,包子,燒賣,煎蛋,; /生產(chǎn)和消費(fèi)的產(chǎn)品名稱struct Bufferint productBUFFER_NUM; / 緩沖區(qū)int start,end; /兩個(gè)指針相當(dāng)于教材中的in out指針g_buf;Semaphore Empty,Full,Mutex;/分別相當(dāng)于Empty, Full, Mutex三個(gè)信號(hào)量/*消費(fèi)者線程 */DWORD WINAPI Consumer(LPVOID para)/ i表示第i個(gè)消費(fèi)者int i = *(int *)para; / 利用para傳入當(dāng)前消費(fèi)者的編號(hào)int ptr; / 待消費(fèi)的內(nèi)容的指針printf(消費(fèi)者1d:需

9、要資源n, i);int j=0;while (j+4) /等待產(chǎn)品P(Full);/有產(chǎn)品,先鎖住緩沖區(qū)P(Mutex);/記錄消費(fèi)的物品ptr=g_buf.start;/再移動(dòng)緩沖區(qū)指針g_buf.start= (g_buf.start+1)%BUFFER_NUM ;/讓其他消費(fèi)者或生產(chǎn)者使用printf ( 消費(fèi)者 %01d: 我需要 buf%d=%sn , i, ptr, thingg_ductptr);/ 消費(fèi)完畢,并釋放一個(gè)緩沖printf ( 消費(fèi)者 %01d:我消費(fèi)完畢 %sn, i,thingg_ductptr);V(Mutex);V(Empty)

10、;Sleep(rate*rand()%10+110);return 0;*生產(chǎn)者線程 */DWORD WINAPI Producer(LPVOID para) int i = *(int *)para - CONSUMER_NUM;int ptr;int data; 產(chǎn)品int j=0;while(j+4)data=rand()%8;printf (生產(chǎn)者 %01d: 生產(chǎn)出:%s!n, i,thingdata);/等待存放空間P(Empty);/有地方,先鎖住緩沖區(qū)P(Mutex);/記錄消費(fèi)的物品ptr=g_buf.end;/再移動(dòng)緩沖區(qū)指針g_buf.end =(g_buf.end+1)

11、%BUFFER_NUM;printf (生產(chǎn)者 %01d: 放到緩沖區(qū) buf%d=%sn, i,ptr,thingdata); g_ductptr=data ;/放好了完畢,釋放一個(gè)產(chǎn)品/讓其他消費(fèi)者或生產(chǎn)者使用V(Mutex);V(Full);Sleep(rate/2*rand()%10+110);return 0; int main(int argc,char *argv口)/線程技術(shù),前面為消費(fèi)者線程,后面為生產(chǎn)者線程HANDLE hThreadCONSUMER_NUM+PRODUCER_NUM; / 線程計(jì)數(shù)srand(time(NULL); rand();DWORD

12、tid; int i=0; / 初始化信號(hào)量Mutex=CreateSemaphore(NULL,1,1,MutexOfConsumerAndProducer); Empty=CreateSemaphore(NULL, BUFFER_NUM, BUFFER_NUM, BufferSemaphone);Full=CreateSemaphore(NULL,0,BUFFER_NUM,ProductSemaphone); if(!Empty|!Full|!Mutex) ( printf(Create Semaphone Error!n); return -1;int totalThreads=CONS

13、UMER_NUM+PRODUCER_NUM;/開啟消費(fèi)者線程printf(先請消費(fèi)者上席!n);for(i=0;iCONSUMER_NUM; i+) (hThreadi=CreateThread(NULL, 0, Consumer, &i,0,&tid); if(hThreadi)WaitForSingleObject(hThreadi,10); printf(生產(chǎn)者就位!n);for(;ibi*4=雪碧 燒餅,.W hifLBK燒燃 要mF4=雪碧一 IB三1 12 2 13 P 者醛者者者者 產(chǎn),產(chǎn)產(chǎn)產(chǎn)產(chǎn)產(chǎn)sirhuELitn=牛奶:我需要力=油條buS= 弋需切咱15】J 藕生燒餅早產(chǎn)田

14、.浦莖.放到緩沖株條山1111=油條key to continue沖區(qū)hnfL7卜油條:燒賣,放到緩沖區(qū)皿打=燒賣生產(chǎn)出:豆?jié){,我需要bu6=施餅我嫌完畢燒神_后放到制能 buf【9h豆?jié){ 生產(chǎn)缶牛沏, 生產(chǎn)出二牛奶,4設(shè)計(jì)小結(jié)本次課程設(shè)計(jì)通過模擬計(jì)算機(jī)操作系統(tǒng)中經(jīng)典的“生產(chǎn)者一消費(fèi)者問題,穩(wěn)固了我在操作系統(tǒng)原理課上所學(xué)的知識(shí),加深了對操作系統(tǒng)中進(jìn)程同步和互斥等問題,完成了多進(jìn)程同步方法解決生產(chǎn)者-消費(fèi)者問題全部過程,結(jié)果滿足設(shè)計(jì)要求.設(shè)計(jì)過程中遇到不少困難,在反復(fù)研究老師的PPT及課本的原理后才逐漸明晰怎樣將代碼實(shí)現(xiàn),雖然這學(xué)期學(xué)過 Java, ! java不是很熟悉,因此還是選擇 C+語 言.以前學(xué)習(xí)C+沒有深入了解到線程這個(gè)概念,在學(xué)習(xí)Java的時(shí)候才知道有專門的線程類.所以我在網(wǎng)上也參考了其他人用C+編寫尤其是關(guān)于多進(jìn)程程序的設(shè)計(jì)實(shí)現(xiàn).在代碼的實(shí)現(xiàn)過程中,我是主要定義了兩個(gè)函數(shù) DWORD WINAPI Consumer(LPVOID para)和 DWORD WINAPI Producer(LPVOID para),在這兩 個(gè)函數(shù)中實(shí)現(xiàn)PV操作.通過本次設(shè)計(jì),我較好地掌握了通過研究Linux的進(jìn)程機(jī)制和信號(hào)量實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題的并發(fā)限制全過程,尤其是對多進(jìn)程程序設(shè)計(jì)方法有了更深的理解, 開拓了思路,鍛煉了實(shí)踐動(dòng)手能手.但是我覺

溫馨提示

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

評論

0/150

提交評論