操作系統(tǒng)生產(chǎn)者與消費者課程設(shè)計_第1頁
操作系統(tǒng)生產(chǎn)者與消費者課程設(shè)計_第2頁
操作系統(tǒng)生產(chǎn)者與消費者課程設(shè)計_第3頁
操作系統(tǒng)生產(chǎn)者與消費者課程設(shè)計_第4頁
操作系統(tǒng)生產(chǎn)者與消費者課程設(shè)計_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、啜興埠業(yè)操作系統(tǒng)課程設(shè)計生產(chǎn)者和消費者問題系 院:計算機科學(xué)系學(xué)生姓名:吳偉學(xué) 號:0734130101專 業(yè):軟件工程年 級:0701B完成日期:2009年11月指導(dǎo)教師:劉栓一、課程設(shè)計的性質(zhì)與任務(wù)1、生產(chǎn)者-消費者問題是很經(jīng)典很具有代表性的進程同步問題,計算機中的 很多同步問題都可抽象為生產(chǎn)者-消費者問題,通過本實驗的練習(xí),希望能 加深學(xué)生對進程同步問題的認識與理解。2、熟悉VC的使用,培養(yǎng)和提高學(xué)生的分析問題、解決問題的能力。二、課程設(shè)計的內(nèi)容及其要求.實驗內(nèi)容以生產(chǎn)者/消費者模型為依據(jù),在Windows 2000環(huán)境下創(chuàng)建一個控制臺進程,在該進程 中創(chuàng)建n個線程模擬生產(chǎn)者和消費者,實

2、現(xiàn)進程(線程)的同步與互斥。.實驗要求學(xué)習(xí)并理解生產(chǎn)者/消費者模型及其同步/互斥規(guī)則;學(xué)習(xí)了解Wmdows同步對象及其特性;熟悉實驗環(huán)境,掌握相關(guān)API的使用方法:設(shè)計程序,實現(xiàn)生產(chǎn)者/消費者進程(線程)的同步與互斥;提交實驗報告。三、課程設(shè)計的時間安排課程設(shè)計時間8課時四、課程設(shè)計的實驗環(huán)境本實驗是在winxp + VC6.0環(huán)境下實現(xiàn)的,利用Windows SDK編制實例程序。所以試驗需要 在windows卜.安裝VC后進行。VC是一個集成開發(fā)環(huán)境,其中包含了 Windows SDK所有工具 和定義;所以安裝了 VC后就不用特意安裝SDK 了。五、正文1、實驗程序的結(jié)構(gòu)圖(流程圖);2、數(shù)

3、據(jù)結(jié)構(gòu)及信號量定義的說明;CreateTliiead功能一一創(chuàng)建一個在調(diào)用進程的地址空間中執(zhí)行的線程格式HANDLE CreateTluead( LPSECURITY_ATTRIBUTES IpThieadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE IpStaitAddress,LPVOID IpPaiaimter,DWORD dwCieatioiiFlags,Lpdword IpTluead );參數(shù)說明IpTlueadAttnbutes指向一個LPSECURITY_ATTRIBUTES(新線程的安全性描述符)。dwStackSiz

4、e定義原始堆棧大小。IpStaitAddiess指向使用 LPTHRAED_START_ROUTINE 類型定義的函數(shù)。IpPaianutei-一一定義一個給進程傳遞參數(shù)的指針。dwCieatioiiFlags定義控制線程創(chuàng)建的附加標志。IpTluead保存線程標志符(32位)CreateMutex功能一一創(chuàng)建一個命名或匿名的互斥量對象格式HANDLE CieateMutex(LPSECURITY_AITRIBUTES IpMutexAttnbutes,BOOL blnitialOwnei;LPCTSTR IpName);參數(shù)說明IpMutexAttributes必須取值 NULLoblnit

