進程同步模擬設計—生產者和消費者_第1頁
進程同步模擬設計—生產者和消費者_第2頁
進程同步模擬設計—生產者和消費者_第3頁
進程同步模擬設計—生產者和消費者_第4頁
進程同步模擬設計—生產者和消費者_第5頁
已閱讀5頁,還剩14頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、學 號: 0121010340621課 程 設 計題 目進程同步模擬設計生產者和消費者問題學 院計算機科學與技術學院專 業計算機科學與技術專業班 級1006班姓 名丁探指導教師劉洪星2013年1月17日課程設計任務書學生姓名: 丁探 專業班級: 計算機1006 指導教師: 劉洪星 工作單位: 計算機科學與技術學院 題 目: 進程同步模擬設計生產者和消費者問題 初始條件:1預備內容:閱讀操作系統的進程管理章節內容,對進程的同步和互斥,以及信號量機制度有深入的理解。2實踐準備:掌握一種計算機高級語言的使用。要求完成的主要任務: (包括課程設計工作量及其技術要求,以及說明書撰寫等具體要求)1模擬用信

2、號量機制實現生產者和消費者問題。2設計報告內容應說明: 課程設計目的與功能; 需求分析,數據結構或模塊說明(功能與框圖); 源程序的主要部分; 運行結果與運行情況分析; 自我評價與總結:i)你認為你完成的設計哪些地方做得比較好或比較出色;ii)什么地方做得不太好,以后如何改正;iii)從本設計得到的收獲(在編寫,調試,執行過程中的經驗和教訓);iv)完成本題是否有其他的其他方法(如果有,簡要說明該方法);v)對實驗題的評價和改進意見,請你推薦設計題目。時間安排:設計安排一周:周1、周2:完成程序分析及設計。周2、周3:完成程序調試及測試。周4、周5:驗收、撰寫課程設計報告。(注意事項:嚴禁抄襲

3、,一旦發現,抄與被抄的一律按0分記)指導教師簽名: 年 月 日系主任(或責任教師)簽名: 年 月 日目 錄1、 需求分析.42、 功能設計.53、源程序.84、運行結果.135、總 結.166、參考文獻.16生產者消費者問題1. 需求分析1.1問題描述: 一組生產者向一組消費者提供消息,它們共享一個有界緩沖區n,生產者向其中投放消息,消費者從中取得消息。1.2規則:n 對于生產者進程:產生一個數據,當要送入緩沖區時,要檢查緩沖區是否已滿,若未滿,則可將數據送入緩沖區,并通知消費者進程;否則,等待;n 對于消費者進程:當它去取數據時,要看緩沖區中是否有數據可取,若有則取走一個數據,并通知生產者進

4、程,否則,等待。n 緩沖區是個臨界資源,因此,諸進程對緩沖區的操作程序是一個共享臨界區,所以,還有個互斥的問題。1.3信號燈設置 :兩個同步信號燈-    empty :表示空緩沖區的數目,初值為有界緩沖區的大小n;     full : 表示滿緩沖區(即信息)的數目,其初值為0;一個互斥信號燈-    mutex:互斥信號燈,初值為1。 1.4同步描述: 1.5程序描述:main( )        int full=0; /*滿緩沖區的數目*/    int empty=

5、n;/*空緩沖區的數目*/    int mutex=1;/*對有界緩沖區進行操作的互斥信號燈*/    cobegin    p1 ( ); p2( );    coend    p1() while(生產未完成) ··· 生產一個產品; p(empty); p(mutex); 送一個產品到有界緩沖區; v(mutex); v(full); p2( ) while(還要繼續消費) p(full); p(mutex); 從有界緩沖區中取產品; v(mutex); v

6、(empty); ··· 消費一個產品; 1.6 C+語言程序模擬用信號量機制實現生產者和消費者問題:本次課程設計主要通過C+模擬信號量制中各個進程,及各進程之間的互斥、同步關系,來實現生產者和消費者問題。2. 功能設計2.1設計目的:通過實驗模擬生產者和消費者之間的關系,了解并掌握他們之間的關系及其原理。由此增加對進程同步的問題的了解。具體如下: 1)掌握基本的同步互斥算法,理解生產者和消費者模型; 2)了解windows中多線程(多進程)的并發執行機制,線程(進程)間的同步和互斥; 3)學習使用windows中基本的同步對象,掌握相應的API。2.2設計功能:

7、利用模擬用信號量機制實現生產者和消費者問題:通過用戶控制取進程和放進程,反應生產者和消費者問題中所涉及的進程的同步與互斥。2.3數據流程圖:1、生產者2、消費者2.4模塊說明:const unsigned short SIZE_OF_BUFFER = 10; /緩沖區長度 unsigned short ProductID = 0; /產品號 unsigned short ConsumeID = 0; /將被消耗的產品號 unsigned short in = 0; /產品進緩沖區時的緩沖區下標 unsigned short out = 0; /產品出緩沖區時的緩沖區下標 int g_buffe

8、rSIZE_OF_BUFFER; /緩沖區是個循環隊列 bool g_continue = true; /控制程序結束 HANDLE g_hMutex; /用于線程間的互斥 HANDLE g_hFullSemaphore; /當緩沖區滿時迫使生產者等待 HANDLE g_hEmptySemaphore; /當緩沖區空時迫使消費者等待 DWORD WINAPI Producer(LPVOID); /生產者線程 DWORD WINAPI Consumer(LPVOID); /消費者線程 3、源程序#include <windows.h>#include <iostream>

