操作系統(tǒng)生產(chǎn)者與消費(fèi)者問(wèn)題實(shí)驗(yàn)報(bào)告(共9頁(yè))_第1頁(yè)
操作系統(tǒng)生產(chǎn)者與消費(fèi)者問(wèn)題實(shí)驗(yàn)報(bào)告(共9頁(yè))_第2頁(yè)
操作系統(tǒng)生產(chǎn)者與消費(fèi)者問(wèn)題實(shí)驗(yàn)報(bào)告(共9頁(yè))_第3頁(yè)
操作系統(tǒng)生產(chǎn)者與消費(fèi)者問(wèn)題實(shí)驗(yàn)報(bào)告(共9頁(yè))_第4頁(yè)
操作系統(tǒng)生產(chǎn)者與消費(fèi)者問(wèn)題實(shí)驗(yàn)報(bào)告(共9頁(yè))_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論