5、ialOwiier一一指示當(dāng)前線程是否馬上擁有該互斥量(即馬上加鎖)。IpName互斥量名稱。CreateSeniaphoie功能一一創(chuàng)建一個命名或匿名的信號量對象格式HANDLE CieateSemaphore(LPSECURITY_ATTRIBUTES IpSemaphoieAttributes,LONG IhutialCount,LONG IMaxunumC ount.LPCTSTR IpName);參數(shù)說明IpSemaphoreAttnbutes必 須取值 NULL。lliiitialCount信號量的初始值。該值大于0,但小于IMaximumCount指定的最大值。IMaxhnumC

6、ount信號量的最大值。IpName信號量名稱。WaitForSmgleObject功能一一使程序處于等待狀態(tài),直到信號量hHandle出現(xiàn)(即其值大于等于1)或超過 規(guī)定的等待時間格式DWORD WaitFoiSingleObject(HANDLE liHandle, DWORD dwMilliseconds);參數(shù)說明liHaiidle信號量指針。dwMilliseconds等待的最長時間(INFINITE為無限等待)。Release Semaphore功能一一對指定信號量加上一個指定大小的量。成功執(zhí)行則返回非。值格式BOOL ReleaseSeniaphore(HANDLE hSemap

7、hore,LONG IReleaseCount,LPLONG IppieviousCount);參數(shù)說明hSeniaphore信號量指針。IReleaseCount信號量的增量。IppieviousCount保存信號量當(dāng)前值。ReleaseMutex,功能一一打開互斥鎖,即把互斥量加1。成功調(diào)用則返回0格式BOOL ReleaseMutex(HANDLE liMutex);參數(shù)說明liMutex互斥量指針oIiutializeCriticalSection功能一一初始化臨界區(qū)對象格式VOID InitializeCiiticalSection(LPCRITICAL_SECTION IpCiit

8、icalSection);參數(shù)說明IpCriticalSection指向臨界區(qū)對象的指針。EnterCriticalSection功能一一等待指定臨界區(qū)對象的所有權(quán)格式VOID enteiCriticalSection(LPCRITICAL_SECTION IpCriticalSection);參數(shù)說明IpCriticalSection指向臨界區(qū)對象的指針。LeaveCriticalSection功能一一釋放指定臨界區(qū)對象的所有權(quán)格式VOID LeaveCriticalSection(LPCRTTICAL_SECTION IpCiiticalSection);參數(shù)說明IpCriticalSec

9、tion指向臨界區(qū)對象的指針。3、實驗的步驟;(1)打開VC,選擇菜單項file-new,選擇piqects選項卡并建立一個名為 R_WP1”的Win32 console applicatoin工程;創(chuàng)建時注意指定創(chuàng)建該工程的目錄;(2)在工程中創(chuàng)建源文件R_WPl.cpp:選擇菜單項piojectAadd to pioject-files,在選擇框 中輸入自己想要創(chuàng)建的文件名,這里是 R_WPl.cpp”;在接下來詢問是否創(chuàng)建新文件時回答 yes;然后通過Workspace-Source Files打開該文件,在其中編輯源文件并保存.(3)通過調(diào)用菜單命令項bmld-build all進行編

10、譯連接,可以在指定的工程目錄下得到 debug-R_WPl.exe程序,然后把給定的test.txt文件存入該debug目錄下,就可以在控制臺 進入該debug目錄運行程序了。需要強調(diào)的是在創(chuàng)建數(shù)據(jù)文件時,由于涉及到文件格式問題, 最好在記事本中手工逐個輸入數(shù)據(jù),而不要拷貝粘貼數(shù)據(jù)。4、主要算法創(chuàng)建生產(chǎn)者和消費者線程fbr(i =0;isenal;m.delay = (DWORD)(TlueadIiifd*)(p)-delay *INTE_PER.SEC);Sleep(m_delay);開始請求生產(chǎn)printf(MProducer %2d sends the produce requue.ii

11、,m_senal);確認有空緩沖區(qū)可供生產(chǎn),同時將空位置數(shù)empty減1;用于生產(chǎn)者和消費者的同步;wait_fbr_seniaphore = WaitForSingleObject(empty_semaphorer 1);互斥訪問下一個可用于生產(chǎn)的空臨界區(qū),實現(xiàn)寫寫互斥; wait_fbr_mutex = WaitForSmgleObj ect(h_mutex,-l);int ProducePos = FmdPioducePositionQ;ReleaseMutex(h_mutex);生產(chǎn)者在獲得自己的空位置并做上標記后,以下的寫操作在生產(chǎn)者之間可以并發(fā); 核心生產(chǎn)步驟中,程序?qū)⑸a(chǎn)者的ID

