




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、word課程設(shè)計(jì)報(bào)告課程名稱: Linux操作系統(tǒng) 專業(yè)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)生姓名班級(jí)學(xué)號(hào)指導(dǎo)教師完成日期信息工程學(xué)院題目:生產(chǎn)者-消費(fèi)者問題的模擬實(shí)現(xiàn) 一、設(shè)計(jì)目的本課程設(shè)計(jì)是學(xué)習(xí)完“操作系統(tǒng)原理課程后進(jìn)行的一次全面的綜合訓(xùn)練,通過課程設(shè)計(jì),更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,加深對(duì)操作系統(tǒng)根底理論和重要算法的理解,加強(qiáng)學(xué)生的動(dòng)手能力。二、設(shè)計(jì)內(nèi)容1概述設(shè)計(jì)目的:通過研究Linux 的進(jìn)程機(jī)制和信號(hào)量實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題的并發(fā)控制。說明:有界緩沖區(qū)內(nèi)設(shè)有20個(gè)存儲(chǔ)單元,放入/取出的數(shù)據(jù)項(xiàng)設(shè)定為1-20這20個(gè)整型數(shù)。設(shè)計(jì)要求:(1)每個(gè)生產(chǎn)者和消費(fèi)者對(duì)有界緩沖區(qū)進(jìn)行操作后,即時(shí)顯示有界緩沖區(qū)的
2、全部內(nèi)容,當(dāng)前指針位置和生產(chǎn)者/消費(fèi)者縣城的標(biāo)識(shí)符。(2)生產(chǎn)者和消費(fèi)者各有兩個(gè)以上。(3)多個(gè)生產(chǎn)者或多個(gè)消費(fèi)者之間須有共享對(duì)緩沖區(qū)進(jìn)行操作的函數(shù)代碼。2設(shè)計(jì)原理通過一個(gè)有界緩沖區(qū)把生產(chǎn)者和消費(fèi)者聯(lián)系起來。假定生產(chǎn)者和消費(fèi)者的優(yōu)先級(jí)是相同的,只要緩沖區(qū)未滿,生產(chǎn)者就可以生產(chǎn)產(chǎn)品并將產(chǎn)品送入緩沖區(qū)。類似地,只要緩沖區(qū)未空,消費(fèi)者就可以從緩沖區(qū)中取走產(chǎn)品。應(yīng)該禁止生產(chǎn)者向滿的緩沖區(qū)送入產(chǎn)品,同時(shí)也應(yīng)該禁止消費(fèi)者從空的緩沖區(qū)中取出產(chǎn)品,這一機(jī)制有生產(chǎn)者線程和消費(fèi)者線程之間的互斥關(guān)系來實(shí)現(xiàn)。與計(jì)算打印兩進(jìn)程同步關(guān)系相同,生產(chǎn)者和消費(fèi)者兩進(jìn)程P和C之間應(yīng)滿足以下兩個(gè)同步條件: 只有在緩沖池中至少有一個(gè)
3、緩沖區(qū)已存入消息后,消費(fèi)者才能從中提取信息,否那么消費(fèi)者必須等待。 只有緩沖池中至少有一個(gè)緩沖區(qū)是空時(shí),生產(chǎn)者才能把消息放入緩沖區(qū),否那么生產(chǎn)者必須等待。為了滿足第一個(gè)同步條件,設(shè)置一個(gè)同步信號(hào)量full,它代表的資源是緩沖區(qū)滿,它的初始值為0,它的值為n時(shí)整個(gè)緩沖池滿。這個(gè)資源是消費(fèi)者類進(jìn)程C所有,C進(jìn)程可以申請(qǐng)?jiān)撡Y源,對(duì)它施加P操作,而C進(jìn)程的合作進(jìn)程生產(chǎn)者進(jìn)程P對(duì)它施加V操作。同樣為了滿足第二個(gè)同步條件,設(shè)置另一個(gè)同步信號(hào)量empty,它代表的資源是緩沖空區(qū),它的初始值為n,表示緩沖池中所有緩沖區(qū)空。信號(hào)量full表示可用緩沖區(qū)數(shù)量,信號(hào)量empty表示緩沖區(qū)數(shù)量,設(shè)置整型變量:存入指針
4、in和取出指針out。為解決生產(chǎn)者/消費(fèi)者問題,應(yīng)該設(shè)置兩個(gè)資源信號(hào)量,其中一個(gè)表示空緩沖區(qū)的數(shù)目,用g_hFullSemaphore表示,其初始值為有界緩沖區(qū)的大小SIZE_OF_BUFFER;另一個(gè)表示緩沖區(qū)中產(chǎn)品的數(shù)目,用g_hEmptySemaphore表示,其初始值為0.另外,由于有界緩沖區(qū)是一個(gè)臨界資源,必須互斥使用,所以還需要在設(shè)置一個(gè)互斥信號(hào)量g_hMutex,初始值為1.P原語的主要?jiǎng)幼魇牵?sem減1; 假設(shè)sem減一后仍大于或等于零,那么進(jìn)程繼續(xù)執(zhí)行; 假設(shè)sem減一后小于零,那么該進(jìn)程被阻塞后入與該信號(hào)相對(duì)應(yīng)的隊(duì)列中,然后轉(zhuǎn)進(jìn)程調(diào)度。V原語的操作主要?jiǎng)幼魇牵?sem加1
5、; 假設(shè)相加結(jié)果大于零,進(jìn)程繼續(xù)執(zhí)行;假設(shè)相加結(jié)果小于或等于零,那么從該信號(hào)的等待隊(duì)列中喚醒一等待進(jìn)程然后再返回原進(jìn)程繼續(xù)執(zhí)行或轉(zhuǎn)進(jìn)程調(diào)度。采用的同步方法:1利用函數(shù)CreateMutex(NULL,FALSE,NULL)創(chuàng)立互斥信號(hào)量g_hMutex,表示緩沖區(qū)當(dāng)前的狀態(tài),假設(shè)為true時(shí),那么表示緩沖區(qū)正被別的進(jìn)程使用。三個(gè)參數(shù)表示的意義分別為:指向平安屬性的指針,初始化互斥對(duì)象的所有者,指向互斥對(duì)象名的指針。2利用函數(shù)CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL)創(chuàng)立緩沖區(qū)滿的信號(hào)量g_hFullSemaphore
6、,值為true時(shí)表示緩沖區(qū)已滿。四個(gè)參數(shù)分別為:表示是否允許繼承、設(shè)置信號(hào)機(jī)的初始計(jì)數(shù)、設(shè)置信號(hào)機(jī)的最大計(jì)數(shù)、指定信號(hào)機(jī)對(duì)象的名稱-1是因?yàn)橛?jì)數(shù)從開始。3利用函數(shù)CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL)創(chuàng)立緩沖區(qū)空的信號(hào)量g_hEmptySemaphore,該值為true時(shí)表示緩沖區(qū)為空。5、數(shù)據(jù)定義及其詳細(xì)解釋const unsigned short SIZE_OF_BUFFER = 20; /緩沖區(qū)長度 unsigned short ProductID = 0; /產(chǎn)品號(hào) unsigned short ConsumeID = 0; /將被消
7、耗的產(chǎn)品號(hào) unsigned short in = 0; /產(chǎn)品進(jìn)緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo) unsigned short out = 0; /產(chǎn)品出緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo) int g_bufferSIZE_OF_BUFFER; /緩沖區(qū)是個(gè)循環(huán)隊(duì)列 bool g_continue = true; /使程序跳出循環(huán),控制程序結(jié)束 HANDLE g_hMutex; /用于線程間的互斥 HANDLE g_hFullSemaphore; /當(dāng)緩沖區(qū)滿時(shí)迫使生產(chǎn)者等待 HANDLE g_hEmptySemaphore; /當(dāng)緩沖區(qū)空時(shí)迫使消費(fèi)者等待 DWORD WINAPI Producer(LPVOID);
8、 /生產(chǎn)者線程 DWORD WINAPI Consumer(LPVOID); /消費(fèi)者線程 3詳細(xì)設(shè)計(jì)及編碼流程圖生產(chǎn)者:sem=sem-1入口s>=0調(diào)用進(jìn)程入等待隊(duì)列轉(zhuǎn)進(jìn)程調(diào)度返回是否消費(fèi)者:入 口sem=sem-1 sem=sem-1S<=0喚醒等待隊(duì)列中的一個(gè)進(jìn)程式返回或轉(zhuǎn)進(jìn)程調(diào)度 返回否是程序清單 1.存儲(chǔ)結(jié)構(gòu)定義 利用信號(hào)量解決生產(chǎn)者消費(fèi)者問題 const unsigned short SIZE_OF_BUFFER = 10; /緩沖區(qū)長度 unsigned short ProductID = 0; /產(chǎn)品號(hào) unsigned short ConsumeID = 0;
9、/將被消耗的產(chǎn)品號(hào) unsigned short in = 0; /產(chǎn)品進(jìn)緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo) unsigned short out = 0; /產(chǎn)品出緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo) int g_bufferSIZE_OF_BUFFER; /緩沖區(qū)是個(gè)循環(huán)隊(duì)列 bool g_continue = true; /控制程序結(jié)束 HANDLE g_hMutex; /用于線程間的互斥 HANDLE g_hFullSemaphore; /當(dāng)緩沖區(qū)滿時(shí)迫使生產(chǎn)者等待 HANDLE g_hEmptySemaphore; /當(dāng)緩沖區(qū)空時(shí)迫使消費(fèi)者等待 DWORD WINAPI Producer(LPVOID); /生產(chǎn)
10、者線程 DWORD WINAPI Consumer(LPVOID); /消費(fèi)者線程 2.算法相關(guān)的函數(shù) 1創(chuàng)立各個(gè)互斥信號(hào)以及生產(chǎn)者線程和消費(fèi)者線程的函數(shù)在如下主函數(shù)里面所示: int main() /創(chuàng)立各個(gè)互斥信號(hào) 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)整
11、下面的數(shù)值,可以發(fā)現(xiàn),當(dāng)生產(chǎn)者個(gè)數(shù)多于消費(fèi)者個(gè)數(shù)時(shí), /生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費(fèi)者;反之,消費(fèi)者經(jīng)常等待。 const unsigned short PRODUCERS_COUNT = 3; /生產(chǎn)者的個(gè)數(shù) const unsigned short CONSUMERS_COUNT = 1; /消費(fèi)者的個(gè)數(shù) /總的線程數(shù) const unsigned short THREADS_COUNT PRODUCERS_COUNT+CONSUMERS_COUNT; HANDLE hThreadsPRODUCERS_COUNT; /各線程的handle DWORD producerIDCONSUMER
12、S_COUNT; /生產(chǎn)者線程的標(biāo)識(shí)符 DWORD consumerIDTHREADS_COUNT; /消費(fèi)者線程的標(biāo)識(shí)符 /創(chuàng)立生產(chǎn)者線程 for (int i=0;i hThreadsi=CreateThread(NULL,0,Producer,NULL,0,&producerIDi); if (hThreadsi=NULL) return -1; /創(chuàng)立消費(fèi)者線程 for ( i=0;i hThreadsPRODUCERS_COUNT+i=CreateThread(NULL,0,Consumer,NULL,0 &consumerIDi); if (hThreadsi=NU
13、LL) return -1; while(g_continue) if(getchar() /按回車后終止程序運(yùn)行 g_continue = false; return 0; (2) 生產(chǎn)者生產(chǎn)一個(gè)產(chǎn)品的函數(shù): /生產(chǎn)一個(gè)產(chǎn)品。簡單模擬了一下,僅輸出新產(chǎn)品的ID號(hào) void Produce() std:cerr << "Producing " << +ProductID << " * " std:cerr << "Succeed" << std:endl; 3把新生產(chǎn)的產(chǎn)品放
14、入緩沖區(qū)的函數(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ū)當(dāng)前的狀態(tài)的函數(shù): /輸出緩沖區(qū)當(dāng)前的狀態(tài) for (int i=0;i std:cout << i <<": " << g_buff
15、eri; if (i=in) std:cout << " <- 生產(chǎn)" if (i=out) std:cout << " <- 消費(fèi)" std:cout << std:endl; 從緩沖區(qū)中取出一個(gè)產(chǎn)品的函數(shù): /從緩沖區(qū)中取出一個(gè)產(chǎn)品 void Take() std:cerr << "Taking a product * " ConsumeID = g_bufferout; out = (out+1)%SIZE_OF_BUFFER; 利用信號(hào)量解決生產(chǎn)者消費(fèi)者問題 std:
16、cerr << "Succeed" << std:endl; 5輸出緩沖區(qū)當(dāng)前的狀態(tài)的函數(shù): /輸出緩沖區(qū)當(dāng)前的狀態(tài) for (int i=0;i std:cout << i <<": " << g_bufferi; if (i=in) std:cout << " <- 生產(chǎn)" if (i=out) std:cout << " <- 消費(fèi)" std:cout << std:endl; 6消耗一個(gè)產(chǎn)品的函數(shù):
17、/消耗一個(gè)產(chǎn)品 void Consume() std:cerr << "Consuming " << ConsumeID << " * " std:cerr << "Succeed" << std:endl; 3.生產(chǎn)者和消費(fèi)者算法 1生產(chǎn)者算法: /生產(chǎn)者 DWORD WINAPI Producer(LPVOID lpPara) while(g_continue) WaitForSingleObject(g_hFullSemaphore,INFINITE); WaitFor
18、SingleObject(g_hMutex,INFINITE); Produce(); Append(); Sleep(1500); ReleaseMutex(g_hMutex); ReleaseSemaphore(g_hEmptySemaphore,1,NULL); return 0; 2消費(fèi)者算法: /消費(fèi)者 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運(yùn)行結(jié)果分析輸入輸出數(shù)據(jù)說明和分析:該程序設(shè)置的緩沖區(qū)數(shù)據(jù)長度為20,生產(chǎn)者個(gè)數(shù)為3,消費(fèi)者個(gè)數(shù)為1,程序啟動(dòng)后,生產(chǎn)者先進(jìn)行生產(chǎn),當(dāng)3個(gè)生產(chǎn)者全部生產(chǎn)完之后,消費(fèi)者開始從緩沖區(qū)中取出產(chǎn)品,當(dāng)消費(fèi)者取出一個(gè)后,
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 紙漿篩選與凈化設(shè)備的運(yùn)行與維護(hù)考核試卷
- 海洋油氣開采中的海洋生物多樣性保護(hù)考核試卷
- 紙板容器生命周期分析考核試卷
- 終端設(shè)備在水下通信技術(shù)考核試卷
- 林業(yè)與地方特色農(nóng)產(chǎn)品的區(qū)域品牌營銷考核試卷
- 纖維素纖維在聲學(xué)材料中的應(yīng)用考核試卷
- 種子種苗在氣候變化適應(yīng)中的作用考核試卷
- 玻璃纖維增強(qiáng)型塑料水處理設(shè)備的制備考核試卷
- 畜禽智能養(yǎng)殖環(huán)境監(jiān)測(cè)與調(diào)控系統(tǒng)考核試卷
- 南京旅游職業(yè)學(xué)院《交通運(yùn)輸工程前沿講座》2023-2024學(xué)年第二學(xué)期期末試卷
- 2022年鄭州信息科技職業(yè)學(xué)院職業(yè)適應(yīng)性測(cè)試模擬試題及答案解析
- 國際五一勞動(dòng)節(jié)頒獎(jiǎng)榮譽(yù)晚會(huì)動(dòng)態(tài)PPT模板
- 全息經(jīng)絡(luò)刮痧療法(內(nèi)部培訓(xùn))課件
- 全院CRRT護(hù)理技能培訓(xùn)理論考核試題及答案
- 消防安全知識(shí)課件PPT(72張)
- 后勤不“后”與“時(shí)”俱進(jìn)——信息技術(shù)促幼兒園保育員專業(yè)化發(fā)展的研究
- 公共廁所除臭工程設(shè)計(jì)方案和對(duì)策
- 約克YCWS維修技術(shù)手冊(cè)
- 危巖體穩(wěn)定性計(jì)算--傾倒式
- 煤礦測(cè)量技術(shù)管理系統(tǒng)規(guī)定
- 課本劇《劉姥姥進(jìn)大觀園》劇本
評(píng)論
0/150
提交評(píng)論