![操作系統(tǒng)生產(chǎn)者與消費(fèi)者問(wèn)題實(shí)驗(yàn)報(bào)告(共9頁(yè))_第1頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/7/3a4e1f48-4ff6-4764-983f-c1514e5b59f6/3a4e1f48-4ff6-4764-983f-c1514e5b59f61.gif)
![操作系統(tǒng)生產(chǎn)者與消費(fèi)者問(wèn)題實(shí)驗(yàn)報(bào)告(共9頁(yè))_第2頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/7/3a4e1f48-4ff6-4764-983f-c1514e5b59f6/3a4e1f48-4ff6-4764-983f-c1514e5b59f62.gif)
![操作系統(tǒng)生產(chǎn)者與消費(fèi)者問(wèn)題實(shí)驗(yàn)報(bào)告(共9頁(yè))_第3頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/7/3a4e1f48-4ff6-4764-983f-c1514e5b59f6/3a4e1f48-4ff6-4764-983f-c1514e5b59f63.gif)
![操作系統(tǒng)生產(chǎn)者與消費(fèi)者問(wèn)題實(shí)驗(yàn)報(bào)告(共9頁(yè))_第4頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/7/3a4e1f48-4ff6-4764-983f-c1514e5b59f6/3a4e1f48-4ff6-4764-983f-c1514e5b59f64.gif)
![操作系統(tǒng)生產(chǎn)者與消費(fèi)者問(wèn)題實(shí)驗(yàn)報(bào)告(共9頁(yè))_第5頁(yè)](http://file3.renrendoc.com/fileroot_temp3/2021-12/7/3a4e1f48-4ff6-4764-983f-c1514e5b59f6/3a4e1f48-4ff6-4764-983f-c1514e5b59f65.gif)
版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、操作系統(tǒng)實(shí)驗(yàn)報(bào)告生產(chǎn)者和消費(fèi)者的問(wèn)題一、 實(shí)驗(yàn)?zāi)康?. 掌握基本的同步與互斥的算法,理解基本的生產(chǎn)者與消費(fèi)者的模型。2. 學(xué)習(xí)使用Windows 2000/XP中基本的同步對(duì)象,掌握相關(guān)的API的使用方法。3. 了解Windows 2000/XP中多線程的并發(fā)執(zhí)行機(jī)制,線程間的同步和互斥。二、 實(shí)驗(yàn)的內(nèi)容及其要求1. 實(shí)驗(yàn)內(nèi)容以生產(chǎn)者/消費(fèi)者模型為根據(jù),在Windows 2000環(huán)境下創(chuàng)建一個(gè)控制臺(tái)進(jìn)程,在改進(jìn)程中創(chuàng)建n個(gè)線程模擬生產(chǎn)者和消費(fèi)者,實(shí)現(xiàn)進(jìn)程(線程)的同步與互斥。2實(shí)驗(yàn)要求學(xué)習(xí)并理解生產(chǎn)者/消費(fèi)者模型及其同步/互斥規(guī)則學(xué)習(xí)了解Windows同步對(duì)象及其特性熟悉實(shí)驗(yàn)環(huán)境,掌握相關(guān)AP
2、I的使用方法設(shè)計(jì)程序,實(shí)現(xiàn)生產(chǎn)者/消費(fèi)者進(jìn)程(線程)的同步與互斥提交實(shí)驗(yàn)報(bào)告三、 實(shí)驗(yàn)的時(shí)間安排1 實(shí)驗(yàn)前,先到圖書(shū)館或上網(wǎng)百度了解有關(guān)生產(chǎn)者/消費(fèi)者模型的相關(guān)知識(shí),建立生產(chǎn)者/消費(fèi)者模型的基本概念。2 利用13周、15周、17周的上機(jī)時(shí)間編寫(xiě)和調(diào)試程序代碼。3 利用其他課余時(shí)間來(lái)分析實(shí)驗(yàn)的最終結(jié)果并完成相關(guān)的實(shí)驗(yàn)報(bào)告。四、 實(shí)驗(yàn)的環(huán)境1. 硬件條件:普通計(jì)算機(jī)一臺(tái)2. 軟件條件:操作系統(tǒng):Windows 2000/XP開(kāi)發(fā)語(yǔ)言:VC+本實(shí)驗(yàn)是在Windows 2000+VC6.0環(huán)境下實(shí)現(xiàn)的,利用Windows SDK提供的系統(tǒng)接口(API)完成程序的功能。實(shí)驗(yàn)在Windows下安裝VC后進(jìn)
3、行,因?yàn)閂C是一個(gè)集成開(kāi)發(fā)環(huán)境,其中包含了Windows SDK所有工具和定義,所以安裝了VC后就不用特意安裝SDK了。實(shí)驗(yàn)中所用的API(應(yīng)用程序接口),是操作系統(tǒng)提供的用來(lái)進(jìn)行應(yīng)用程序設(shè)計(jì)的系統(tǒng)功能接口。要使用這些API,需要包含對(duì)這些函數(shù)進(jìn)行說(shuō)明的SDK頭文件,最常見(jiàn)的就是windows.h。一些特殊的API調(diào)用還需要包含其他的頭文件。五、 正文1 程序結(jié)構(gòu)圖:2.數(shù)據(jù)結(jié)構(gòu):(1)用一個(gè)整型數(shù)組Buffer_Critical來(lái)代表緩沖區(qū)。不管是生產(chǎn)產(chǎn)品還是對(duì)已有產(chǎn)品的消費(fèi)都需要訪問(wèn)改組緩沖區(qū)。(2)在程序中用一個(gè)自定義結(jié)構(gòu)ThreadInfo記錄一條線程的信息,即將測(cè)試用例文件中的一行信
4、息記錄下來(lái),用于程序創(chuàng)建相應(yīng)的生產(chǎn)者或者消費(fèi)者。由于要?jiǎng)?chuàng)建多個(gè)線程,所以程序中使用了一個(gè)ThreadInfo結(jié)構(gòu)的數(shù)組Thread_Info。(3)在實(shí)現(xiàn)本程序的消費(fèi)生產(chǎn)模型時(shí),具體地通過(guò)如下同步對(duì)象實(shí)現(xiàn)互斥:設(shè)一個(gè)互斥量h_mutex,以實(shí)現(xiàn)生產(chǎn)者在查詢和保留緩沖區(qū)內(nèi)的下一個(gè)空位置時(shí)進(jìn)行互斥。每一個(gè)生產(chǎn)者用一個(gè)信號(hào)量與其消費(fèi)者同步,通過(guò)設(shè)置h_SemaphoreMAX_THREAD_NUM信號(hào)量數(shù)組實(shí)現(xiàn),該組信號(hào)量用于表示相應(yīng)產(chǎn)品已生產(chǎn)。同時(shí)用一個(gè)表示空緩沖區(qū)數(shù)目的信號(hào)量empty_semaphore進(jìn)行類(lèi)似的同步,指示緩沖區(qū)中是否存在空位置,以便開(kāi)始生產(chǎn)下一個(gè)產(chǎn)品。每一個(gè)緩沖區(qū)用一個(gè)同步對(duì)
5、象實(shí)現(xiàn)該緩沖區(qū)上消費(fèi)者之間的互斥,這通過(guò)設(shè)置臨界區(qū)對(duì)象數(shù)組PC_CriticalMAX_BUFFER_NUM實(shí)現(xiàn)。3.實(shí)驗(yàn)步驟:(1)打開(kāi)VC,選擇菜單項(xiàng)File->New,選擇Projects選項(xiàng)卡并建立一個(gè)名為R_WP1的win32 console application工程,創(chuàng)建時(shí)注意指定創(chuàng)建該工程的目錄。(2)在工程中創(chuàng)建源文件R_WP1.cpp:選擇菜單項(xiàng)Project->Add to project->Files,此時(shí)將打開(kāi)一個(gè)新窗口,在其中的“文件名”輸入欄中輸入自己想要?jiǎng)?chuàng)建的文件名,這里是R_WP1.cpp;接著詢問(wèn)是否創(chuàng)建新文件時(shí)回答“yes”。通過(guò)Work
6、space->Source Files打開(kāi)該文件,在其中編輯源文件并保存。(3)通過(guò)調(diào)用菜單項(xiàng)Build->Rebuild all進(jìn)行編譯連接,可以在指定的工程目錄下得到debug->R_WP1.exe程序,然后把給定的test.txt文件存入該debug目錄下,就可以在控制臺(tái)進(jìn)入該debug目錄運(yùn)行程序了。需要強(qiáng)調(diào)的是:在創(chuàng)建數(shù)據(jù)文件時(shí),由于涉及文件的格式問(wèn)題,最好在記事本中手工逐個(gè)輸入數(shù)據(jù),而不要用復(fù)制和粘貼數(shù)據(jù)。4.實(shí)驗(yàn)源代碼:/*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)和消費(fèi)線程的總數(shù)#define MAX_THREAD_NUM 64/定義一個(gè)結(jié)構(gòu),記錄在測(cè)試文件中指定的每一個(gè)線程的參數(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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 基建科前期服務(wù)范本合同
- 綠色田園工程建設(shè)作業(yè)指導(dǎo)書(shū)
- 業(yè)主裝修工程合同
- 全新運(yùn)輸合同終止協(xié)議書(shū)
- 物流行業(yè)最佳實(shí)踐指南
- 企業(yè)人力資源薪酬福利管理作業(yè)指導(dǎo)書(shū)
- 商品房買(mǎi)賣(mài)預(yù)售合同
- 旋挖鉆機(jī)買(mǎi)賣(mài)合同
- 個(gè)人股權(quán)轉(zhuǎn)讓協(xié)議書(shū)
- 借款合同法律常識(shí)
- 電鍍產(chǎn)業(yè)園項(xiàng)目可行性研究報(bào)告(專(zhuān)業(yè)經(jīng)典案例)
- 2025年魯泰集團(tuán)招聘170人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2024-2025學(xué)年成都高新區(qū)七上數(shù)學(xué)期末考試試卷【含答案】
- 企業(yè)員工食堂管理制度框架
- 《辣椒主要病蟲(chóng)害》課件
- 電力溝施工組織設(shè)計(jì)-電纜溝
- 2024年煤礦安全生產(chǎn)知識(shí)培訓(xùn)考試必答題庫(kù)及答案(共190題)
- 《法律援助》課件
- 小兒肺炎治療與護(hù)理
- GB/T 36547-2024電化學(xué)儲(chǔ)能電站接入電網(wǎng)技術(shù)規(guī)定
- 學(xué)校物業(yè)管理投標(biāo)書(shū)范本
評(píng)論
0/150
提交評(píng)論