12、作為產(chǎn)品編號放入,方便消費者識別; printf(MPioducer %2d begin to produce at position %2d.irm_seriatProducePos);BuSer_CriticalProducePos = m_serial;printf(MProducer %2d finish pioduciiig :n ,m_senal);printf(M position %2d :%3d iiH .ProducePos,Buffei_CriticalPioducePos);使生產(chǎn)者寫的緩沖區(qū)可以被多個消費者使用,實現(xiàn)讀寫同步; ReleaseSeniaphore(h_

13、Seniaphoiem_senal,n_Tluead,NULL);消費者進程void Consume(void * p)(局部變量聲明;DW ORD wait_fdi_semaphoiejivdelay;int nuseriaLmjequestNuni;消費者的序列號和請求的數(shù)目;int m_threadequestMAX_THREAD_NUM;/本消費線程的請求隊列;提取本線程的信息到本地;m_seiial = (Tliieadlnfb*)(p)-senal;m.delay = (DWORD)(TlueadIiifb*)(p)-delay *INTE_PER_SEC);nwequestNum

14、 = (Tlueadlnfb *)(p)-n_request;for (mt i = O;itluead_requesti;Sleep(m_delay);循環(huán)進行所需產(chǎn)品的消費fbr(i =O;itluead-iequesti =-l;if( !IfhiOtherRequest(m_tliiead_requesti)Buffer_CriticalBufferPos = -1;標記緩沖區(qū)為空;prmtf(nConsumer%2d finish consuming %2d:ii ,ni_seiial.nLthread_requesti);piintff position %2d :%3d un .

15、BufferPos,Buffer_CriticalBuffeiPos);ReleaseSemaphore(empty_semaphore, 1 ,NULL);elseprintHConsumer %2d fiiush consunmig product %2dn jn_serial,m_thiead_equesti); /離開臨界區(qū)LeaveCiiticalSection(&PC_CriticalBuffeiPos);5、實驗運行圖;ProducerConsumer Producer Producer ProducerProducer Producer ProducerConsumer Con

16、sumerConsumer Consumer ConsumerConsumer Consumer Consumer3 Finish producing :position 0 :34 request to consume 1 product2 sends the produce require.1.2 begin to produce at position2 finish producing :position1 :21 sends the produce require1 begin to produce at position1 finish producing :position2 )

17、:14 begin to consume 1 product4 finish consuning 1:position2 1: -14 request to consume 3 product4 begin to consume 3 product4 finish consuming 3:position0 1: -14 request to consume 2 product4 begin to consume 2 product4 f inish consuming 2: position1 1 : -1Press any key to continue6、實驗結(jié)果分析;只有在生產(chǎn)者生產(chǎn)了

18、產(chǎn)品并將產(chǎn)品存放到緩沖池中消費者才能去消費,當(dāng)緩沖池為空時消費 者不能消費六、結(jié)論(應(yīng)當(dāng)準確、完整、明確精練;也可以在結(jié)論或討論中提出建議、設(shè)想、 尚待解決問題等。)七、參考文獻1湯子瀛等.計算機操作系統(tǒng).西安電子科技大學(xué)出版社.2007年2月2張堯?qū)W等編著,計算機操作系統(tǒng)教程,清華出版社。2002. 2【3】嚴蔚敏,吳偉民編著,數(shù)據(jù)結(jié)構(gòu),清華大學(xué)出版社。20024陳向群編著,操作系統(tǒng)教程,北京大學(xué)出版社,2001. 075鄭莉等編著,C+語言設(shè)計。北京:清華大學(xué)出版社.2000八、指導(dǎo)教師評語簽名:年 月 日課程設(shè)計成績附:課程設(shè)計源代碼:#mclude#iiiclude#iiiclude#

