![操作系統(tǒng)之生產(chǎn)者消費者問題(c++實現(xiàn))_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/eece4b40-9297-4972-8bb2-77e1fa4f3b8a/eece4b40-9297-4972-8bb2-77e1fa4f3b8a1.gif)
![操作系統(tǒng)之生產(chǎn)者消費者問題(c++實現(xiàn))_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/eece4b40-9297-4972-8bb2-77e1fa4f3b8a/eece4b40-9297-4972-8bb2-77e1fa4f3b8a2.gif)
![操作系統(tǒng)之生產(chǎn)者消費者問題(c++實現(xiàn))_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/eece4b40-9297-4972-8bb2-77e1fa4f3b8a/eece4b40-9297-4972-8bb2-77e1fa4f3b8a3.gif)
![操作系統(tǒng)之生產(chǎn)者消費者問題(c++實現(xiàn))_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/eece4b40-9297-4972-8bb2-77e1fa4f3b8a/eece4b40-9297-4972-8bb2-77e1fa4f3b8a4.gif)
![操作系統(tǒng)之生產(chǎn)者消費者問題(c++實現(xiàn))_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/2/eece4b40-9297-4972-8bb2-77e1fa4f3b8a/eece4b40-9297-4972-8bb2-77e1fa4f3b8a5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、操作系統(tǒng)課程設(shè)計報告專業(yè) 計算機科學(xué)與技術(shù)學(xué)生姓名丁可班級B計123班學(xué)號1210704314指導(dǎo)教師李先鋒完成日期2015年11月20日信息工程學(xué)院題目:生產(chǎn)者-消費者問題的模擬實現(xiàn)一、設(shè)計目的本課程設(shè)計是學(xué)習(xí)完“操作系統(tǒng)原理”課程后進行的一次全面的綜合訓(xùn)練,通過課程設(shè)計,更好地掌握操作系統(tǒng)的原理及實現(xiàn)方法,加深對操作系統(tǒng)基礎(chǔ)理論和重要算法的理解,加強學(xué)生的動手能力。二、設(shè)計內(nèi)容1、概述用進程同步方法解決“生產(chǎn)者-消費者”問題,C或C+語言實現(xiàn)。1、設(shè)計目的通過研究進程并發(fā)和信號量機制,實現(xiàn)生產(chǎn)者-消費者問題的并發(fā)控制。2、設(shè)計要求1)每個生產(chǎn)者和消費者對有界緩沖區(qū)進行操作后,即時顯示有界緩
2、沖區(qū)的全部內(nèi)容,當前指針位置和生產(chǎn)者/消費者進程的標識符。說明:有界緩沖區(qū)(提示:有界緩沖區(qū)可用數(shù)組實現(xiàn))內(nèi)設(shè)有20個存儲單元,放入/取出的數(shù)據(jù)項設(shè)定為1-20這20個整型數(shù)。2)生產(chǎn)者和消費者各有兩個以上。3)多個生產(chǎn)者或多個消費者之間須有共享對緩沖區(qū)進行操作的函數(shù)代碼。2、設(shè)計原理在同一個進程地址空間內(nèi)執(zhí)行的兩個線程生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費。消費者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。當生產(chǎn)者線程生產(chǎn)物品時,如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費者線程釋放出一個空緩沖區(qū)。當消費者線程消費物品時,如果沒有滿的緩沖區(qū),那么消費者線程將被阻塞
3、,直到新的物品被生產(chǎn)出來。3、詳細設(shè)計及編碼定義兩個信號量HANDLE g_hFullSemaphore;/資源信號量:緩沖區(qū)滿HANDLE g_hEmptySemaphore;/資源信號量:緩沖區(qū)空unsigned short in = 0;/用于記錄生產(chǎn)者的指針位置unsigned short out = 0;/用于記錄消費者的指針位置HANDLE g_hMutex;/線程間的互斥信號量生產(chǎn)者進程while(TRUE) 生產(chǎn)一個產(chǎn)品; P(g_hEmptySemaphore)
4、; P(mutex1); 產(chǎn)品送往buffer(in); in=(in+1)mod n; V(mutex1); V(g_hFullSemaphore); 消費者進程while(TRUE) P(g_hFullSemaphore); &
5、#160; P(mutex2); 從buffer(out)中取出產(chǎn)品; out=(out+1)mod n; V(mutex2); V(g_hEmptySemaphore);(算法流程圖、編程及程序注釋等)主要的方法:4、運行結(jié)果分析1、運行示例在 c+中運行源程序 ,程序主界面截圖.按回車及申請資源和緩沖區(qū)進行 p 操作和申請互斥(生產(chǎn)者和消費者都是2個)(運行界面截圖、界面說明、輸入輸出數(shù)據(jù)說明和分析等)附錄代碼:#include <wind
6、ows.h>#include <iostream>const unsigned short SIZE_OF_BUFFER = 20;/有界緩沖區(qū)長度int g_bufferSIZE_OF_BUFFER;/開辟緩沖區(qū)?用數(shù)組表示?可以看成是一個循環(huán)隊列unsigned short ProductID = 0;/新生產(chǎn)出來的產(chǎn)品的產(chǎn)品號unsigned short ConsumeID = 0;/被消耗的產(chǎn)品的產(chǎn)品號unsigned short in = 0;/產(chǎn)品進緩沖區(qū)時的緩沖區(qū)下標?用于記錄生產(chǎn)者的指針位置unsigned short out = 0;/產(chǎn)品出緩沖區(qū)時的緩沖區(qū)
7、下標?用于記錄消費者的指針位置 bool g_continue = 1;/控制程序運行:1 表示繼續(xù)運行?0 表示停止運行HANDLE g_hMutex;/線程間的互斥信號量HANDLE g_hFullSemaphore;/資源信號量:緩沖區(qū)滿HANDLE g_hEmptySemaphore;/資源信號量:緩沖區(qū)空DWORD WINAPI Producer(LPVOID);/生產(chǎn)者線程DWORD WINAPI Consumer(LPVOID);/消費者線程const unsigned short PRODUCERS_COUNT=2;/生產(chǎn)者的個數(shù)const unsigned short CON
8、SUMERS_COUNT=2;/消費者的個數(shù)const unsigned short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;/總線程數(shù)HANDLE hThreadsPRODUCERS_COUNT;/各線程的 handleDWORD producerIDCONSUMERS_COUNT;/生產(chǎn)者線程的標識符DWORD consumerIDTHREADS_COUNT;/消費者線程的標識符/*-程序提示信息開始-*/void info()/程序提示信息std:cout<<"* - - - - - - - - - - - - -
9、 - - - - - - - - - - *"<<std:endl;std:cout<<"| 課程設(shè)計課題 : 生產(chǎn)者-消費者問題的模擬實現(xiàn) |"<<std:endl;std:cout<<"| 指 導(dǎo) 老 師 : 李先鋒 |"<<std:endl;std:cout<<"| 學(xué) 生 : 丁可 |"<<std:endl;std:cout<<"| 班 級 : B計123班 |"<<std:endl;std
10、:cout<<"* - - - - - - - - - - - - - - - - - - - - - - - *"<<std:endl;std:cout<<" =按回車開始該程序 "<<std:endl;getchar();/*-程序提示信息結(jié)束-*/*-生產(chǎn)一個產(chǎn)品開始-*/生產(chǎn)一個產(chǎn)品:輸出其 ID 號void Produce()std:cout<<std:endl;std:cerr<<"生產(chǎn)一個產(chǎn)品: "<<+ProductID;std:cou
11、t<<std:endl;/*-生產(chǎn)一個產(chǎn)品結(jié)束-*/*-把新生產(chǎn)的產(chǎn)品放入緩沖區(qū)開-*/把新生產(chǎn)的產(chǎn)品放入緩沖區(qū)void Append()std:cerr<<"把生產(chǎn)的產(chǎn)品送入緩沖區(qū)"g_bufferin=ProductID;in=(in+1)%SIZE_OF_BUFFER;std:cerr<<std:endl;std:cout<<"緩沖區(qū) 產(chǎn)品 生產(chǎn)者/消費者"<<std:endl;/新產(chǎn)品放入緩沖區(qū)后?輸出緩沖區(qū)當前的狀態(tài)for(int i=0;i<SIZE_OF_BUFFER;+i)
12、/輸出緩沖區(qū)下標if (i<10)std:cout<<i<<" "<<g_bufferi;elsestd:cout<<i<<" "<<g_bufferi;if(i=in)if(g_bufferi<10)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 生產(chǎn)者"/輸出生產(chǎn)者的指針位置if(i=out)if(g_bufferi<1
13、0)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 消費者"/輸出消費者的指針位置std:cout<<std:endl;/*-把新生產(chǎn)的產(chǎn)品放入緩沖區(qū)結(jié)-*/*-消費一個產(chǎn)品開始-*/void Consume()/消費一個產(chǎn)品std:cout<<std:endl;std:cerr<<"消費一個產(chǎn)品: "<<ConsumeID;std:cout<<std:endl;/*-消費
14、一個產(chǎn)品結(jié)束-*/*-從緩沖區(qū)中取出一個產(chǎn)品開始-*/從緩沖區(qū)中取出一個產(chǎn)品void Take()std:cout<<std:endl;std:cerr<<"從緩沖區(qū)取出一個產(chǎn)品"ConsumeID=g_bufferout;out=(out+1)%SIZE_OF_BUFFER;std:cerr<<std:endl;std:cout<<std:endl;std:cout<<"緩沖區(qū) 產(chǎn)品 生產(chǎn)者/消費者"<<std:endl;/取出一個產(chǎn)品后:輸出緩沖區(qū)當前的狀態(tài)for(int i=0
15、;i<SIZE_OF_BUFFER;+i)/輸出緩沖區(qū)下標if(i<10)std:cout<<i<<" "<<g_bufferi;elsestd:cout<<i<<" "<<g_bufferi;if(i=in)if(g_bufferi<10)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 生產(chǎn)者"/輸出生產(chǎn)者的指針位置if(
16、i=out)if(g_bufferi<10)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 消費者"/輸出消費者的指針位置std:cout<<std:endl;/*-從緩沖區(qū)中取出一個產(chǎn)品結(jié)束-*/*-生產(chǎn)者線程開始-*/生產(chǎn)者線程DWORD WINAPI Producer(LPVOID lpPara)while(g_continue)/資源信號量的 P 操作WaitForSingleObject(g_hFullSemaphore,I
17、NFINITE);/互斥信號量的 P 操作WaitForSingleObject(g_hMutex,INFINITE);/生產(chǎn)一個產(chǎn)品Produce();/把新生產(chǎn)的產(chǎn)品放入緩沖區(qū)Append();Sleep(2000);/互斥信號量的 V 操作ReleaseMutex(g_hMutex);/資源信號量的 V 操作ReleaseSemaphore(g_hEmptySemaphore,1,NULL);return 0;/*-生產(chǎn)者線程結(jié)束-*/*-消費者線程開始-*/消費者線程DWORD WINAPI Consumer(LPVOID lpPara)while(g_continue)/資源信號量的
18、 P 操作WaitForSingleObject(g_hEmptySemaphore,INFINITE);/互斥信號量的 P 操作WaitForSingleObject(g_hMutex,INFINITE);/從緩沖區(qū)中取出一個產(chǎn)品Take();/消費一個產(chǎn)品Consume();Sleep(2000);/互斥信號量的 V 操作ReleaseMutex(g_hMutex);/資源信號量的 V 操作ReleaseSemaphore(g_hFullSemaphore,1,NULL);return 0;/*-消費者線程結(jié)束-*/*-創(chuàng)建生產(chǎn)者線程開始-*/void createPT()/創(chuàng)建生產(chǎn)者線程for(int i=0;i<PRODUCERS_COUNT;+i)hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi);if(hThreadsi=NULL)g_continue=0;/*-創(chuàng)建生產(chǎn)者線程結(jié)束-*/*-創(chuàng)建消費者線程開始-*/void createCT()/創(chuàng)建消費者線程for (int j=0;j<CONSUMERS_COUNT;+j)hThrea
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年化肥分銷合作協(xié)議文本
- 2025年企業(yè)勞動爭議解決與調(diào)解合同
- 2025年便利店員工勞動合同范例
- 2025年學(xué)??沙掷m(xù)發(fā)展教育合作三方協(xié)議
- 2025年信用合同履行風(fēng)險評估
- 2025年養(yǎng)老機構(gòu)入住合同樣本
- 2025年合伙投資權(quán)益共享協(xié)議范本
- 2025年光伏產(chǎn)業(yè)發(fā)展戰(zhàn)略合作框架協(xié)議
- 2025年住宅小區(qū)裝修班組施工協(xié)議
- 2025年股權(quán)交易策劃限制性協(xié)議范本
- 如何提高調(diào)查研究能力
- 電網(wǎng)兩票培訓(xùn)課件
- 改革開放教育援藏的創(chuàng)新及其成效
- 小學(xué)科學(xué)人教鄂教版四年級下冊全冊教案2023春
- 第3課+中古時期的西歐(教學(xué)設(shè)計)-【中職專用】《世界歷史》(高教版2023基礎(chǔ)模塊)
- 2024年南通建筑電工證考試題模擬試題電工培訓(xùn)試題及答案(全國通用)
- 班組建設(shè)工作匯報
- 遛狗行業(yè)市場分析
- 2025小學(xué)道德與法治開學(xué)第一課(思想政治理論教育課)
- 供應(yīng)鏈金融與供應(yīng)鏈融資模式
- 如何進行有效的目標設(shè)定和達成
評論
0/150
提交評論