




版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、課程設計報告課程名稱: 操作系統(tǒng) 專業(yè)計算機科學與技術學生姓名班級學號指導教師完成日期信息工程學院題目:生產(chǎn)者-消費者問題的模擬實現(xiàn) 一、設計目的本課程設計是學習完“操作系統(tǒng)原理”課程后進行的一次全面的綜合訓練,通過課程設計,更好地掌握操作系統(tǒng)的原理及實現(xiàn)方法,加深對操作系統(tǒng)基礎理論和重要算法的理解,加強學生的動手能力。二、設計內(nèi)容(1)概述設計目的:通過研究Linux 的進程機制和信號量實現(xiàn)生產(chǎn)者消費者問題的并發(fā)控制。說明:有界緩沖區(qū)內(nèi)設有20個存儲單元,放入/取出的數(shù)據(jù)項設定為1-20這20個整型數(shù)。設計要求:(1)每個生產(chǎn)者和消費者對有界緩沖區(qū)進行操作后,即時顯示有界緩沖區(qū)的全部內(nèi)容,當
2、前指針位置和生產(chǎn)者/消費者縣城的標識符。(2)生產(chǎn)者和消費者各有兩個以上。(3)多個生產(chǎn)者或多個消費者之間須有共享對緩沖區(qū)進行操作的函數(shù)代碼。(2)設計原理通過一個有界緩沖區(qū)把生產(chǎn)者和消費者聯(lián)系起來。假定生產(chǎn)者和消費者的優(yōu)先級是相同的,只要緩沖區(qū)未滿,生產(chǎn)者就可以生產(chǎn)產(chǎn)品并將產(chǎn)品送入緩沖區(qū)。類似地,只要緩沖區(qū)未空,消費者就可以從緩沖區(qū)中取走產(chǎn)品。應該禁止生產(chǎn)者向滿的緩沖區(qū)送入產(chǎn)品,同時也應該禁止消費者從空的緩沖區(qū)中取出產(chǎn)品,這一機制有生產(chǎn)者線程和消費者線程之間的互斥關系來實現(xiàn)。與計算打印兩進程同步關系相同,生產(chǎn)者和消費者兩進程P和C之間應滿足下列兩個同步條件: 只有在緩沖池中至少有一個緩沖區(qū)已
3、存入消息后,消費者才能從中提取信息,否則消費者必須等待。 只有緩沖池中至少有一個緩沖區(qū)是空時,生產(chǎn)者才能把消息放入緩沖區(qū),否則生產(chǎn)者必須等待。為了滿足第一個同步條件,設置一個同步信號量full,它代表的資源是緩沖區(qū)滿,它的初始值為0,它的值為n時整個緩沖池滿。這個資源是消費者類進程C所有,C進程可以申請該資源,對它施加P操作,而C進程的合作進程生產(chǎn)者進程P對它施加V操作。同樣為了滿足第二個同步條件,設置另一個同步信號量empty,它代表的資源是緩沖空區(qū),它的初始值為n,表示緩沖池中所有緩沖區(qū)空。信號量full表示可用緩沖區(qū)數(shù)量,信號量empty表示緩沖區(qū)數(shù)量,設置整型變量:存入指針in和取出指
4、針out。為解決生產(chǎn)者/消費者問題,應該設置兩個資源信號量,其中一個表示空緩沖區(qū)的數(shù)目,用g_hFullSemaphore表示,其初始值為有界緩沖區(qū)的大小SIZE_OF_BUFFER;另一個表示緩沖區(qū)中產(chǎn)品的數(shù)目,用g_hEmptySemaphore表示,其初始值為0.另外,由于有界緩沖區(qū)是一個臨界資源,必須互斥使用,所以還需要在設置一個互斥信號量g_hMutex,初始值為1.P原語的主要動作是: sem減1; 若sem減一后仍大于或等于零,則進程繼續(xù)執(zhí)行; 若sem減一后小于零,則該進程被阻塞后入與該信號相對應的隊列中,然后轉(zhuǎn)進程調(diào)度。V原語的操作主要動作是: sem加1; 若相加結果大于零
5、,進程繼續(xù)執(zhí)行;若相加結果小于或等于零,則從該信號的等待隊列中喚醒一等待進程然后再返回原進程繼續(xù)執(zhí)行或轉(zhuǎn)進程調(diào)度。采用的同步方法:1)利用函數(shù)CreateMutex(NULL,FALSE,NULL)創(chuàng)建互斥信號量g_hMutex,表示緩沖區(qū)當前的狀態(tài),若為true時,則表示緩沖區(qū)正被別的進程使用。三個參數(shù)表示的意義分別為:指向安全屬性的指針,初始化互斥對象的所有者,指向互斥對象名的指針。2)利用函數(shù)CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL)創(chuàng)建緩沖區(qū)滿的信號量g_hFullSemaphore,值為true時表示緩沖區(qū)
6、已滿。四個參數(shù)分別為:表示是否允許繼承、設置信號機的初始計數(shù)、設置信號機的最大計數(shù)、指定信號機對象的名稱(-1是因為計數(shù)從開始)。3)利用函數(shù)CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL)創(chuàng)建緩沖區(qū)空的信號量g_hEmptySemaphore,該值為true時表示緩沖區(qū)為空。5、數(shù)據(jù)定義及其詳細解釋const unsigned short SIZE_OF_BUFFER = 20; /緩沖區(qū)長度 unsigned short ProductID = 0; /產(chǎn)品號 unsigned short ConsumeID = 0; /將被消耗的產(chǎn)品號 unsi
7、gned short in = 0; /產(chǎn)品進緩沖區(qū)時的緩沖區(qū)下標 unsigned short out = 0; /產(chǎn)品出緩沖區(qū)時的緩沖區(qū)下標 int g_bufferSIZE_OF_BUFFER; /緩沖區(qū)是個循環(huán)隊列 bool g_continue = true; /使程序跳出循環(huán),控制程序結束 HANDLE g_hMutex; /用于線程間的互斥 HANDLE g_hFullSemaphore; /當緩沖區(qū)滿時迫使生產(chǎn)者等待 HANDLE g_hEmptySemaphore; /當緩沖區(qū)空時迫使消費者等待 DWORD WINAPI Producer(LPVOID); /生產(chǎn)者線程 DW
8、ORD WINAPI Consumer(LPVOID); /消費者線程 (3)詳細設計及編碼流程圖生產(chǎn)者:sem=sem-1入口s>=0調(diào)用進程入等待隊列轉(zhuǎn)進程調(diào)度返回是否消費者:入 口sem=sem-1 sem=sem-1S<=0喚醒等待隊列中的一個進程式返回或轉(zhuǎn)進程調(diào)度 返回否是程序清單 1.存儲結構定義 利用信號量解決生產(chǎn)者消費者問題 const unsigned short SIZE_OF_BUFFER = 10; /緩沖區(qū)長度 unsigned short ProductID = 0; /產(chǎn)品號 unsigned short ConsumeID = 0; /將被消耗的產(chǎn)品
9、號 unsigned short in = 0; /產(chǎn)品進緩沖區(qū)時的緩沖區(qū)下標 unsigned short out = 0; /產(chǎn)品出緩沖區(qū)時的緩沖區(qū)下標 int g_bufferSIZE_OF_BUFFER; /緩沖區(qū)是個循環(huán)隊列 bool g_continue = true; /控制程序結束 HANDLE g_hMutex; /用于線程間的互斥 HANDLE g_hFullSemaphore; /當緩沖區(qū)滿時迫使生產(chǎn)者等待 HANDLE g_hEmptySemaphore; /當緩沖區(qū)空時迫使消費者等待 DWORD WINAPI Producer(LPVOID); /生產(chǎn)者線程 DWOR
10、D WINAPI Consumer(LPVOID); /消費者線程 2.算法相關的函數(shù) (1)創(chuàng)建各個互斥信號以及生產(chǎn)者線程和消費者線程的函數(shù)在如下主函數(shù)里面所示: int main() /創(chuàng)建各個互斥信號 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); /調(diào)整下面的數(shù)值,
11、可以發(fā)現(xiàn),當生產(chǎn)者個數(shù)多于消費者個數(shù)時, /生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費者;反之,消費者經(jīng)常等待。 const unsigned short PRODUCERS_COUNT = 3; /生產(chǎn)者的個數(shù) const unsigned short CONSUMERS_COUNT = 1; /消費者的個數(shù) /總的線程數(shù) const unsigned short THREADS_COUNT PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreadsPRODUCERS_COUNT; /各線程的handle DWORD producerIDCONSUMERS_COUN
12、T; /生產(chǎn)者線程的標識符 DWORD consumerIDTHREADS_COUNT; /消費者線程的標識符 /創(chuàng)建生產(chǎn)者線程 for (int i=0;i hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi); if (hThreadsi=NULL) return -1; /創(chuàng)建消費者線程 for ( i=0;i hThreadsPRODUCERS_COUNT+i=CreateThread(NULL,0,Consumer,NULL,0 &consumerIDi); if (hThreadsi=NULL) re
13、turn -1; while(g_continue) if(getchar() /按回車后終止程序運行 g_continue = false; return 0; (2) 生產(chǎn)者生產(chǎn)一個產(chǎn)品的函數(shù): /生產(chǎn)一個產(chǎn)品。簡單模擬了一下,僅輸出新產(chǎn)品的ID號 void Produce() std:cerr << "Producing " << +ProductID << " * " std:cerr << "Succeed" << std:endl; (3)把新生產(chǎn)的產(chǎn)品放入緩沖區(qū)
14、的函數(shù): /把新生產(chǎn)的產(chǎn)品放入緩沖區(qū) void Append() std:cerr << "Appending a product * " g_bufferin = ProductID; in = (in+1)%SIZE_OF_BUFFER; std:cerr << "Succeed" << std:endl; (4)輸出緩沖區(qū)當前的狀態(tài)的函數(shù): /輸出緩沖區(qū)當前的狀態(tài) for (int i=0;i std:cout << i <<": " << g_buffer
15、i; if (i=in) std:cout << " <- 生產(chǎn)" if (i=out) std:cout << " <- 消費" std:cout << std:endl; 從緩沖區(qū)中取出一個產(chǎn)品的函數(shù): /從緩沖區(qū)中取出一個產(chǎn)品 void Take() std:cerr << "Taking a product * " ConsumeID = g_bufferout; out = (out+1)%SIZE_OF_BUFFER; 利用信號量解決生產(chǎn)者消費者問題 std:ce
16、rr << "Succeed" << std:endl; (5)輸出緩沖區(qū)當前的狀態(tài)的函數(shù): /輸出緩沖區(qū)當前的狀態(tài) for (int i=0;i std:cout << i <<": " << g_bufferi; if (i=in) std:cout << " <- 生產(chǎn)" if (i=out) std:cout << " <- 消費" std:cout << std:endl; (6)消耗一個產(chǎn)品的函數(shù)
17、: /消耗一個產(chǎn)品 void Consume() std:cerr << "Consuming " << ConsumeID << " * " std:cerr << "Succeed" << std:endl; 3.生產(chǎn)者和消費者算法 (1)生產(chǎn)者算法: /生產(chǎn)者 DWORD WINAPI Producer(LPVOID lpPara) while(g_continue) WaitForSingleObject(g_hFullSemaphore,INFINITE); Wai
18、tForSingleObject(g_hMutex,INFINITE); Produce(); Append(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hEmptySemaphore,1,NULL); return 0; (2)消費者算法: /消費者 DWORD WINAPI Consumer(LPVOID lpPara) while(g_continue) WaitForSingleObject(g_hEmptySemaphore,INFINITE); WaitForSingleObject(g_hMutex,INFINITE); Take(); Consume(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hFullSemaphore,1,NULL); return 0; (4)運行結果分析輸入輸出數(shù)據(jù)說明和分析:該程序設置的緩沖區(qū)數(shù)據(jù)長度為20,生產(chǎn)者個數(shù)為3,消費者個數(shù)為1,程序啟動后,生產(chǎn)者先進行生產(chǎn),當3個生產(chǎn)者全部生產(chǎn)完之后,消費者開始從緩沖區(qū)中取出產(chǎn)品,當消費者取出一個后,生產(chǎn)者
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 浙江省寧波市慈溪市2025屆初三下4月月考化學試題含解析
- 武漢鐵路橋梁職業(yè)學院《綜合英語:化學3》2023-2024學年第二學期期末試卷
- 陽江職業(yè)技術學院《醫(yī)學影像設備學(一)》2023-2024學年第一學期期末試卷
- 天府新區(qū)航空職業(yè)學院《傳輸原理》2023-2024學年第一學期期末試卷
- 四川電力職業(yè)技術學院《大學IT4》2023-2024學年第二學期期末試卷
- 江蘇省鎮(zhèn)江市六校2024-2025學年中考英語試題二輪優(yōu)化提升專題訓練含答案
- 深圳市龍崗區(qū)2025年下學期初三化學試題第一次診斷性考試試卷含解析
- 曲靖師范學院《電影攝影創(chuàng)作》2023-2024學年第二學期期末試卷
- 陜西省西安市西北工業(yè)大附屬中學2025年初三第六次質(zhì)量考評生物試題試卷含解析
- 采購合同履行法律咨詢重點基礎知識點
- 拒絕間歇性努力不做45度青年-“拒絕躺平”主題班會-2024-2025學年初中主題班會課件
- 第10課 古代的村落、集鎮(zhèn)和城市課件(共20張)2024-2025學年高二歷史統(tǒng)編版選擇性必修二
- 公交行車安全指導書
- 2025年中航貨運航空有限公司招聘筆試參考題庫含答案解析
- 地產(chǎn)營銷培訓課件
- 《個性化服務》課件
- 電除塵升壓措施
- 中樞神經(jīng)系統(tǒng)結核病
- 高考沖刺40天家長會
- 移動裝維人員培訓
- 2025山東能源集團中級人才庫選拔管理單位筆試遴選500模擬題附帶答案詳解
評論
0/150
提交評論