![(完整word版)生產(chǎn)者-消費(fèi)者問(wèn)題.doc_第1頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-8/3/705c3bfa-916a-4ce7-bdb6-757c526be322/705c3bfa-916a-4ce7-bdb6-757c526be3221.gif)
![(完整word版)生產(chǎn)者-消費(fèi)者問(wèn)題.doc_第2頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-8/3/705c3bfa-916a-4ce7-bdb6-757c526be322/705c3bfa-916a-4ce7-bdb6-757c526be3222.gif)
![(完整word版)生產(chǎn)者-消費(fèi)者問(wèn)題.doc_第3頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-8/3/705c3bfa-916a-4ce7-bdb6-757c526be322/705c3bfa-916a-4ce7-bdb6-757c526be3223.gif)
![(完整word版)生產(chǎn)者-消費(fèi)者問(wèn)題.doc_第4頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-8/3/705c3bfa-916a-4ce7-bdb6-757c526be322/705c3bfa-916a-4ce7-bdb6-757c526be3224.gif)
![(完整word版)生產(chǎn)者-消費(fèi)者問(wèn)題.doc_第5頁(yè)](http://file2.renrendoc.com/fileroot_temp3/2021-8/3/705c3bfa-916a-4ce7-bdb6-757c526be322/705c3bfa-916a-4ce7-bdb6-757c526be3225.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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)者問(wèn)題的模擬實(shí)現(xiàn)1. 課程設(shè)計(jì)的目的本課程設(shè)計(jì)是學(xué)習(xí)完“操作系統(tǒng)原理”課程后進(jìn)行的一次全面的綜合訓(xùn)練,通過(guò)課程設(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)者問(wèn)題, C 或 C+語(yǔ)言實(shí)現(xiàn)。通過(guò)研究 Linux 的進(jìn)程機(jī)制和信號(hào)量實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題的并發(fā)控制。說(shuō)明 :有界緩沖區(qū)內(nèi)設(shè)有 20 個(gè)存儲(chǔ)單元 ,放入 /取出的數(shù)據(jù)項(xiàng)設(shè)定為 1-20 這 20 個(gè)整型數(shù)。設(shè)計(jì)要求 :(
2、1)每個(gè)生產(chǎn)者和消費(fèi)者對(duì)有界緩沖區(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ù)表來(lái)維護(hù)它的代碼段、堆棧段和數(shù)據(jù)段,這是一種煩瑣的多任務(wù)工作方式。生產(chǎn)者 -消費(fèi)者方案是多進(jìn)程應(yīng)用程序開(kāi)發(fā)中最常用的構(gòu)造之一。因此困難也在于此。因?yàn)樵谝粋€(gè)應(yīng)用程序中可以多次重復(fù)生產(chǎn)者 -消費(fèi)者行為,其代碼也可以如此。設(shè)計(jì)中創(chuàng)建了 Con
3、sumer 類,該類通過(guò)在一些多進(jìn)程應(yīng)用程序中促進(jìn)代碼重用以及簡(jiǎn)化代碼調(diào)試和維護(hù)來(lái)解決這個(gè)問(wèn)題。多進(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ù)。通常有兩種不同類- 1 -型的多進(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)者方案很適合于后
4、臺(tái)處理類別的情況。這些情況通常圍繞一個(gè)作業(yè)“生產(chǎn)者”方和一個(gè)作業(yè)“消費(fèi)者”方。當(dāng)然,關(guān)于作業(yè)并行執(zhí)行還有其它考慮事項(xiàng)。在大多數(shù)情況下, 對(duì)于使用同一資源的作業(yè),應(yīng)以 FCFS 的方式按順序處理,這可以通過(guò)使用單進(jìn)程的消費(fèi)者輕松實(shí)現(xiàn)。通過(guò)使用這種方法,使用單個(gè)進(jìn)程來(lái)訪問(wèn)單個(gè)資源,而不是用多個(gè)進(jìn)程來(lái)訪問(wèn)單個(gè)資源。要啟用標(biāo)準(zhǔn)消費(fèi)者,當(dāng)作業(yè)到來(lái)時(shí)創(chuàng)建一個(gè)作業(yè)隊(duì)列來(lái)存儲(chǔ)所有作業(yè)。生產(chǎn)者進(jìn)程通過(guò)將新對(duì)象添加到消費(fèi)者隊(duì)列來(lái)交付這個(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ì)醒來(lái)并處理該對(duì)象。2.3 詳細(xì)設(shè)計(jì)及編碼( 1)調(diào)試問(wèn)
5、題分析為解決生產(chǎn)者 / 消費(fèi)者問(wèn)題,應(yīng)該設(shè)置兩個(gè)資源信號(hào)量,其中一個(gè)表示空緩沖區(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)者問(wèn)題中,信號(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)量M
6、utex 進(jìn)行 P操作,申請(qǐng)資源。如果可以通過(guò)的話,就生產(chǎn)一個(gè)產(chǎn)品,并把產(chǎn)品送入緩沖區(qū)。然后對(duì)互斥信號(hào)量 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)資源。如果可以通過(guò)的話,就從緩沖區(qū)取出一個(gè)產(chǎn)品并消費(fèi)掉。然后對(duì)互斥信號(hào)量 Mutex 和資源信號(hào)量 Full 進(jìn)行 V 操作,釋放資源。如果緩沖區(qū)中已經(jīng)沒(méi)有可用資源, 就把申請(qǐng)資源的進(jìn)程添加到等待隊(duì)列的隊(duì)尾。如果有一個(gè)資源被釋放,在等待隊(duì)列中的第一個(gè)進(jìn)程被喚醒并取得這個(gè)資源的使用權(quán)。- 2 -( 2)流程圖生產(chǎn)者線程開(kāi)未 通資源信號(hào)
7、量 P過(guò)操作互斥信號(hào)量 P操作線程自我阻塞生產(chǎn)一個(gè)產(chǎn)品添加到等待隊(duì)把產(chǎn)品送入緩沖區(qū)列互斥信號(hào)量V操作等待隊(duì)列中有消費(fèi)者線N資源信號(hào)量V操作通過(guò)通未 通過(guò)過(guò)線程自我阻塞添加到等待隊(duì)列Y喚醒對(duì)頭的消費(fèi)者線程Y等待隊(duì)列中有喚醒對(duì)頭的消費(fèi)者消費(fèi)者線線程未通生產(chǎn)者線程結(jié)圖 2-1 生產(chǎn)者流程圖- 3 -未通線程自我阻塞添加到等待隊(duì)消費(fèi)者線程開(kāi)資源信號(hào)量P 操通過(guò)互斥信號(hào)量P 操通從緩沖區(qū)取出一個(gè)線程自我阻塞消費(fèi)一個(gè)產(chǎn)品添加到等待隊(duì)互斥信號(hào)量VY等待隊(duì)列中有喚醒對(duì)頭的生產(chǎn)者線生產(chǎn)者線N資源信號(hào)量VY等待隊(duì)列中有喚醒對(duì)頭的生產(chǎn)者線生產(chǎn)者線消費(fèi)者線程結(jié)圖 2-2 消費(fèi)者流程圖- 4 -( 3)源程序#incl
8、ude#include#include#includetypedefHANDLE Semaphore;/信號(hào)量的 Windows 原型#defineP(S) WaitForSingleObject(S,INFINITE)/定義 Windows 下的 P操作#defineV(S) ReleaseSemaphore(S,1,NULL)/定義 Windows 下的 V操作#definerate 1000#defineCONSUMER_NUM2 /*消費(fèi)者個(gè)數(shù)*/#define PRODUCER_NUM 3/*生產(chǎn)者個(gè)數(shù)*/#define BUFFER_NUM20/*緩沖區(qū)個(gè)數(shù)*/char *thin
9、g8 = 豆?jié){ , 油條 , 燒餅 , 牛奶 , 包子 , 燒賣 , 煎蛋 , 雪碧;/生產(chǎn)和消費(fèi)的產(chǎn)品名稱struct Bufferint productBUFFER_NUM;/緩沖區(qū)int start,end;/兩個(gè)指針相當(dāng)于教材中的inout 指針g_buf;SemaphoreEmpty,Full,Mutex;/分別相當(dāng)于 Empty, Full, Mutex 三個(gè)信號(hào)量/*消費(fèi)者線程 */DWORD WINAPI Consumer(LPVOIDpara)/ i 表示第 i個(gè)消費(fèi)者inti = *(int *)para;/利用 para傳入當(dāng)前消費(fèi)者的編號(hào)intptr;/待消費(fèi)的內(nèi)容的指
10、針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)%BUFFER_NUM;/ 讓其他消費(fèi)者或生產(chǎn)者使用- 5 -printf (消費(fèi)者 %01d:我需要 buf%d=%sn , i, ptr, thingg_ductptr);/ 消費(fèi)完畢,并釋放一個(gè)緩沖printf ( 消費(fèi)者 %01d: 我消費(fèi)完畢 %sn, i,thingg_buf.pr
11、oductptr); V(Mutex);V(Empty);Sleep(rate*rand()%10+110);return 0;/*生產(chǎn)者線程 */DWORD WINAPI Producer(LPVOID para)inti = *(int *)para - CONSUMER_NUM;intptr;intdata;/產(chǎn)品intj=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;/ 再移
12、動(dòng)緩沖區(qū)指針g_buf.end =(g_buf.end+1)%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)- 6 -/ 線程技術(shù),前面為消費(fèi)者線程,后面為生產(chǎn)者線程HANDLEhThreadCONSUMER_NUM+PRODUCER_NUM;/線程計(jì)數(shù)s
13、rand(time(NULL);rand();DWORDtid;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(CreateSemaphoneError!n);return-1;int
14、 totalThreads=CONSUMER_NUM+PRODUCER_NUM;/ 開(kāi)啟消費(fèi)者線程printf ( 先請(qǐng)消費(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(;itotalThreads;i+)hThreadi=CreateThread(NULL,0,Producer,&i,0,&tid);if(hThreadi)WaitFor
15、SingleObject(hThreadi,10);/ 生產(chǎn)者和消費(fèi)者的執(zhí)行WaitForMultipleObjects(totalThreads,hThread,TRUE,INFINITE);return 0;- 7 -3 結(jié)果及分析- 8 -4 設(shè)計(jì)小結(jié)本次課程設(shè)計(jì)通過(guò)模擬計(jì)算機(jī)操作系統(tǒng)中經(jīng)典的“生產(chǎn)者消費(fèi)者問(wèn)題”,鞏固了我在操作系統(tǒng)原理課上所學(xué)的知識(shí), 加深了對(duì)操作系統(tǒng)中進(jìn)程同步和互斥等問(wèn)題,完成了多進(jìn)程同步方法解決生產(chǎn)者消費(fèi)者問(wèn)題全部過(guò)程,結(jié)果滿足設(shè)計(jì)要求。設(shè)計(jì)過(guò)程中遇到不少困難,在反復(fù)研究老師的PPT 及課本的原理后才逐漸明晰怎樣將代碼實(shí)現(xiàn),雖然這學(xué)期學(xué)過(guò)Java,但 java 不是很熟悉,因此還是選擇C+語(yǔ)言。以前學(xué)習(xí) C+沒(méi)有深入了解到線程這個(gè)概念,在學(xué)習(xí) Java 的時(shí)候才知道有專門的線程類。所以我在網(wǎng)上也參考了其他人用 C+ 編寫尤其是關(guān)于多進(jìn)程程序的設(shè)計(jì)實(shí)現(xiàn)。在代碼的實(shí)現(xiàn)過(guò)程中,我是主要定義了兩個(gè)函數(shù)DWORDWINAPIConsumer(LPVOID para) 和 DWORD WINAPI Producer(LPVOID para),在這兩個(gè)函數(shù)中實(shí)現(xiàn) PV 操作。通過(guò)本次設(shè)計(jì),我較好地掌握了通過(guò)研究Linux 的進(jìn)程機(jī)制和信號(hào)量實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題的并發(fā)控制全過(guò)程,尤其是對(duì)多進(jìn)程程序設(shè)計(jì)方法有了更深的理解,開(kāi)拓了思路,鍛煉了實(shí)踐動(dòng)手能手。但是我覺(jué)得課程
溫馨提示
- 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ù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度建筑防水工程防水材料研發(fā)與市場(chǎng)調(diào)研合同
- 金華浙江金華市交通工程管理中心招聘編外人員筆試歷年參考題庫(kù)附帶答案詳解
- 遼寧2025年渤海大學(xué)招聘高層次人才92人筆試歷年參考題庫(kù)附帶答案詳解
- 湖南2025年湖南省生態(tài)環(huán)境廳直屬事業(yè)單位招聘44人筆試歷年參考題庫(kù)附帶答案詳解
- DB2103-T 008-2023 消防技術(shù)服務(wù)機(jī)構(gòu)從業(yè)規(guī)范
- 沈陽(yáng)2025年遼寧沈陽(yáng)遼中區(qū)四家事業(yè)單位面向區(qū)內(nèi)事業(yè)單位遴選18人筆試歷年參考題庫(kù)附帶答案詳解
- 常州2025年江蘇常州工學(xué)院高層次人才招聘60人(長(zhǎng)期)筆試歷年參考題庫(kù)附帶答案詳解
- 2025年中國(guó)兩側(cè)擋渣器市場(chǎng)調(diào)查研究報(bào)告
- 2025年語(yǔ)音電路項(xiàng)目可行性研究報(bào)告
- 2025年耐高溫硅橡膠項(xiàng)目可行性研究報(bào)告
- 2025年電力鐵塔市場(chǎng)分析現(xiàn)狀
- GB 12158-2024防止靜電事故通用要求
- 《教育強(qiáng)國(guó)建設(shè)規(guī)劃綱要(2024-2035年)》全文
- 山東省濱州市2024-2025學(xué)年高二上學(xué)期期末地理試題( 含答案)
- 體育老師籃球說(shuō)課
- 化學(xué)-江蘇省蘇州市2024-2025學(xué)年2025屆高三第一學(xué)期學(xué)業(yè)期末質(zhì)量陽(yáng)光指標(biāo)調(diào)研卷試題和答案
- 蛋雞生產(chǎn)飼養(yǎng)養(yǎng)殖培訓(xùn)課件
- 運(yùn)用PDCA降低住院患者跌倒-墜床發(fā)生率
- 海底撈員工手冊(cè)
- 2024CSCO小細(xì)胞肺癌診療指南解讀
- 立春氣象與生活影響模板
評(píng)論
0/150
提交評(píng)論