生產(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頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、課程設(shè)計(jì) 報(bào)告課程名:操作系統(tǒng)專業(yè)學(xué)生姓名班級(jí)學(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ùn)練,通過課程設(shè)計(jì),更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,加深對(duì)操作系統(tǒng)基礎(chǔ)理論和重要算法的理解,加強(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)者和消費(fèi)者對(duì)有界緩

2、沖區(qū)進(jìn)行操作后,即時(shí)顯示有界緩沖區(qū)的全部?jī)?nèi)容,當(dāng)前指針位置和生產(chǎn)者/消費(fèi)者縣城的標(biāo)識(shí)符。(2)生產(chǎn)者和消費(fèi)者各有兩個(gè)以上。(3)多個(gè)生產(chǎn)者或多個(gè)消費(fèi)者之間須有共享對(duì)緩沖區(qū)進(jìn)行操作的函數(shù)代碼。2.2 設(shè)計(jì)原理多進(jìn)程是一種非常簡(jiǎ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)造之一。因此困難也在于此。因?yàn)樵谝粋€(gè)應(yīng)用程序中可以多次重復(fù)生產(chǎn)者-消費(fèi)者行為,其代碼也可以如此。設(shè)計(jì)中創(chuàng)建了 Consumer 類,該類通過在一些多進(jìn)程應(yīng)用程序中

3、促進(jìn)代碼重用以及簡(jiǎ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)處理類別的情況。這些情況通常圍繞一個(gè)作業(yè)“生產(chǎn)者”方和一個(gè)

4、作業(yè)“消費(fèi)者”方。當(dāng)然,關(guān)于作業(yè)并行執(zhí)行還有其它考慮事項(xiàng)。在大多數(shù)情況下,對(duì)于使用同一資源的作業(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)程通過將新對(duì)象添加到消費(fèi)者隊(duì)列來交付這個(gè)要處理的新對(duì)象。然后消費(fèi)者進(jìn)程從隊(duì)列取出每個(gè)對(duì)象,并依次處理。當(dāng)隊(duì)列為空時(shí),消費(fèi)者進(jìn)入休眠。當(dāng)新的對(duì)象添加到空隊(duì)列時(shí),消費(fèi)者會(huì)醒來并處理該對(duì)象。2.3 詳細(xì)設(shè)計(jì)及編碼(1)調(diào)試問題分析為解決生產(chǎn)者/消費(fèi)者問題,應(yīng)該設(shè)置兩個(gè)資源信號(hào)量,其中一個(gè)表示

5、空緩沖區(qū)的數(shù)目,用Full表示,其初始值為有界緩沖區(qū)的大小BUFFER_NUM;另一個(gè)表示緩沖區(qū)中產(chǎn)品的數(shù)目,用Empty表示,其初始值為0。另外,由于有界緩沖區(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ū)的長(zhǎng)度)。其次,它是確保產(chǎn)品的生產(chǎn)者和消費(fèi)者之間動(dòng)作同步的同步器。生產(chǎn)者要生產(chǎn)一個(gè)產(chǎn)品時(shí),首先對(duì)資源信號(hào)量Full和互斥信號(hào)量Mutex進(jìn)行P操作,申請(qǐng)資源。如果可以通過的話,就生產(chǎn)一個(gè)產(chǎn)品,并把產(chǎn)品送入緩沖區(qū)。然后對(duì)互斥信號(hào)量

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

7、待隊(duì)列線程自我阻塞添加到等待隊(duì)列未通過未通過通過通過喚醒對(duì)頭的消費(fèi)者線程喚醒對(duì)頭的消費(fèi)者線程生產(chǎn)者線程結(jié)束YYN未通過圖2-1生產(chǎn)者流程圖消費(fèi)者線程開始資源信號(hào)量P操作互斥信號(hào)量P操作從緩沖區(qū)取出一個(gè)產(chǎn)品消費(fèi)一個(gè)產(chǎn)品互斥信號(hào)量V操作資源信號(hào)量V操作等待隊(duì)列中有生產(chǎn)者線程等待隊(duì)列中有生產(chǎn)者線程線程自我阻塞添加到等待隊(duì)列線程自我阻塞添加到等待隊(duì)列未通過N通過通過喚醒對(duì)頭的生產(chǎn)者線程喚醒對(duì)頭的生產(chǎn)者線程消費(fèi)者線程結(jié)束YYN圖2-2消費(fèi)者流程圖(3)源程序#include <windows.h> #include <stdio.h> #include <stdlib.h&

8、gt; #include <time.h> 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 /

9、* 緩沖區(qū)個(gè)數(shù) */ char *thing8 = "豆?jié){", "油條", "燒餅", "牛奶", "包子", "燒賣", "煎蛋","雪碧" /生產(chǎn)和消費(fèi)的產(chǎn)品名稱 struct Buffer int productBUFFER_NUM; / 緩沖區(qū) int start,end; / 兩個(gè)指針相當(dāng)于教材中的 in out 指針 g_buf; Semaphore Empty,Full,Mutex; /分別相當(dāng)于Empty, Full,

10、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: 需要資源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)%B

11、UFFER_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); Sleep(rate*rand()%10+110); return 0; /* 生產(chǎn)者線程*/ DWORD WINAPI Producer(LPVOID para) int i = *(int *)par

12、a - 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)%BUFFER_NUM; printf("生產(chǎn)者%01d: 放到緩沖區(qū) buf%d=%sn",i,ptr,thingda

13、ta); 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 tid; int i=0; /初始化信號(hào)量 Mutex=CreateSemaphore(NULL,1,1

14、,"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=CONSUMER

15、_NUM+PRODUCER_NUM; /開啟消費(fèi)者線程 printf("先請(qǐng)消費(fèi)者上席!n"); for(i=0;i<CONSUMER_NUM; i+) hThreadi=CreateThread(NULL, 0, Consumer, &i,0,&tid); if(hThreadi)WaitForSingleObject(hThreadi,10); printf("生產(chǎn)者就位!n"); for(;i<totalThreads;i+) hThreadi=CreateThread(NULL,0,Producer,&i,0,

16、&tid); if(hThreadi)WaitForSingleObject(hThreadi,10); /生產(chǎn)者和消費(fèi)者的執(zhí)行 WaitForMultipleObjects(totalThreads,hThread,TRUE,INFINITE); return 0; 3 結(jié)果及分析4 設(shè)計(jì)小結(jié)本次課程設(shè)計(jì)通過模擬計(jì)算機(jī)操作系統(tǒng)中經(jīng)典的“生產(chǎn)者消費(fèi)者問題”,鞏固了我在操作系統(tǒng)原理課上所學(xué)的知識(shí),加深了對(duì)操作系統(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ā)控制全過程,尤其是對(duì)多進(jìn)程程序設(shè)計(jì)方法有了更深的理解,開

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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)論