19、mclude#iiiclude定義常量;此程序允許的最大臨界區(qū)數(shù):#define MAX_BUFFER_NUM 10秒到微秒的乘法因子;#define INTE_PER_SEC 1000/本程序允許的生產(chǎn)和消費線程的總數(shù);#define MAX.THREAD_.NUM 64定義一個結(jié)構(gòu),記錄在測試文件中指定的每一個線程的參數(shù) stiuct Thieadlnfb(int serial;/線程序列號chai entity;是 P 還是 Cdouble delay;線程延遲int thicadequestMAX_THRE AD_NUM;/線程請求隊列int n_request;請求個數(shù);全局變量的定

20、義臨界區(qū)對象的聲明,用于管理緩沖區(qū)的互斥訪問:CRITICAL.SECTION PC_CnticalMAX_BUFFER_NUM;mtBuffer_CnticalNIAX_BUFFER.NUNI; 緩沖區(qū)聲明,用于存放產(chǎn)品;HANDLEh_Tlu ead MAX_THRE AD_NUM; 用于存儲每個線程句柄的數(shù)組;TlueadhifbThiead-IiifbMAX.THREAD.NUM; 線程信息數(shù)組;HANDLEempty_seniaphore;一 個信號量;HANDLEh.mutex;一個互斥量;DWORDn_Thiead = 0;實際的線程的數(shù)目;DWORDn_Buffer_or_Cn

21、tical;實際的緩沖區(qū)或者臨界區(qū)的數(shù)目;HANDLEh_SemaphoieMAX_THREAD_NUM; 生產(chǎn)者允許消費者開始消費的信號量:生產(chǎn)消費及輔助函數(shù)的聲明void Produce(void *p);void Consume(void *p);bool IflnOtherRequest(iiit);hit FindProducePositon();mtFindBufferPosition(iiit);hitniain(void)(聲明所需變量;DWORD wait for all;ifstieam iiiFile;初始化緩沖區(qū);fbr(int i=0;i MAX_BUFFER_NUM

22、;i+) Bufifei_Criticali = -1;初始化每個線程的請求隊列;for(int j=OjMAX_THREAD_NUM;j+)for(mt k=O;kMAX_THREAD_NUM;k+)Thiead_Iiifbj .thread_requestk = -1;Tluead-Infb.n-request = 0;初始化臨界區(qū);fbr(i =0;i MAX_BUFFER_NUM;i+)IiiitializeCriticalSection(&PC_Cnticali);打開輸入文件,按照規(guī)定的格式提取線程等信息:in(ntest.txtM);從文件中獲得實際的緩沖區(qū)的數(shù)目;hiFile

23、n Buffer or Critical;皿);printf(輸入文件是NT);回顯獲得的緩沖區(qū)的數(shù)目信息;printf(M%d n”,(int) n_Buffb_or_C】itical);提取每個線程的信息到相應(yīng)數(shù)據(jù)結(jié)構(gòu)中;while(inFile)uiFile Tliiead_Iiifbn_Thiead.serial;uiFile Tliiead_Iiifbn_Thiead.entity;uiFile Thiead_Iiifbn_Thiead.delay;clw c;in(c);inFile Tluead_Iiifbn_Tluead.tluead_requestTluead_Iiifbn_

24、Tluead.n_request-H-;皿c);)n_Tluead+;回顯獲得的線程信息,便于確認正確性;砧。=0 卜(hit) n_Thread;j+)mt Temp_serial = Tluead_Iiifd|j .serial;char Temp_entity = Tliiead_Iiifb j . entity;double Temp_delay= Tluead.Infblj.delay;pdntff ii thread%2d%c %f ”,Tump_serial,Temp_entity,Temp_delay);mt Temp_request = Tluead_liifblj.n_ie