9、const unsigned short SIZE_OF_BUFFER = 20;/有界緩沖區長度int g_bufferSIZE_OF_BUFFER;/開辟緩沖區,用數組表示,可以看成是一個循環隊列unsigned short ProductID = 0;/新生產出來的產品的產品號unsigned short ConsumeID = 0;/被消耗的產品的產品號unsigned short in = 0;/產品進緩沖區時的緩沖區下標,用于記錄生產者的指針位置unsigned short out = 0;/產品出緩沖區時的緩沖區下標,用于記錄消費者的指針位置bool g_continue = 1

10、;/控制程序運行:1表示繼續運行,0表示停止運行HANDLE g_hMutex;/線程間的互斥信號量HANDLE g_hFullSemaphore;/資源信號量:緩沖區滿HANDLE g_hEmptySemaphore;/資源信號量:緩沖區空DWORD WINAPI Producer(LPVOID);/生產者線程DWORD WINAPI Consumer(LPVOID);/消費者線程const unsigned short PRODUCERS_COUNT=4;/生產者的個數const unsigned short CONSUMERS_COUNT=3;/消費者的個數const unsigned

11、short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;/總線程數HANDLE hThreadsPRODUCERS_COUNT;/各線程的handleDWORD producerIDCONSUMERS_COUNT;/生產者線程的標識符DWORD consumerIDTHREADS_COUNT;/消費者線程的標識符/*-生產一個產品開始-*/生產一個產品,輸出其ID號void Produce()std:cout<<std:endl;std:cerr<<"生產一個產品: "<<+ProductI

12、D;std:cout<<std:endl;/*-生產一個產品結束-*/*-把新生產的產品放入緩沖區開始-*/把新生產的產品放入緩沖區void Append()std:cerr<<"把生產的產品送入緩沖區"g_bufferin=ProductID;in=(in+1)%SIZE_OF_BUFFER;std:cerr<<std:endl;std:cout<<"緩沖區 產品 生產者/消費者"<<std:endl;/新產品放入緩沖區后,輸出緩沖區當前的狀態for(int i=0;i<SIZE_OF_

13、BUFFER;+i) /輸出緩沖區下標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<<" <- 生產者"/輸出生產者的指針位置if(i=out)if(g_b

14、ufferi<10)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 消費者"/輸出消費者的指針位置std:cout<<std:endl;/*-把新生產的產品放入緩沖區結束-*/*-消費一個產品開始-*/void Consume()/消費一個產品std:cout<<std:endl;std:cerr<<"消費一個產品: "<<ConsumeID;std:cout<<st

15、d:endl;/*-消費一個產品結束-*/*-從緩沖區中取出一個產品開始-*/從緩沖區中取出一個產品void Take()std:cout<<std:endl;std:cerr<<"從緩沖區取出一個產品"ConsumeID=g_bufferout;out=(out+1)%SIZE_OF_BUFFER;std:cerr<<std:endl;std:cout<<std:endl;std:cout<<"緩沖區 產品 生產者/消費者"<<std:endl;/取出一個產品后,輸出緩沖區當前的狀

16、態for(int i=0;i<SIZE_OF_BUFFER;+i) /輸出緩沖區下標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<<" <- 生產者"/

17、輸出生產者的指針位置if(i=out)if(g_bufferi<10)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 消費者"/輸出消費者的指針位置std:cout<<std:endl;/*-從緩沖區中取出一個產品結束-*/*-生產者線程開始-*/生產者線程DWORD WINAPI Producer(LPVOID lpPara) while(g_continue)/資源信號量的P操作WaitForSingleObject(g_hFul

18、lSemaphore,INFINITE); /互斥信號量的P操作WaitForSingleObject(g_hMutex,INFINITE); /生產一個產品Produce();/把新生產的產品放入緩沖區Append();Sleep(2000);/互斥信號量的V操作ReleaseMutex(g_hMutex); /資源信號量的V操作ReleaseSemaphore(g_hEmptySemaphore,1,NULL); return 0;/*-生產者線程結束-*/*-消費者線程開始-*/消費者線程DWORD WINAPI Consumer(LPVOID lpPara) while(g_conti

19、nue)/資源信號量的P操作WaitForSingleObject(g_hEmptySemaphore,INFINITE); /互斥信號量的P操作WaitForSingleObject(g_hMutex,INFINITE); /從緩沖區中取出一個產品Take();/消費一個產品Consume();Sleep(2000);/互斥信號量的V操作ReleaseMutex(g_hMutex); /資源信號量的V操作ReleaseSemaphore(g_hFullSemaphore,1,NULL); return 0;/*-消費者線程結束-*/*-創建生產者線程開始-*/void createPT()/

20、創建生產者線程for(int i=0;i<PRODUCERS_COUNT;+i)hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi);if(hThreadsi=NULL)g_continue=0;/*-創建生產者線程結束-*/*-創建消費者線程開始-*/void createCT()/創建消費者線程for (int j=0;j<CONSUMERS_COUNT;+j)hThreadsPRODUCERS_COUNT+j=CreateThread(NULL,0,Consumer,NULL,0,&consum

21、erIDj);if (hThreadsj=NULL)g_continue=0;/*-創建消費者線程結束-*/*-主函數開始-*/void main()/創建互斥信號量g_hMutex=CreateMutex(NULL,FALSE,NULL); /創建資源信號量g_hFullSemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);g_hEmptySemaphore=CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);/創建生產者線程createPT();/創建消費者線程createCT();/不按回車鍵的話程序會一直運行下

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論