版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、操作系統(tǒng)課程設(shè)計(jì)報(bào)告專業(yè) 計(jì)算機(jī)科學(xué)與技術(shù)學(xué)生姓名丁可班級(jí)B計(jì)123班學(xué)號(hào)1210704314指導(dǎo)教師李先鋒完成日期2015年11月20日信息工程學(xué)院題目:生產(chǎn)者-消費(fèi)者問題的模擬實(shí)現(xiàn)一、設(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)手能力。二、設(shè)計(jì)內(nèi)容1、概述用進(jìn)程同步方法解決“生產(chǎn)者-消費(fèi)者”問題,C或C+語言實(shí)現(xiàn)。1、設(shè)計(jì)目的通過研究進(jìn)程并發(fā)和信號(hào)量機(jī)制,實(shí)現(xiàn)生產(chǎn)者-消費(fèi)者問題的并發(fā)控制。2、設(shè)計(jì)要求1)每個(gè)生產(chǎn)者和消費(fèi)者對(duì)有界緩沖區(qū)進(jìn)行操作后,即時(shí)顯示有界緩
2、沖區(qū)的全部?jī)?nèi)容,當(dāng)前指針位置和生產(chǎn)者/消費(fèi)者進(jìn)程的標(biāo)識(shí)符。說明:有界緩沖區(qū)(提示:有界緩沖區(qū)可用數(shù)組實(shí)現(xiàn))內(nèi)設(shè)有20個(gè)存儲(chǔ)單元,放入/取出的數(shù)據(jù)項(xiàng)設(shè)定為1-20這20個(gè)整型數(shù)。2)生產(chǎn)者和消費(fèi)者各有兩個(gè)以上。3)多個(gè)生產(chǎn)者或多個(gè)消費(fèi)者之間須有共享對(duì)緩沖區(qū)進(jìn)行操作的函數(shù)代碼。2、設(shè)計(jì)原理在同一個(gè)進(jìn)程地址空間內(nèi)執(zhí)行的兩個(gè)線程生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個(gè)空緩沖區(qū)中供消費(fèi)者線程消費(fèi)。消費(fèi)者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。當(dāng)生產(chǎn)者線程生產(chǎn)物品時(shí),如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費(fèi)者線程釋放出一個(gè)空緩沖區(qū)。當(dāng)消費(fèi)者線程消費(fèi)物品時(shí),如果沒有滿的緩沖區(qū),那么消費(fèi)者線程將被阻塞
3、,直到新的物品被生產(chǎn)出來。3、詳細(xì)設(shè)計(jì)及編碼定義兩個(gè)信號(hào)量HANDLE g_hFullSemaphore;/資源信號(hào)量:緩沖區(qū)滿HANDLE g_hEmptySemaphore;/資源信號(hào)量:緩沖區(qū)空unsigned short in = 0;/用于記錄生產(chǎn)者的指針位置unsigned short out = 0;/用于記錄消費(fèi)者的指針位置HANDLE g_hMutex;/線程間的互斥信號(hào)量生產(chǎn)者進(jìn)程while(TRUE) 生產(chǎn)一個(gè)產(chǎn)品; P(g_hEmptySemaphore)
4、; P(mutex1); 產(chǎn)品送往buffer(in); in=(in+1)mod n; V(mutex1); V(g_hFullSemaphore); 消費(fèi)者進(jìn)程while(TRUE) P(g_hFullSemaphore); &
5、#160; P(mutex2); 從buffer(out)中取出產(chǎn)品; out=(out+1)mod n; V(mutex2); V(g_hEmptySemaphore);(算法流程圖、編程及程序注釋等)主要的方法:4、運(yùn)行結(jié)果分析1、運(yùn)行示例在 c+中運(yùn)行源程序 ,程序主界面截圖.按回車及申請(qǐng)資源和緩沖區(qū)進(jìn)行 p 操作和申請(qǐng)互斥(生產(chǎn)者和消費(fèi)者都是2個(gè))(運(yùn)行界面截圖、界面說明、輸入輸出數(shù)據(jù)說明和分析等)附錄代碼:#include <wind
6、ows.h>#include <iostream>const unsigned short SIZE_OF_BUFFER = 20;/有界緩沖區(qū)長(zhǎng)度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ū)
7、下標(biāo)?用于記錄消費(fèi)者的指針位置 bool g_continue = 1;/控制程序運(yùn)行:1 表示繼續(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=2;/生產(chǎn)者的個(gè)數(shù)const unsigned short CON
8、SUMERS_COUNT=2;/消費(fèi)者的個(gè)數(shù)const unsigned short THREADS_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í)符/*-程序提示信息開始-*/void info()/程序提示信息std:cout<<"* - - - - - - - - - - - - -
9、 - - - - - - - - - - *"<<std:endl;std:cout<<"| 課程設(shè)計(jì)課題 : 生產(chǎn)者-消費(fèi)者問題的模擬實(shí)現(xiàn) |"<<std:endl;std:cout<<"| 指 導(dǎo) 老 師 : 李先鋒 |"<<std:endl;std:cout<<"| 學(xué) 生 : 丁可 |"<<std:endl;std:cout<<"| 班 級(jí) : B計(jì)123班 |"<<std:endl;std
10、:cout<<"* - - - - - - - - - - - - - - - - - - - - - - - *"<<std:endl;std:cout<<" =按回車開始該程序 "<<std:endl;getchar();/*-程序提示信息結(jié)束-*/*-生產(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:cou
11、t<<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)
12、/輸出緩沖區(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<1
13、0)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)
14、一個(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
15、;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(
16、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,I
17、NFINITE);/互斥信號(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)量的
18、 P 操作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(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)建消費(fèi)者線程開始-*/void createCT()/創(chuàng)建消費(fèi)者線程for (int j=0;j<CONSUMERS_COUNT;+j)hThrea
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版對(duì)講門品牌授權(quán)與市場(chǎng)推廣合同2篇
- 教培機(jī)構(gòu)2025年度27份合同協(xié)議(教育版權(quán)保護(hù))2篇
- 二零二五版住宅小區(qū)配套設(shè)施使用權(quán)轉(zhuǎn)讓合同3篇
- 二零二五年度采砂廠承包生態(tài)補(bǔ)償金支付合同范本3篇
- 2024蔬菜種植項(xiàng)目承包合同協(xié)議2篇
- 二零二五版工程招投標(biāo)與合同管理專家指導(dǎo)與案例分析3篇
- 工業(yè)廠房結(jié)構(gòu)檢測(cè)與2025年度注漿加固合同3篇
- 展會(huì)安全保障合同(2篇)
- 二零二五年度餐飲業(yè)食品安全標(biāo)準(zhǔn)制定合同3篇
- 二零二五版鋼結(jié)構(gòu)工程專用材料采購(gòu)合同范本5篇
- 小學(xué)四年級(jí)數(shù)學(xué)知識(shí)點(diǎn)總結(jié)(必備8篇)
- GB/T 893-2017孔用彈性擋圈
- GB/T 11072-1989銻化銦多晶、單晶及切割片
- GB 15831-2006鋼管腳手架扣件
- 醫(yī)學(xué)會(huì)自律規(guī)范
- 商務(wù)溝通第二版第4章書面溝通
- 950項(xiàng)機(jī)電安裝施工工藝標(biāo)準(zhǔn)合集(含管線套管、支吊架、風(fēng)口安裝)
- 微生物學(xué)與免疫學(xué)-11免疫分子課件
- 《動(dòng)物遺傳育種學(xué)》動(dòng)物醫(yī)學(xué)全套教學(xué)課件
- 弱電工程自檢報(bào)告
- 民法案例分析教程(第五版)完整版課件全套ppt教學(xué)教程最全電子教案
評(píng)論
0/150
提交評(píng)論