




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、操作系統(tǒng)實驗報告生產(chǎn)者和消費者的問題一、 實驗?zāi)康?. 掌握基本的同步與互斥的算法,理解基本的生產(chǎn)者與消費者的模型。2. 學(xué)習(xí)使用Windows 2000/XP中基本的同步對象,掌握相關(guān)的API的使用方法。3. 了解Windows 2000/XP中多線程的并發(fā)執(zhí)行機(jī)制,線程間的同步和互斥。二、 實驗的內(nèi)容及其要求1. 實驗內(nèi)容以生產(chǎn)者/消費者模型為根據(jù),在Windows 2000環(huán)境下創(chuàng)建一個控制臺進(jìn)程,在改進(jìn)程中創(chuàng)建n個線程模擬生產(chǎn)者和消費者,實現(xiàn)進(jìn)程(線程)的同步與互斥。2實驗要求學(xué)習(xí)并理解生產(chǎn)者/消費者模型及其同步/互斥規(guī)則學(xué)習(xí)了解Windows同步對象及其特性熟悉實驗環(huán)境,掌握相關(guān)AP
2、I的使用方法設(shè)計程序,實現(xiàn)生產(chǎn)者/消費者進(jìn)程(線程)的同步與互斥提交實驗報告三、 實驗的時間安排1 實驗前,先到圖書館或上網(wǎng)百度了解有關(guān)生產(chǎn)者/消費者模型的相關(guān)知識,建立生產(chǎn)者/消費者模型的基本概念。2 利用13周、15周、17周的上機(jī)時間編寫和調(diào)試程序代碼。3 利用其他課余時間來分析實驗的最終結(jié)果并完成相關(guān)的實驗報告。四、 實驗的環(huán)境1. 硬件條件:普通計算機(jī)一臺2. 軟件條件:操作系統(tǒng):Windows 2000/XP開發(fā)語言:VC+本實驗是在Windows 2000+VC6.0環(huán)境下實現(xiàn)的,利用Windows SDK提供的系統(tǒng)接口(API)完成程序的功能。實驗在Windows下安裝VC后進(jìn)
3、行,因為VC是一個集成開發(fā)環(huán)境,其中包含了Windows SDK所有工具和定義,所以安裝了VC后就不用特意安裝SDK了。實驗中所用的API(應(yīng)用程序接口),是操作系統(tǒng)提供的用來進(jìn)行應(yīng)用程序設(shè)計的系統(tǒng)功能接口。要使用這些API,需要包含對這些函數(shù)進(jìn)行說明的SDK頭文件,最常見的就是windows.h。一些特殊的API調(diào)用還需要包含其他的頭文件。五、 正文1 程序結(jié)構(gòu)圖:2.數(shù)據(jù)結(jié)構(gòu):(1)用一個整型數(shù)組Buffer_Critical來代表緩沖區(qū)。不管是生產(chǎn)產(chǎn)品還是對已有產(chǎn)品的消費都需要訪問改組緩沖區(qū)。(2)在程序中用一個自定義結(jié)構(gòu)ThreadInfo記錄一條線程的信息,即將測試用例文件中的一行信
4、息記錄下來,用于程序創(chuàng)建相應(yīng)的生產(chǎn)者或者消費者。由于要創(chuàng)建多個線程,所以程序中使用了一個ThreadInfo結(jié)構(gòu)的數(shù)組Thread_Info。(3)在實現(xiàn)本程序的消費生產(chǎn)模型時,具體地通過如下同步對象實現(xiàn)互斥:設(shè)一個互斥量h_mutex,以實現(xiàn)生產(chǎn)者在查詢和保留緩沖區(qū)內(nèi)的下一個空位置時進(jìn)行互斥。每一個生產(chǎn)者用一個信號量與其消費者同步,通過設(shè)置h_SemaphoreMAX_THREAD_NUM信號量數(shù)組實現(xiàn),該組信號量用于表示相應(yīng)產(chǎn)品已生產(chǎn)。同時用一個表示空緩沖區(qū)數(shù)目的信號量empty_semaphore進(jìn)行類似的同步,指示緩沖區(qū)中是否存在空位置,以便開始生產(chǎn)下一個產(chǎn)品。每一個緩沖區(qū)用一個同步對
5、象實現(xiàn)該緩沖區(qū)上消費者之間的互斥,這通過設(shè)置臨界區(qū)對象數(shù)組PC_CriticalMAX_BUFFER_NUM實現(xiàn)。3.實驗步驟:(1)打開VC,選擇菜單項File->New,選擇Projects選項卡并建立一個名為R_WP1的win32 console application工程,創(chuàng)建時注意指定創(chuàng)建該工程的目錄。(2)在工程中創(chuàng)建源文件R_WP1.cpp:選擇菜單項Project->Add to project->Files,此時將打開一個新窗口,在其中的“文件名”輸入欄中輸入自己想要創(chuàng)建的文件名,這里是R_WP1.cpp;接著詢問是否創(chuàng)建新文件時回答“yes”。通過Work
6、space->Source Files打開該文件,在其中編輯源文件并保存。(3)通過調(diào)用菜單項Build->Rebuild all進(jìn)行編譯連接,可以在指定的工程目錄下得到debug->R_WP1.exe程序,然后把給定的test.txt文件存入該debug目錄下,就可以在控制臺進(jìn)入該debug目錄運行程序了。需要強(qiáng)調(diào)的是:在創(chuàng)建數(shù)據(jù)文件時,由于涉及文件的格式問題,最好在記事本中手工逐個輸入數(shù)據(jù),而不要用復(fù)制和粘貼數(shù)據(jù)。4.實驗源代碼:/*R_WP1.cpp*#include<windows.h>#include<fstream.h>#include&l
7、t;stdio.h>#include<string>#include<conio.h>/定義一些常量/本程序允許的最大臨界區(qū)數(shù)#define MAX_BUFFER_NUM 10/秒到微秒的乘法因子#define INTE_PER_SEC 1000/本程序允許的生產(chǎn)和消費線程的總數(shù)#define MAX_THREAD_NUM 64/定義一個結(jié)構(gòu),記錄在測試文件中指定的每一個線程的參數(shù)struct ThreadInfoint serial;char entity;double delay;int thread_requestMAX_THREAD_NUM;int n_r
8、equest;CRITICAL_SECTION PC_CriticalMAX_BUFFER_NUM;int Buffer_CriticalMAX_BUFFER_NUM;HANDLE h_ThreadMAX_BUFFER_NUM;ThreadInfo Thread_InfoMAX_THREAD_NUM;HANDLE empty_semaphore;HANDLE h_mutex;DWORD n_Thread=0;DWORD n_Buffer_or_Critical;HANDLE h_SemaphoreMAX_THREAD_NUM;void Produce(void *p);void Consume
9、(void *p);bool IfInOtherRequest(int);int FindProducePosition();int FindBufferPositon(int);int main(void) DWORD wait_for_all; ifstream inFile; for(int i=0;i<MAX_THREAD_NUM;i+) Buffer_Criticali=-1; for(int j=0;j<MAX_THREAD_NUM;j+) for(int k=0;k<MAX_THREAD_NUM;k+) Thread_Infoj.thread_requestk=
10、-1; Thread_Infoj.n_request=0;for(i=0;i<MAX_BUFFER_NUM;i+) InitializeCriticalSection(&PC_Criticali);inFile.open("d:test.txt");inFile>>n_Buffer_or_Critical;inFile.get();printf("輸出文件是:n");printf("%dn",(int)n_Buffer_or_Critical);while(inFile) inFile>>Thre
11、ad_Infon_Thread.serial; inFile>>Thread_Infon_Thread.entity; inFile>>Thread_Infon_Thread.delay; char c; inFile.get(c); while(c!='n'&&!inFile.eof() inFile>>Thread_Infon_Thread.thread_requestThread_Infon_Thread.n_request+; inFile.get(c); n_Thread+;for(j=0;j<(int)n_T
12、hread;j+) int Temp_serial=Thread_Infoj.serial; char Temp_entity=Thread_Infoj.entity; double Temp_delay=Thread_Infoj.delay; printf("n thread%2d %c %f",Temp_serial,Temp_entity,Temp_delay); int Temp_request=Thread_Infoj.n_request; for(int k=0;k<Temp_request;k+) printf("%d",Thread
13、_Infoj.thread_requestk); cout<<endl; printf("nn"); empty_semaphore=CreateSemaphore (NULL,n_Buffer_or_Critical,n_Buffer_or_Critical, "semaphore_for_empty"); h_mutex=CreateMutex(NULL,FALSE,"mutex_for_update"); for(j=0;j<(int)n_Thread;j+) std:string lp="semap
14、hore_for_produce_" int temp=j; while(temp) char c=(char)(temp%10); lp+=c; temp/=10; h_Semaphorej+1=CreateSemaphore(NULL,0,n_Thread,lp.c_str();for(i=0;i<(int)n_Thread;i+) if(Thread_Infoi.entity='P')h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Produce), &(Thread_Infoi),0,
15、NULL);elseh_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(Consume), &(Thread_Infoi),0,NULL); wait_for_all=WaitForMultipleObjects(n_Thread,h_Thread,TRUE,-1);printf("Press any key to quit!n");_getch();return 0;bool IfInOtherRequest(int req) for(int i=0;i<n_Thread;i+) for(int j=
16、0;j<Thread_Infoi.n_request;j+) if(Thread_Infoi.thread_requestj=req) return TRUE; return FALSE;int FindProducePosition() int EmptyPosition; for(int i=0;i<n_Buffer_or_Critical;i+) if(Buffer_Criticali=-1) EmptyPosition=i; Buffer_Criticali=-2; break; return EmptyPosition;int FindBufferPosition(int
17、 ProPos) int TempPos; for(int i=0;i<n_Buffer_or_Critical;i+) if(Buffer_Criticali=ProPos) TempPos=i; break; return TempPos;void Produce(void *p) DWORD wait_for_semaphore,wait_for_mutex,m_delay; int m_serial; m_serial=(ThreadInfo*)(p)->serial; m_delay=( DWORD)(ThreadInfo*)(p)->delay *INTE_PER
18、_SEC); Sleep(m_delay); printf("Producer %2d sends the produce require.n",m_serial); wait_for_semaphore=WaitForSingleObject(h_mutex,-1); int ProducePos=FindProducePosition(); ReleaseMutex(h_mutex); printf("Producer %2d begin to produce at position %2d.n",m_serial, ProducePos); Buf
19、fer_CriticalProducePos=m_serial; printf("Producer %2d finish producing :n",m_serial); printf("position%2d:%3dn",ProducePos,Buffer_CriticalProducePos); ReleaseSemaphore(h_Semaphorem_serial,n_Thread,NULL);void Consume(void *p) DWORD wait_for_semaphore,m_delay; int m_serial,m_reques
20、tNum; int m_thread_requestMAX_THREAD_NUM; m_serial=(ThreadInfo*)(p)->serial; m_delay=(DWORD)(ThreadInfo*)(p)->delay *INTE_PER_SEC); m_requestNum=(ThreadInfo*)(p)->n_request; for(int i=0;i<m_requestNum;i+) m_thread_requesti=(ThreadInfo*)(p)->thread_requesti; Sleep(m_delay); for(i=0;i&l
21、t;m_requestNum;i+) printf("Consumer %2d request to consumer %2d productn",m_serial,m_thread_requesti);wait_for_semaphore=WaitForSingleObject(h_Semaphorem_thread_requesti,-1); int BufferPos=FindBufferPosition(m_thread_requesti); EnterCriticalSection(&PC_CriticalBufferPos); printf("Comsumer %2d begin to consume %2d product n",m_serial,m_thread_requesti); (ThreadInfo*)(p)->thread_requesti=-1; if(!IfInOtherRequest(m_thread_requesti)Buffer_Critica
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 202520加盟連鎖店合同協(xié)議樣本
- 2024年九月幼兒園駕駛員文明禮儀服務(wù)標(biāo)準(zhǔn)聘用協(xié)議
- 2025二手設(shè)備租賃合同范本
- oem啤酒合同樣本
- 二零二五工地門衛(wèi)勞動合同范文
- 服裝店鋪轉(zhuǎn)讓協(xié)議范例二零二五年
- 電梯臨時使用協(xié)議書范文
- 付款保密協(xié)議合同樣本
- 預(yù)售商品房抵押合同二零二五年
- 二零二五版公租房承租資格確認(rèn)
- 2025年山東出版集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 《市域智慧共享中藥房建設(shè)指南》
- 醫(yī)療器械進(jìn)院流程
- 2025年陜西神東煤炭集團(tuán)招聘筆試參考題庫含答案解析
- 民宿的經(jīng)營成本分析報告
- 2025 預(yù)應(yīng)力混凝土鋼管桁架疊合板
- 2025年上海青浦新城發(fā)展(集團(tuán))限公司自主招聘9名高頻重點提升(共500題)附帶答案詳解
- 廢酸處置合同協(xié)議
- 2024年吉安職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫附答案
- 湖南省對口招生考試醫(yī)衛(wèi)專業(yè)試題(2024-2025年)
- 公共危機(jī)管理(本)-第五次形成性考核-國開(BJ)-參考資料
評論
0/150
提交評論