




下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、操作系統課程設計用多進程同步方法解決生產者-消費者問題系 另計科系專 業:計算機科學與技術班 級:04 級 4班學 號: 04101010608姓 名:蘇 德 洪時 間:2006-7-7 2006-7-1411目錄一、題目: 3.二、設計目的: 3.三、總體設計思想概述: 3.四、說明: 3.五、設計要求: 3.六、設計方案: 3.七、流程圖: 5.八、運行結果 7.九、源程序 1.1.十、總結 1.8.十一、參考文獻 2.0.一、題目:用多進程同步方法解決生產者 - 消費者問題。二、設計目的:通過研究 Linux 的進程機制和信號量實現生產者消費者問題的并發控制。三、總體設計思想概述:1、生
2、產者消費者問題是一種同步問題的抽象描述。2、計算機系統中的每個進程都可以消費或生產某類資源。當系統中某一進程使用某一資源時,可以看作是消耗,且該進程稱為消費者。3、而當某個進程釋放資源時,則它就相當一個生產者。四、說明:有界緩沖區內設有 20個存儲單元 ,放入/取出的數據項設定為 1-20 這 20個整型數。五、設計要求:1、每個生產者和消費者對有界緩沖區進行操作后,即時顯示有界緩沖區的全部內容,當前指針位置和生產者 / 消費者線程的標識符。2、生產者和消費者各有兩個以上。3、多個生產者或多個消費者之間須有共享對緩沖區進行操作的函數代碼。六、設計方案:通過一個有界緩沖區 (用數組來實現,類似循
3、環隊列 )把生產者和消費者聯系起來。假定 生產者和消費者的優先級是相同的, 只要緩沖區未滿, 生產者就可以生產產品并將產品送入 緩沖區。類似地,只要緩沖區未空,消費者就可以從緩沖區中去走產品并消費它。應該禁止生產者向滿的緩沖區送入產品, 同時也應該禁止消費者從空的緩沖區中取出產 品,這一機制有生產者線程和消費者線程之間的互斥關系來實現。為解決生產者 /消費者問題,應該設置兩個資源信號量,其中一個表示空緩沖區的數目, 用 g_hFullSemaphore 表示, 其初始值為有界 緩沖區的大小 SIZE_OF_BUFFER ;另一 個表示緩沖區中產品的數目,用 g_hEmptySemaphore
4、表示,其初始值為 0 。另外,由于有 界緩沖區是一個臨界資源,必須互斥使用,所以還需要再設置一個互斥信號量 g_hMutex , 起初值為 1。在生產者 /消費者問題中,信號量實現兩種功能。首先,它是生產產品和消費產品的計 數器,計數器的初始值是可利用的資源數目(有界緩沖區的長度 )。其次,它是確保產品的生產者和消費者之間動作同步的同步器。生產者要生產一個產品時,首先對資源信號量 g_hFullSemaphore 和互斥信號量 g_hMutex 進行 P 操作,申請資源。如果可以通過的話,就生產一個產品,并把產品送入緩 沖區。然后對互斥信號量 g_hMutex 和資源信號量 g_hEmptyS
5、emaphore 進行 V 操作,釋 放資源。消費者要消費一個產品時,首先對資源信號量 g_hEmptySemaphore 和互斥信號量 g_hMutex 進行 P 操作,申請資源。 如果可以通過的話, 就從緩沖區取出一個產品并消費掉。 然后對互斥信號量 g_hMutex 和資源信號量 g_hFullSemaphore 進行 V 操作,釋放資源。如果緩沖區中已經沒有可用資源, 就把申請資源的進程添加到等待隊列的隊尾。 如果有 一個資源被釋放,在等待隊列中的第一個進程被喚醒并取得這個資源的使用權。七、流程圖:1、生產者C生產擰線程崢窺J2、消費者八、運行結果1、截圖一:函"F: 1 D
6、ebug 1 .ee"., J Xj2、截圖二:3、截圖三:4、截圖四:九、源程序/本程序于 2005.12.25 在 VC+6.0 下運行通過/系統環境: Windows XP#include <windows.h>#include <iostream>const unsigned short SIZE_OF_BUFFER = 20;/ 有界緩沖區長度int g_bufferSIZE_OF_BUFFER;/ 開辟緩沖區,用數組表示,可以看成是一個循環隊列unsigned short ProductID = 0;/ 新生產出來的產品的產品號unsigned s
7、hort ConsumeID = 0;/ 被消耗的產品的產品號unsigned short in = 0;/ 產品進緩沖區時的緩沖區下標,用于記錄生產者的指針位置unsigned short out = 0;/ 產品出緩沖區時的緩沖區下標,用于記錄消費者的指針位置bool g_continue = 1;/ 控制程序運行: 1 表示繼續運行, 0 表示停止運行HANDLE g_hMutex;/ 線程間的互斥信 號量HANDLE g_hFullSemaphore;/ 資源信號量:緩沖區滿HANDLE g_hEmptySemaphore;/ 資源信號量:緩沖區空DWORD WINAPI Produc
8、er(LPVOID);/ 生產者線程DWORD WINAPI Consumer(LPVOID);/ 消費者線程const unsigned short PRODUCERS_COUNT=4;/ 生產者的個數const unsigned short CONSUMERS_COUNT=3;/ 消費者的個數const unsigned short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;/ 總線程數HANDLE hThreadsPRODUCERS_COUNT;/ 各線程的 handleDWORD producerIDCONSUMERS_COUNT;/
9、生產者線程的標識符DWORD consumerIDTHREADS_COUNT;/ 消費者線程的標識符/*生產一個產品開始*/13/生產一個產品,輸出其 ID 號void Produce()std:cout<<std:endl;std:cerr<<" 生產一個產品 : "<<+ProductID; std:cout<<std:endl;/* 生產一個產品結束 */* 把新生產的產品放入緩沖區開始 */把新生產的產品放入緩沖區 void Append()std:cerr<<" 把生產的產品送入緩沖區 &quo
10、t;g_bufferin=ProductID;in=(in+1)%SIZE_OF_BUFFER;std:cerr<<std:endl;std:cout<<" 緩沖區 產品 生產者 / 消費者 "<<std:endl;/新產品放入緩沖區后,輸出緩沖區當前的狀態for(int i=0;i<SIZE_OF_BUFFER;+i)/輸出緩沖區下標"<<g_bufferi;"<<g_bufferi;if (i<10) std:cout<<i<<"elsestd:
11、cout<<i<<" if(i=in) if(g_bufferi<10)std:cout<<"std:cout<<"std:cout<<" <- 生產者 "/ 輸出生產者的指針位置if(i=out)if(g_bufferi<10) std:cout<<" "elsestd:cout<<" "std:cout<<" <- 消費者 "/ 輸出消費者的指針位置 std:co
12、ut<<std:endl;/* 把新生產的產品放入緩沖區結束 */* 消費一個產品開始 */void Consume()/ 消費一個產品std:cout<<std:endl;std:cerr<<" 消費一個產品 : "<<ConsumeID;std:cout<<std:endl;/* 消費一個產品結束 */* 從緩沖區中取出一個產品開始 */從緩沖區中取出一個產品void Take()std:cout<<std:endl;std:cerr<<" 從緩沖區取出一個產品ConsumeI
13、D=g_bufferout; out=(out+1)%SIZE_OF_BUFFER; std:cerr<<std:endl; std:cout<<std:endl;std:cout<<" 緩沖區 產品 生產者 / 消費者 "<<std:endl; /取出一個產品后,輸出緩沖區當前的狀態for(int i=0;i<SIZE_OF_BUFFER;+i)/輸出緩沖區下標 if(i<10)21std:cout<<i<<""<<g_bufferi;elsestd:cou
14、t<<i<<""<<g_bufferi;if(i=in)if(g_bufferi<10)std:cout<<"elsestd:cout<<"std:cout<<" <- 生產者 "/ 輸出生產者的指針位置if(i=out)if(g_bufferi<10)std:cout<<" "elsestd:cout<<" "std:cout<<" <- 消費者 &qu
15、ot;/ 輸出消費者的指針位置std:cout<<std:endl;/* 從緩沖區中取出一個產品結束 */* 生產者線程開始 */生產者線程DWORD WINAPI Producer(LPVOID lpPara)while(g_continue)/資源信號量的 P 操作 WaitForSingleObject(g_hFullSemaphore,INFINITE);/互斥信號量的 P 操作WaitForSingleObject(g_hMutex,INFINITE);/生產一個產品Produce();/把新生產的產品放入緩沖區Append();Sleep(2000);/互斥信號量的 V
16、 操作ReleaseMutex(g_hMutex);/資源信號量的 V 操作ReleaseSemaphore(g_hEmptySemaphore,1,NULL);return 0;/* 生產者線程結束 */*消費者線程開始*/消費者線程DWORD WINAPI Consumer(LPVOID lpPara)while(g_continue)/資源信號量的 P 操作WaitForSingleObject(g_hEmptySemaphore,INFINITE);/互斥信號量的 P 操作WaitForSingleObject(g_hMutex,INFINITE);/從緩沖區中取出一個產品Take()
17、;/消費一個產品Consume();Sleep(2000);/互斥信號量的 V 操作ReleaseMutex(g_hMutex);/資源信號量的 V 操作ReleaseSemaphore(g_hFullSemaphore,1,NULL);return 0;/* 消費者線程結束 */* 創建生產者線程開始 */void createPT()/ 創建生產者線程for(int i=0;i<PRODUCERS_COUNT;+i)hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi);if(hThreadsi=NULL)/*
18、創建生產者線程結束 */* 創建消費者線程開始 */void createCT()/ 創建消費者線程for (int j=0;j<CONSUMERS_COUNT;+j)hThreadsPRODUCERS_COUNT+j=CreateThread(NULL,0,Consumer,NULL,0,&consume rIDj);if (hThreadsj=NULL)g_continue=0;/* 創建消費者線程結束 */* 主函數開始 */void main()/顯示程序提示信息info();/創建互斥信號量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();/創建消費者線程create
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 工業智能化與人力資源的變革
- 工業安全與智能制造的關系
- 工業污染源監測的新技術動態
- 工業物聯網在生產車間的應用實踐
- 工業自動化中機器視覺算法優化探討
- 工業能源管理與節能減排技術應用
- 工業綠色化與節能減排技術
- 工業級智能硬件產品的設計要求與標準
- 工業火災防控策略與方法
- 工業設計在制造業的未來應用
- 2025年全國普通高校招生全國統一考試數學試卷(新高考Ⅰ卷)含答案
- T/CSPSTC 75-2021微動探測技術規程
- 【KAWO科握】2025年中國社交媒體平臺指南報告
- 大部分分校:地域文化形考任務一-國開(CQ)-國開期末復習資料
- 《藥物設計學》課程教學大綱
- DB5301∕T 43-2020 城鎮污水處理廠主要水污染物排放限值
- 炮車專項方案
- 解讀三級公立醫院績效考核課件
- 華能集團全員績效考核指導意見
- 高三地理復習資料_《極地地區》導學案
- CJJ101-2004埋地聚乙烯給水管道工程技術規程
評論
0/150
提交評論