




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、學(xué) 號:0121010340621課程設(shè)計題目進(jìn)程同步模擬設(shè)計生產(chǎn)者和消費(fèi)者問題學(xué)院計算機(jī)科學(xué)與技術(shù)學(xué)院專業(yè)計算機(jī)科學(xué)與技術(shù)專業(yè)班級1006 班姓名丁探指導(dǎo)教師劉洪星2013 年 1 月 17 日課程設(shè)計任務(wù)書學(xué)生姓名: 丁探 專業(yè)班級: 計算機(jī) 1006 指導(dǎo)教師: 劉洪星 工作單位: 計算機(jī)科學(xué)與技術(shù)學(xué)院 題 目 : 進(jìn)程同步模擬設(shè)計 生產(chǎn)者和消費(fèi)者問題初始條件:1預(yù)備內(nèi)容:閱讀操作系統(tǒng)的進(jìn)程管理章節(jié)內(nèi)容,對進(jìn)程的同步和互斥,以及信 號量機(jī)制度有深入的理解。2實(shí)踐準(zhǔn)備:掌握一種計算機(jī)高級語言的使用。要求完成的主要任務(wù) : (包括課程設(shè)計工作量及其技術(shù)要求, 以及說明書撰寫等具體要求)1模擬
2、用信號量機(jī)制實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者問題。2設(shè)計報告內(nèi)容應(yīng)說明: 課程設(shè)計目的與功能; 需求分析,數(shù)據(jù)結(jié)構(gòu)或模塊說明 ( 功能與框圖 ); 源程序的主要部分; 運(yùn)行結(jié)果與運(yùn)行情況分析; 自我評價與總結(jié):i)你認(rèn)為你完成的設(shè)計哪些地方做得比較好或比較出色; ii)什么地方做得不太好,以后如何改正;iii )從本設(shè)計得到的收獲(在編寫,調(diào)試,執(zhí)行過程中的經(jīng)驗(yàn)和教訓(xùn)) ;iv )完成本題是否有其他的其他方法(如果有,簡要說明該方法) ; v)對實(shí)驗(yàn)題的評價和改進(jìn)意見,請你推薦設(shè)計題目。時間安排:設(shè)計安排一周:周 1、周 2:完成程序分析及設(shè)計。周 2 、周 3:完成程序調(diào)試及測試。周 4 、周 5:驗(yàn)收、
3、撰寫課程設(shè)計報告。注意事項:嚴(yán)禁抄襲,一旦發(fā)現(xiàn),抄與被抄的一律按 0 分記)指導(dǎo)教師簽名:年月日系主任(或責(zé)任教師)簽名:年月日1、需求分析 42、功能設(shè)計 53、源程序 84、運(yùn)行結(jié)果 135、總 結(jié) 166、參考文獻(xiàn) 16生產(chǎn)者消費(fèi)者問題1. 需求分析1.1 問題描述:一組生產(chǎn)者向一組消費(fèi)者提供消息,它們共享一個有界緩沖區(qū)n,生產(chǎn)者向其中投放消息,消費(fèi)者從中取得消息。1.2 規(guī)則: 對于生產(chǎn)者進(jìn)程:產(chǎn)生一個數(shù)據(jù),當(dāng)要送入緩沖區(qū)時,要檢查緩沖區(qū)是否已滿,若 未滿,則可將數(shù)據(jù)送入緩沖區(qū),并通知消費(fèi)者進(jìn)程;否則,等待; 對于消費(fèi)者進(jìn)程:當(dāng)它去取數(shù)據(jù)時,要看緩沖區(qū)中是否有數(shù)據(jù)可取,若有則取走一 個
4、數(shù)據(jù),并通知生產(chǎn)者進(jìn)程,否則,等待。緩沖區(qū)是個臨界資源, 因此, 諸進(jìn)程對緩沖區(qū)的操作程序是一個共享臨界區(qū),所以,還有個互斥的問題。1.3 信號燈設(shè)置 :兩個同步信號燈 -empty :表示空緩沖區(qū)的數(shù)目,初值為有界緩沖區(qū)的大小n;full : 表示滿緩沖區(qū) (即信息 )的數(shù)目,其初值為 0; 一個互斥信號燈 -mutex :互斥信號燈,初值為 1。1.4 同步描述:1.5 程序描述:main( )int full=0 ;*/int empty=n ;*/int mutex=1 ; 對有界緩沖區(qū)進(jìn)行操作的互斥信號燈 */cobeginp1 ( ); p2( );coendp1()while(
5、生產(chǎn)未完成 )生產(chǎn)一個產(chǎn)品 ;p(empty);p(mutex);送一個產(chǎn)品到有界緩沖區(qū) ;v(mutex) ;v(full);p2( )while( 還要繼續(xù)消費(fèi) )p(full) ;p(mutex) ;從有界緩沖區(qū)中取產(chǎn)品;v(mutex) ;v(empty) ;消費(fèi)一個產(chǎn)品;1.6 C+語言程序模擬用信號量機(jī)制實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者問題:本次課程設(shè)計主要通過 C+模擬信號量制中各個進(jìn)程,及各進(jìn)程之間的互斥、同步關(guān) 系,來實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者問題。2. 功能設(shè)計2.1 設(shè)計目的:通過實(shí)驗(yàn)?zāi)M生產(chǎn)者和消費(fèi)者之間的關(guān)系,了解并掌握他們之間的關(guān)系及其原理。由 此增加對進(jìn)程同步的問題的了解。具體如下 :
6、1 )掌握基本的同步互斥算法,理解生產(chǎn)者和消費(fèi)者模型;2)了解 windows 中多線程(多進(jìn)程)的并發(fā)執(zhí)行機(jī)制,線程(進(jìn)程)間的同步和互斥;3 )學(xué)習(xí)使用 windows 中基本的同步對象,掌握相應(yīng)的 API 。2.2 設(shè)計功能 :反應(yīng)利用模擬用信號量機(jī)制實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者問題: 通過用戶控制取進(jìn)程和放進(jìn)程, 生產(chǎn)者和消費(fèi)者問題中所涉及的進(jìn)程的同步與互斥。2.3 數(shù)據(jù)流程圖:2、消費(fèi)者2.4 模塊說明:const unsigned short SIZE_OF_BUFFER = 10; / 緩沖區(qū)長度 unsigned short ProductID = 0;/產(chǎn)品號unsignedshort
7、 ConsumeID =0; / 將被消耗的產(chǎn)品號unsignedshort in = 0;/產(chǎn)品進(jìn)緩沖區(qū)時的緩沖區(qū)下標(biāo)unsignedshort out = 0;/產(chǎn)品出緩沖區(qū)時的緩沖區(qū)下標(biāo)int g_bufferSIZE_OF_BUFFER;/緩沖區(qū)是個循環(huán)隊列bool g_continue = true;/控制程序結(jié)束HANDLEg_hMutex;/用于線程間的互斥HANDLEg_hFullSemaphore;/當(dāng)緩沖區(qū)滿時迫使生產(chǎn)者等待HANDLEg_hEmptySemaphore;/當(dāng)緩沖區(qū)空時迫使消費(fèi)者等待DWORD WINAPI Producer(LPVOID);/生產(chǎn)者線程/消
8、費(fèi)者線程DWORD WINAPI Consumer(LPVOID);3、源程序#include #include 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)品進(jìn)緩沖區(qū)時的緩沖區(qū)下標(biāo),用于記錄生產(chǎn)者的指針位置 unsig
9、ned short out = 0;/ 產(chǎn)品出緩沖區(qū)時的緩沖區(qū)下標(biāo),用于記錄消費(fèi)者的指針位置 bool g_continue = 1;/ 控制程序運(yùn)行: 1 表示繼續(xù)運(yùn)行, 0 表示停止運(yùn)行HANDLE g_hMutex;/ 線程間的互斥信 號量HANDLE g_hFullSemaphore;/ 資源信號量:緩沖區(qū)滿HANDLE g_hEmptySemaphore;/ 資源信號量:緩沖區(qū)空DWORD WINAPI Producer(LPVOID);/ 生產(chǎn)者線程DWORD WINAPI Consumer(LPVOID);/ 消費(fèi)者線程const unsigned short PRODUCERS
10、_COUNT=4;/ 生產(chǎn)者的個數(shù)const unsigned short CONSUMERS_COUNT=3;/ 消費(fèi)者的個數(shù)const unsigned short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;/ 總線程數(shù)HANDLE hThreadsPRODUCERS_COUNT;/ 各線程的 handleDWORD producerIDCONSUMERS_COUNT;/ 生產(chǎn)者線程的標(biāo)識符DWORD consumerIDTHREADS_COUNT;/ 消費(fèi)者線程的標(biāo)識符/*生產(chǎn)一個產(chǎn)品開始*/生產(chǎn)一個產(chǎn)品,輸出其 ID 號void Pro
11、duce()g_bufferi;g_bufferi;生產(chǎn)者 ;/ 輸出生產(chǎn)者的指針位置消費(fèi)者 ;/ 輸出消費(fèi)者的指針位置std:coutstd:endl;std:cerr 生產(chǎn)一個產(chǎn)品 : +ProductID;std:coutstd: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:cerrstd:endl;std:cout 緩沖區(qū) 產(chǎn)品 生產(chǎn)者 / 消費(fèi)者 std:en
12、dl; /新產(chǎn)品放入緩沖區(qū)后,輸出緩沖區(qū)當(dāng)前的狀態(tài)for(int i=0;iSIZE_OF_BUFFER;+i)/輸出緩沖區(qū)下標(biāo)if (i10) std:couti elsestd:couti if(i=in) if(g_bufferi10) std:cout else std:cout std:cout - if(i=out) if(g_bufferi10) std:cout else std:cout std:cout - std:coutstd:endl;/* 把新生產(chǎn)的產(chǎn)品放入緩沖區(qū)結(jié)束 */* 消費(fèi)一個產(chǎn)品開始 */void Consume()/ 消費(fèi)一個產(chǎn)品 std:coutstd
13、:endl; std:cerr 消費(fèi)一個產(chǎn)品 : ConsumeID;std:coutstd:endl;/* 消費(fèi)一個產(chǎn)品結(jié)束 */* 從緩沖區(qū)中取出一個產(chǎn)品開始 */從緩沖區(qū)中取出一個產(chǎn)品 void Take()std:coutstd:endl;std:cerr 從緩沖區(qū)取出一個產(chǎn)品ConsumeID=g_bufferout; out=(out+1)%SIZE_OF_BUFFER; std:cerrstd:endl; std:coutstd:endl;生產(chǎn)者 / 消費(fèi)者 std:endl;std:cout 緩沖區(qū) 產(chǎn)品/取出一個產(chǎn)品后,輸出緩沖區(qū)當(dāng)前的狀態(tài) for(int i=0;iSIZE
14、_OF_BUFFER;+i) /輸出緩沖區(qū)下標(biāo)if(i10)g_bufferi;g_bufferi;std:coutielsestd:coutiif(i=in)if(g_bufferi10)std:cout elsestd:cout生產(chǎn)者 ;/ 輸出生產(chǎn)者的指針位置std:cout -if(i=out) if(g_bufferi10) std:cout ;elsestd:cout ; std:cout - 消費(fèi)者 ;/ 輸出消費(fèi)者的指針位置10 std:coutstd:endl;/* 從緩沖區(qū)中取出一個產(chǎn)品結(jié)束 */* 生產(chǎn)者線程開始 */生產(chǎn)者線程DWORD WINAPI Producer(
15、LPVOID lpPara) while(g_continue) /資源信號量的 P 操作 WaitForSingleObject(g_hFullSemaphore,INFINITE);/互斥信號量的 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
16、;/* 生產(chǎn)者線程結(jié)束 */* 消費(fèi)者線程開始 */消費(fèi)者線程DWORD WINAPI Consumer(LPVOID lpPara) while(g_continue) /資源信號量的 P 操作 WaitForSingleObject(g_hEmptySemaphore,INFINITE); /互斥信號量的 P 操作WaitForSingleObject(g_hMutex,INFINITE); /從緩沖區(qū)中取出一個產(chǎn)品 Take();/消費(fèi)一個產(chǎn)品Consume();11Sleep(2000);/互斥信號量的 V 操作ReleaseMutex(g_hMutex);/資源信號量的 V 操作Re
17、leaseSemaphore(g_hFullSemaphore,1,NULL);return 0;/* 消費(fèi)者線程結(jié)束 */* 創(chuàng)建生產(chǎn)者線程開始 */void createPT()/ 創(chuàng)建生產(chǎn)者線程for(int i=0;iPRODUCERS_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;jCONSUMER
18、S_COUNT;+j)hThreadsPRODUCERS_COUNT+j=CreateThread(NULL,0,Consumer,NULL,0,&consume rIDj);if (hThreadsj=NULL)g_continue=0;/* 創(chuàng)建消費(fèi)者線程結(jié)束 */* 主函數(shù)開始 */void main()/創(chuàng)建互斥信號量g_hMutex=CreateMutex(NULL,FALSE,NULL);/創(chuàng)建資源信號量g_hFullSemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,12NULL); g_hEmptySemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL); /創(chuàng)建生產(chǎn)者線程 createPT();/創(chuàng)建消費(fèi)者線程 createCT();/不按回車鍵的話程序會一直運(yùn)行下去 while(g_continue)/按回車鍵終止程序 if(getchar() g_continue = 0;/* 主函數(shù)結(jié)束 */4、運(yùn)行結(jié)果:1314155、總結(jié):本課程設(shè)計是學(xué)生學(xué)習(xí)完 計算機(jī)操作系統(tǒng) 課程后, 進(jìn)行的一次全面的綜合訓(xùn)練
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電商選品經(jīng)理崗位面試問題及答案
- 智能網(wǎng)聯(lián)汽車測試工程師崗位面試問題及答案
- 直播電商選品總監(jiān)崗位面試問題及答案
- 2025屆廣東省重點(diǎn)名校高一下化學(xué)期末考試試題含解析
- 2025屆山西省榆社中學(xué)高一化學(xué)第二學(xué)期期末復(fù)習(xí)檢測模擬試題含解析
- 2025屆福建省福州教育學(xué)院附屬中學(xué)高一化學(xué)第二學(xué)期期末學(xué)業(yè)質(zhì)量監(jiān)測模擬試題含解析
- 山東省普通高中2025屆化學(xué)高一下期末經(jīng)典模擬試題含解析
- 2025屆廣東省師大附中化學(xué)高一下期末統(tǒng)考試題含解析
- 農(nóng)業(yè)植保越冬管理辦法
- 合肥基金投資管理辦法
- 股東出資情況表模板
- 甘肅省天水市甘谷縣第一中學(xué)2025屆物理高一下期末質(zhì)量檢測試題含解析
- GB/T 4074.5-2024繞組線試驗(yàn)方法第5部分:電性能
- 熱水袋燙傷RCA分析2022
- 業(yè)主提前裝修免責(zé)協(xié)議
- 2024年上海市計算機(jī)一級考試復(fù)習(xí)題庫(含答案)
- 新生兒吸痰護(hù)理課件
- 礦井通風(fēng)工技師(高級技師)理論考試題庫
- 《急救知識普及》課件
- 《應(yīng)急救援知識》課件
- 智慧物業(yè)管理方案
評論
0/150
提交評論