25、quest;fbr(iiit k=O;kTemp_request;k+)printf( %d Tluead_Iiifoj.tliiead_requestk);coutendl;創(chuàng)建在模擬過程中幾個必要的信號量empty_seniaphore=CreateSemaphore(NULL.n_Buffer_oi_Criticatn_Buffer_oi_CiiticaL nseniaphore_fbi_emptyu);h_mutex = CreateMutex(NULL,FALSE,Hmutex_foi_updateM);下面這個循環(huán)用線程的ID號來為相應(yīng)生產(chǎn)線程的產(chǎn)品讀寫時所使用的同步信號量命名:f

26、br(j=0 j(iiit)n_Tluead ;j+)std:strmg Ip =Hseniaphore_fbi_produce_n;mt temp =j;while(temp)char c = (char)(temp% 10);lp+=c;temp/=10;)h_Seniaphorej+1 =CreateSemaphore(NULL,OjvTlueadJp.c_str();創(chuàng)建生產(chǎn)者和消費者線程;fbr(i =0;i (mt) n_Thread;i+)if(Thiead_Iiifoi. entity =P)h_Thieadi= CreateTliiead(NULL.O.(LPTHREAD_S

27、TART_ROUTINE)(Produce), &(Thiead_Infoi),O.NULL);elseh_Tlueadi=CreateThiead(NULL,0.(LPTHREAD_START_ROUTINE)(Consume),&(Thread_Infbi),O.NULL);主程序等待各個線程的動作結(jié)束;wait_fbr_all = WaitForMultipleObjects(n_Tluead,h_Tluead,TRUErl);printf(M n iiALL Producer and consumer have finished their work.getchQ;return 0;確

28、認是否還有對同一產(chǎn)品的消費請求未執(zhí)行;bool IfliiOtherRequest(int ieq)(fbr(int i=0;in_Tluead;i+)fbr(mt j=O:jTluead_Iiifbi.n_requestJ-H-) if(Thiead_Iiifbi.thiead_iequestj = req) return TRUE;return FALSE;找出當(dāng)前可以進行產(chǎn)品生產(chǎn)的空緩沖區(qū)位置;mt FindProducePosition()(int EmptyPosition;for (mt i =0;in_Buffer_or_Critical;i+)if(Buffer_Critica

29、li = -1)EmptyPosition = i;用下面這個特殊值表示本緩沖區(qū)正處于被寫狀態(tài);Buffer_Criticali = -2;break;return EmptyPosition;/找出當(dāng)前所需生產(chǎn)者生產(chǎn)的產(chǎn)品的位置;mt FindBufieiPosition(int ProPos)(int TempPos;for (mt i =0 ;isenal;m.delay = (DWORD)(TlueadIiifb*)(p)-delay *INTE_PER_SEC);Sleep(m_delay);開始請求生產(chǎn)printf(MPioducer %2d sends the produce r

30、equue.ii,m_senal);確認有空緩沖區(qū)可供生產(chǎn),同時將空位置數(shù)empty減1;用于生產(chǎn)者和消費者的同步;wait_fbr_seniaphore = WaitForSingleObject(empty_semaphoier 1);互斥訪問下一個可用于生產(chǎn)的空臨界區(qū),實現(xiàn)寫寫互斥;wait_fbr_mutex = WaitForSmgleObject(h_mutex,-l);int ProducePos = FmdPioducePositionQ;ReleaseMutex(h_mutex);生產(chǎn)者在獲得自己的空位置并做上標記后,以下的寫操作在生產(chǎn)者之間可以并發(fā); 核心生產(chǎn)步驟中,程序?qū)⑸a(chǎn)者的ID作為產(chǎn)品編號放入,方便消費者識別; printf(MPioducer %2d begin to produce at position %2d.irm_seriatProducePos);B

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論