




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、學(xué) 號(hào): 課 程 設(shè) 計(jì)題 目進(jìn)程同步模擬設(shè)計(jì)生產(chǎn)者和消費(fèi)者問題學(xué) 院計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專 業(yè)計(jì)算機(jī)科學(xué)與技術(shù)專業(yè)班 級(jí)1006班姓 名丁探指導(dǎo)教師劉洪星2013年1月17日課程設(shè)計(jì)任務(wù)書學(xué)生姓名: 丁探 專業(yè)班級(jí): 計(jì)算機(jī)1006 指導(dǎo)教師: 劉洪星 工作單位: 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院 題 目: 進(jìn)程同步模擬設(shè)計(jì)生產(chǎn)者和消費(fèi)者問題 初始條件:1預(yù)備內(nèi)容:閱讀操作系統(tǒng)的進(jìn)程管理章節(jié)內(nèi)容,對(duì)進(jìn)程的同步和互斥,以及信號(hào)量機(jī)制度有深入的理解。2實(shí)踐準(zhǔn)備:掌握一種計(jì)算機(jī)高級(jí)語言的使用。要求完成的主要任務(wù): (包括課程設(shè)計(jì)工作量及其技術(shù)要求,以及說明書撰寫等具體要求)1模擬用信號(hào)量機(jī)制實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者
2、問題。2設(shè)計(jì)報(bào)告內(nèi)容應(yīng)說明: 課程設(shè)計(jì)目的與功能; 需求分析,數(shù)據(jù)結(jié)構(gòu)或模塊說明(功能與框圖); 源程序的主要部分; 運(yùn)行結(jié)果與運(yùn)行情況分析; 自我評(píng)價(jià)與總結(jié):i)你認(rèn)為你完成的設(shè)計(jì)哪些地方做得比較好或比較出色;ii)什么地方做得不太好,以后如何改正;iii)從本設(shè)計(jì)得到的收獲(在編寫,調(diào)試,執(zhí)行過程中的經(jīng)驗(yàn)和教訓(xùn));iv)完成本題是否有其他的其他方法(如果有,簡要說明該方法);v)對(duì)實(shí)驗(yàn)題的評(píng)價(jià)和改進(jìn)意見,請(qǐng)你推薦設(shè)計(jì)題目。時(shí)間安排:設(shè)計(jì)安排一周:周1、周2:完成程序分析及設(shè)計(jì)。周2、周3:完成程序調(diào)試及測試。周4、周5:驗(yàn)收、撰寫課程設(shè)計(jì)報(bào)告。(注意事項(xiàng):嚴(yán)禁抄襲,一旦發(fā)現(xiàn),抄與被抄的一律
3、按0分記)指導(dǎo)教師簽名: 年 月 日系主任(或責(zé)任教師)簽名: 年 月 日目 錄1、 需求分析.42、 功能設(shè)計(jì).53、源程序.84、運(yùn)行結(jié)果.135、總 結(jié).166、參考文獻(xiàn).16生產(chǎn)者消費(fèi)者問題1. 需求分析1.1問題描述: 一組生產(chǎn)者向一組消費(fèi)者提供消息,它們共享一個(gè)有界緩沖區(qū)n,生產(chǎn)者向其中投放消息,消費(fèi)者從中取得消息。1.2規(guī)則:n 對(duì)于生產(chǎn)者進(jìn)程:產(chǎn)生一個(gè)數(shù)據(jù),當(dāng)要送入緩沖區(qū)時(shí),要檢查緩沖區(qū)是否已滿,若未滿,則可將數(shù)據(jù)送入緩沖區(qū),并通知消費(fèi)者進(jìn)程;否則,等待;n 對(duì)于消費(fèi)者進(jìn)程:當(dāng)它去取數(shù)據(jù)時(shí),要看緩沖區(qū)中是否有數(shù)據(jù)可取,若有則取走一個(gè)數(shù)據(jù),并通知生產(chǎn)者進(jìn)程,否則,等待。n 緩沖區(qū)
4、是個(gè)臨界資源,因此,諸進(jìn)程對(duì)緩沖區(qū)的操作程序是一個(gè)共享臨界區(qū),所以,還有個(gè)互斥的問題。1.3信號(hào)燈設(shè)置 :兩個(gè)同步信號(hào)燈- empty :表示空緩沖區(qū)的數(shù)目,初值為有界緩沖區(qū)的大小n; full : 表示滿緩沖區(qū)(即信息)的數(shù)目,其初值為0;一個(gè)互斥信號(hào)燈- mutex:互斥信號(hào)燈,初值為1。 1.4同步描述: 1.5程序描述:main( ) int full=0; /*滿緩沖區(qū)的數(shù)目*/ int empty=n;/*空緩沖區(qū)的數(shù)目*/
5、 int mutex=1;/*對(duì)有界緩沖區(qū)進(jìn)行操作的互斥信號(hào)燈*/ cobegin p1 ( ); p2( ); coend p1() while(生產(chǎn)未完成) ··· 生產(chǎn)一個(gè)產(chǎn)品; p(empty); p(mutex); 送一個(gè)產(chǎn)品到有界緩沖區(qū); v(mutex); v(full); p2( ) while(還要繼續(xù)消費(fèi)) p(full); p(mutex); 從有界緩沖區(qū)中取產(chǎn)品; v(mutex); v(empty);
6、3;·· 消費(fèi)一個(gè)產(chǎn)品; 1.6 C+語言程序模擬用信號(hào)量機(jī)制實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者問題:本次課程設(shè)計(jì)主要通過C+模擬信號(hào)量制中各個(gè)進(jìn)程,及各進(jìn)程之間的互斥、同步關(guān)系,來實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者問題。2. 功能設(shè)計(jì)2.1設(shè)計(jì)目的:通過實(shí)驗(yàn)?zāi)M生產(chǎn)者和消費(fèi)者之間的關(guān)系,了解并掌握他們之間的關(guān)系及其原理。由此增加對(duì)進(jìn)程同步的問題的了解。具體如下: 1)掌握基本的同步互斥算法,理解生產(chǎn)者和消費(fèi)者模型; 2)了解windows中多線程(多進(jìn)程)的并發(fā)執(zhí)行機(jī)制,線程(進(jìn)程)間的同步和互斥; 3)學(xué)習(xí)使用windows中基本的同步對(duì)象,掌握相應(yīng)的API。2.2設(shè)計(jì)功能:利用模擬用信號(hào)量機(jī)制實(shí)現(xiàn)生
7、產(chǎn)者和消費(fèi)者問題:通過用戶控制取進(jìn)程和放進(jìn)程,反應(yīng)生產(chǎn)者和消費(fèi)者問題中所涉及的進(jìn)程的同步與互斥。2.3數(shù)據(jù)流程圖:1、生產(chǎn)者2、消費(fèi)者2.4模塊說明:const unsigned short SIZE_OF_BUFFER = 10; /緩沖區(qū)長度 unsigned short ProductID = 0; /產(chǎn)品號(hào) unsigned short ConsumeID = 0; /將被消耗的產(chǎn)品號(hào) unsigned short in = 0; /產(chǎn)品進(jìn)緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo) unsigned short out = 0; /產(chǎn)品出緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo) int g_bufferSIZE_OF_BUFF
8、ER; /緩沖區(qū)是個(gè)循環(huán)隊(duì)列 bool g_continue = true; /控制程序結(jié)束 HANDLE g_hMutex; /用于線程間的互斥 HANDLE g_hFullSemaphore; /當(dāng)緩沖區(qū)滿時(shí)迫使生產(chǎn)者等待 HANDLE g_hEmptySemaphore; /當(dāng)緩沖區(qū)空時(shí)迫使消費(fèi)者等待 DWORD WINAPI Producer(LPVOID); /生產(chǎn)者線程 DWORD WINAPI Consumer(LPVOID); /消費(fèi)者線程 3、源程序#include <windows.h>#include <iostream>const unsigne
9、d short SIZE_OF_BUFFER = 20;/有界緩沖區(qū)長度int g_bufferSIZE_OF_BUFFER;/開辟緩沖區(qū),用數(shù)組表示,可以看成是一個(gè)循環(huán)隊(duì)列unsigned short ProductID = 0;/新生產(chǎn)出來的產(chǎn)品的產(chǎn)品號(hào)unsigned short ConsumeID = 0;/被消耗的產(chǎn)品的產(chǎn)品號(hào)unsigned short in = 0;/產(chǎn)品進(jìn)緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo),用于記錄生產(chǎn)者的指針位置unsigned short out = 0;/產(chǎn)品出緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo),用于記錄消費(fèi)者的指針位置bool g_continue = 1;/控制程序運(yùn)行:1表示繼
10、續(xù)運(yùn)行,0表示停止運(yùn)行HANDLE g_hMutex;/線程間的互斥信號(hào)量HANDLE g_hFullSemaphore;/資源信號(hào)量:緩沖區(qū)滿HANDLE g_hEmptySemaphore;/資源信號(hào)量:緩沖區(qū)空DWORD WINAPI Producer(LPVOID);/生產(chǎn)者線程DWORD WINAPI Consumer(LPVOID);/消費(fèi)者線程const unsigned short PRODUCERS_COUNT=4;/生產(chǎn)者的個(gè)數(shù)const unsigned short CONSUMERS_COUNT=3;/消費(fèi)者的個(gè)數(shù)const unsigned short THREADS
11、_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;/總線程數(shù)HANDLE hThreadsPRODUCERS_COUNT;/各線程的handleDWORD producerIDCONSUMERS_COUNT;/生產(chǎn)者線程的標(biāo)識(shí)符DWORD consumerIDTHREADS_COUNT;/消費(fèi)者線程的標(biāo)識(shí)符/*-生產(chǎn)一個(gè)產(chǎn)品開始-*/生產(chǎn)一個(gè)產(chǎn)品,輸出其ID號(hào)void Produce()std:cout<<std:endl;std:cerr<<"生產(chǎn)一個(gè)產(chǎn)品: "<<+ProductID;std:cout<
12、;<std:endl;/*-生產(chǎn)一個(gè)產(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)者/消費(fèi)者"<<std:endl;/新產(chǎn)品放入緩沖區(qū)后,輸出緩沖區(qū)當(dāng)前的狀態(tài)for(int i=0;i<SIZE_OF_BUFFER;+i) /輸
13、出緩沖區(qū)下標(biāo)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<10)
14、std:cout<<" "elsestd:cout<<" "std:cout<<" <- 消費(fèi)者"/輸出消費(fèi)者的指針位置std:cout<<std:endl;/*-把新生產(chǎn)的產(chǎn)品放入緩沖區(qū)結(jié)束-*/*-消費(fèi)一個(gè)產(chǎn)品開始-*/void Consume()/消費(fèi)一個(gè)產(chǎn)品std:cout<<std:endl;std:cerr<<"消費(fèi)一個(gè)產(chǎn)品: "<<ConsumeID;std:cout<<std:endl;/*-消費(fèi)一
15、個(gè)產(chǎn)品結(jié)束-*/*-從緩沖區(qū)中取出一個(gè)產(chǎn)品開始-*/從緩沖區(qū)中取出一個(gè)產(chǎn)品void Take()std:cout<<std:endl;std:cerr<<"從緩沖區(qū)取出一個(gè)產(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)者/消費(fèi)者"<<std:endl;/取出一個(gè)產(chǎn)品后,輸出緩沖區(qū)當(dāng)前的狀態(tài)for(int i=0;
16、i<SIZE_OF_BUFFER;+i) /輸出緩沖區(qū)下標(biāo)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(
17、i=out)if(g_bufferi<10)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 消費(fèi)者"/輸出消費(fèi)者的指針位置std:cout<<std:endl;/*-從緩沖區(qū)中取出一個(gè)產(chǎn)品結(jié)束-*/*-生產(chǎn)者線程開始-*/生產(chǎn)者線程DWORD WINAPI Producer(LPVOID lpPara) while(g_continue)/資源信號(hào)量的P操作WaitForSingleObject(g_hFullSemaphore,IN
18、FINITE); /互斥信號(hào)量的P操作WaitForSingleObject(g_hMutex,INFINITE); /生產(chǎn)一個(gè)產(chǎn)品Produce();/把新生產(chǎn)的產(chǎn)品放入緩沖區(qū)Append();Sleep(2000);/互斥信號(hào)量的V操作ReleaseMutex(g_hMutex); /資源信號(hào)量的V操作ReleaseSemaphore(g_hEmptySemaphore,1,NULL); return 0;/*-生產(chǎn)者線程結(jié)束-*/*-消費(fèi)者線程開始-*/消費(fèi)者線程DWORD WINAPI Consumer(LPVOID lpPara) while(g_continue)/資源信號(hào)量的P操
19、作WaitForSingleObject(g_hEmptySemaphore,INFINITE); /互斥信號(hào)量的P操作WaitForSingleObject(g_hMutex,INFINITE); /從緩沖區(qū)中取出一個(gè)產(chǎn)品Take();/消費(fèi)一個(gè)產(chǎn)品Consume();Sleep(2000);/互斥信號(hào)量的V操作ReleaseMutex(g_hMutex); /資源信號(hào)量的V操作ReleaseSemaphore(g_hFullSemaphore,1,NULL); return 0;/*-消費(fèi)者線程結(jié)束-*/*-創(chuàng)建生產(chǎn)者線程開始-*/void createPT()/創(chuàng)建生產(chǎn)者線程for(in
20、t 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)建消費(fèi)者線程開始-*/void createCT()/創(chuàng)建消費(fèi)者線程for (int j=0;j<CONSUMERS_COUNT;+j)hThreadsPRODUCERS_COUNT+j=CreateThread(NULL,0,Consumer,NULL,0,&consumerIDj);if (hThreadsj=NULL)g_continue=0;/*-創(chuàng)建消費(fèi)者線程結(jié)束-*/*-主函數(shù)開始-*/void main()/創(chuàng)建互斥信號(hào)量g_hMutex=CreateMutex(NULL,FALSE,NULL); /創(chuàng)建資源信號(hào)量g_hFullSemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);g_hEmptySemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);/創(chuàng)建生產(chǎn)者線程createPT();/創(chuàng)建消費(fèi)者
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年軟考網(wǎng)絡(luò)管理員研究試題及答案
- 山東省濟(jì)南市萊蕪區(qū)2025屆數(shù)學(xué)七下期末達(dá)標(biāo)檢測試題含解析
- 會(huì)計(jì)個(gè)人工作計(jì)劃成功案例分享
- 秋季學(xué)期學(xué)生社交能力培養(yǎng)計(jì)劃
- 開展班級(jí)閱讀活動(dòng)的方案計(jì)劃
- 網(wǎng)絡(luò)架構(gòu)審計(jì)的必要性及試題及答案
- 供應(yīng)鏈管理優(yōu)化計(jì)劃
- 前臺(tái)文員專業(yè)知識(shí)更新計(jì)劃
- 理解網(wǎng)絡(luò)協(xié)議與試題及答案指導(dǎo)
- 2024年上海建橋?qū)W院輔導(dǎo)員考試真題
- 2025甘肅陜煤集團(tuán)韓城煤礦招聘250人筆試參考題庫附帶答案詳解
- 2025-2030年中國溫泉特色酒店行業(yè)市場深度調(diào)研及發(fā)展趨勢與投資前景預(yù)測研究報(bào)告
- 2025江蘇中考:歷史高頻考點(diǎn)
- 家政合伙合同協(xié)議書
- 機(jī)械設(shè)備產(chǎn)品質(zhì)量保證承諾書范文
- 《智能安防系統(tǒng)》課件
- 安監(jiān)考試試題及答案
- 【綏化】2025年黑龍江綏化市“市委書記進(jìn)校園”企事業(yè)單位引才1167人筆試歷年典型考題及考點(diǎn)剖析附帶答案詳解
- 合肥市2025屆高三年級(jí)5月教學(xué)質(zhì)量檢測(合肥三模)歷史試題+答案
- 肯德基假期兼職合同協(xié)議
- 貨運(yùn)司機(jī)測試題及答案
評(píng)論
0/150
提交評(píng)論