版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、置嫉工建院課程設(shè)計報告課程名:操作系統(tǒng)專 業(yè)學(xué)生姓名班 級學(xué) 號指導(dǎo)教師完成日期博雅學(xué)院“操作系統(tǒng)課程設(shè)計報告生產(chǎn)者-消費(fèi)者問題的模擬實現(xiàn)1 .課程設(shè)計的目的本課程設(shè)計是學(xué)習(xí)完“操作系統(tǒng)原理課程后進(jìn)行的一次全面的綜合練習(xí),通 過課程設(shè)計,更好地掌握操作系統(tǒng)的原理及實現(xiàn)方法,加深對操作系統(tǒng)根底理論和 重要算法的理解,增強(qiáng)學(xué)生的動手水平.2 .設(shè)計內(nèi)容2.1 概述用多進(jìn)程同步方法解決生產(chǎn)者-消費(fèi)者問題,C或C+語言實現(xiàn).通過研究Linux的進(jìn)程機(jī)制和信號量實現(xiàn)生產(chǎn)者消費(fèi)者問題的并發(fā)限制.說明:有界緩沖區(qū)內(nèi)設(shè)有20個存儲單元,放入/取出的數(shù)據(jù)項設(shè)定為1-20這20個 整型數(shù).設(shè)計要求:1每個生產(chǎn)者和
2、消費(fèi)者對有界緩沖區(qū)進(jìn)行操作后,即時顯示有界緩沖區(qū)的全部內(nèi)容,當(dāng)前指針位置和生產(chǎn)者/消費(fèi)者縣城的標(biāo)識符.2生產(chǎn)者和消費(fèi)者各 有兩個以上.3多個生產(chǎn)者或多個消費(fèi)者之間須有共享對緩沖區(qū)進(jìn)行操作的函數(shù)代 碼.2.2 設(shè)計原理多進(jìn)程是一種非常簡潔的多任務(wù)操作方式.在Linux系統(tǒng)下,啟動一個新的進(jìn)程必須分配給它獨立的地址空間,建立眾多的數(shù)據(jù)表來維護(hù)它的代碼段、堆棧段和 數(shù)據(jù)段,這是一種煩瑣的多任務(wù)工作方式.生產(chǎn)者-消費(fèi)者方案是多進(jìn)程應(yīng)用程序開發(fā)中最常用的構(gòu)造之一.因此困難也在 于此.由于在一個應(yīng)用程序中可以屢次重復(fù)生產(chǎn)者-消費(fèi)者行為,其代碼也可以如此. 設(shè)計中創(chuàng)立了 Consumer類,該類通過在一些多
3、進(jìn)程應(yīng)用程序中促進(jìn)代碼重用以及 簡化代碼調(diào)試和維護(hù)來解決這個問題.多進(jìn)程應(yīng)用程序通常利用生產(chǎn)者-消費(fèi)者編程方案,其中由生產(chǎn)者進(jìn)程創(chuàng)立重復(fù)性作業(yè),將其傳遞給作業(yè)隊列,然后由消費(fèi)者進(jìn) 程處理作業(yè).多進(jìn)程是一種使應(yīng)用程序能同時處理多個操作的編程技術(shù).通常有兩種不同類型的多進(jìn)程操作使用多個進(jìn)程:適時事件,當(dāng)作業(yè)必須在特定的時間或在特定的問 隔內(nèi)調(diào)度執(zhí)行時;后臺處理,當(dāng)后臺事件必須與當(dāng)前執(zhí)行流并行處理或執(zhí)行時;適 時事件的例如包括程序提醒、超時事件以及諸如輪詢和刷新之類的重復(fù)性操作.后 臺處理的例如包括等待發(fā)送的包或等待處理的已接收的消息.生產(chǎn)者-消費(fèi)者方案很適合于后臺處理類別的情況.這些情況通常圍繞一
4、個作業(yè) “生產(chǎn)者方和一個作業(yè)“消費(fèi)者方.當(dāng)然,關(guān)于作業(yè)并行執(zhí)行還有其它考慮事 項.在大多數(shù)情況下,對于使用同一資源的作業(yè),應(yīng)以FCFS的方式按順序處理,這 可以通過使用單進(jìn)程的消費(fèi)者輕松實現(xiàn).通過使用這種方法,使用單個進(jìn)程來訪問 單個資源,而不是用多個進(jìn)程來訪問單個資源.要啟用標(biāo)準(zhǔn)消費(fèi)者,當(dāng)作業(yè)到來時 創(chuàng)立一個作業(yè)隊列來存儲所有作業(yè).生產(chǎn)者進(jìn)程通過將新對象添加到消費(fèi)者隊列來 交付這個要處理的新對象.然后消費(fèi)者進(jìn)程從隊列取出每個對象,并依次處理.當(dāng) 隊列為空時,消費(fèi)者進(jìn)入休眠.當(dāng)新的對象添加到空隊列時,消費(fèi)者會醒來并處理 該對象.2.3 詳細(xì)設(shè)計及編碼(1)調(diào)試問題分析為解決生產(chǎn)者/消費(fèi)者問題,
5、應(yīng)該設(shè)置兩個資源信號量,其中一個表示空緩沖區(qū) 的數(shù)目,用Full表示,其初始值為有界緩沖區(qū)的大小 BUFFER_NUM ;另一個表示 緩沖區(qū)中產(chǎn)品的數(shù)目,用 Empty表示,其初始值為00另外,由于有界緩沖區(qū)是一 個臨界資源,必須互斥使用,所以還需要再設(shè)置一個互斥信號量 Mutex,起初值為1.在生產(chǎn)者/消費(fèi)者問題中,信號量實現(xiàn)兩種功能.首先,它是生產(chǎn)產(chǎn)品和消費(fèi)產(chǎn) 品的計數(shù)器,計數(shù)器的初始值是可利用的資源數(shù)目(有界緩沖區(qū)的長度).其次,它是 保證產(chǎn)品的生產(chǎn)者和消費(fèi)者之間動作同步的同步器.生產(chǎn)者要生產(chǎn)一個產(chǎn)品時,首先對資源信號量Full和互斥信號量Mutex進(jìn)行P操作,申請資源.如果可以通過的話
6、,就生產(chǎn)一個產(chǎn)品,并把產(chǎn)品送入緩沖區(qū).然 后對互斥信號量Mutex和資源信號量Empty進(jìn)行V操作,釋放資源.消費(fèi)者要消費(fèi)一個產(chǎn)品時,首先對資源信號量Empty和互斥信號量Mutex進(jìn)行P操作,申請資源.如果可以通過的話,就從緩沖區(qū)取出一個產(chǎn)品并消費(fèi)掉.然后 對互斥信號量Mutex和資源信號量Full進(jìn)行V操作,釋放資源.如果緩沖區(qū)中已經(jīng)沒有可用資源,就把申請資源的進(jìn)程添加到等待隊列的隊尾. 如果有一個資源被釋放,在等待隊列中的第一個進(jìn)程被喚醒并取得這個資源的使用 權(quán).(2)流程圖圖2-1生產(chǎn)者流程圖圖2-2消費(fèi)者流程圖(3)源程序#include #include #include #inc
7、lude typedef HANDLE Semaphore; / 信號量的 Windows 原型#define P(S) WaitForSingleObject(S,INFINITE) / 定義 Windows下的 P操作#define V(S) ReleaseSemaphore(S,1,NULL) / 定義 Windows下的 V作#define rate 1000# define CONSUMER_NUM 2 /*消費(fèi)者個數(shù)*/# define PRODUCER_NUM 3/*生產(chǎn)者個數(shù) */# define BUFFER_NUM 20/*緩沖區(qū)個數(shù)*/雪碧char *thing8 = 豆
8、漿,油條,燒餅,牛奶,包子,燒賣,煎蛋,; /生產(chǎn)和消費(fèi)的產(chǎn)品名稱struct Bufferint productBUFFER_NUM; / 緩沖區(qū)int start,end; /兩個指針相當(dāng)于教材中的in out指針g_buf;Semaphore Empty,Full,Mutex;/分別相當(dāng)于Empty, Full, Mutex三個信號量/*消費(fèi)者線程 */DWORD WINAPI Consumer(LPVOID para)/ i表示第i個消費(fèi)者int i = *(int *)para; / 利用para傳入當(dāng)前消費(fèi)者的編號int ptr; / 待消費(fèi)的內(nèi)容的指針printf(消費(fèi)者1d:需
9、要資源n, i);int j=0;while (j+4) /等待產(chǎn)品P(Full);/有產(chǎn)品,先鎖住緩沖區(qū)P(Mutex);/記錄消費(fèi)的物品ptr=g_buf.start;/再移動緩沖區(qū)指針g_buf.start= (g_buf.start+1)%BUFFER_NUM ;/讓其他消費(fèi)者或生產(chǎn)者使用printf ( 消費(fèi)者 %01d: 我需要 buf%d=%sn , i, ptr, thingg_ductptr);/ 消費(fèi)完畢,并釋放一個緩沖printf ( 消費(fèi)者 %01d:我消費(fèi)完畢 %sn, i,thingg_ductptr);V(Mutex);V(Empty)
10、;Sleep(rate*rand()%10+110);return 0;*生產(chǎn)者線程 */DWORD WINAPI Producer(LPVOID para) int i = *(int *)para - CONSUMER_NUM;int ptr;int data; 產(chǎn)品int j=0;while(j+4)data=rand()%8;printf (生產(chǎn)者 %01d: 生產(chǎn)出:%s!n, i,thingdata);/等待存放空間P(Empty);/有地方,先鎖住緩沖區(qū)P(Mutex);/記錄消費(fèi)的物品ptr=g_buf.end;/再移動緩沖區(qū)指針g_buf.end =(g_buf.end+1)
11、%BUFFER_NUM;printf (生產(chǎn)者 %01d: 放到緩沖區(qū) buf%d=%sn, i,ptr,thingdata); g_ductptr=data ;/放好了完畢,釋放一個產(chǎn)品/讓其他消費(fèi)者或生產(chǎn)者使用V(Mutex);V(Full);Sleep(rate/2*rand()%10+110);return 0; int main(int argc,char *argv口)/線程技術(shù),前面為消費(fèi)者線程,后面為生產(chǎn)者線程HANDLE hThreadCONSUMER_NUM+PRODUCER_NUM; / 線程計數(shù)srand(time(NULL); rand();DWORD
12、tid; int i=0; / 初始化信號量Mutex=CreateSemaphore(NULL,1,1,MutexOfConsumerAndProducer); Empty=CreateSemaphore(NULL, BUFFER_NUM, BUFFER_NUM, BufferSemaphone);Full=CreateSemaphore(NULL,0,BUFFER_NUM,ProductSemaphone); if(!Empty|!Full|!Mutex) ( printf(Create Semaphone Error!n); return -1;int totalThreads=CONS
13、UMER_NUM+PRODUCER_NUM;/開啟消費(fèi)者線程printf(先請消費(fèi)者上席!n);for(i=0;iCONSUMER_NUM; i+) (hThreadi=CreateThread(NULL, 0, Consumer, &i,0,&tid); if(hThreadi)WaitForSingleObject(hThreadi,10); printf(生產(chǎn)者就位!n);for(;ibi*4=雪碧 燒餅,.W hifLBK燒燃 要mF4=雪碧一 IB三1 12 2 13 P 者醛者者者者 產(chǎn),產(chǎn)產(chǎn)產(chǎn)產(chǎn)產(chǎn)sirhuELitn=牛奶:我需要力=油條buS= 弋需切咱15】J 藕生燒餅早產(chǎn)田
14、.浦莖.放到緩沖株條山1111=油條key to continue沖區(qū)hnfL7卜油條:燒賣,放到緩沖區(qū)皿打=燒賣生產(chǎn)出:豆?jié){,我需要bu6=施餅我嫌完畢燒神_后放到制能 buf【9h豆?jié){ 生產(chǎn)缶牛沏, 生產(chǎn)出二牛奶,4設(shè)計小結(jié)本次課程設(shè)計通過模擬計算機(jī)操作系統(tǒng)中經(jīng)典的“生產(chǎn)者一消費(fèi)者問題,穩(wěn)固了我在操作系統(tǒng)原理課上所學(xué)的知識,加深了對操作系統(tǒng)中進(jìn)程同步和互斥等問題,完成了多進(jìn)程同步方法解決生產(chǎn)者-消費(fèi)者問題全部過程,結(jié)果滿足設(shè)計要求.設(shè)計過程中遇到不少困難,在反復(fù)研究老師的PPT及課本的原理后才逐漸明晰怎樣將代碼實現(xiàn),雖然這學(xué)期學(xué)過 Java, ! java不是很熟悉,因此還是選擇 C+語 言.以前學(xué)習(xí)C+沒有深入了解到線程這個概念,在學(xué)習(xí)Java的時候才知道有專門的線程類.所以我在網(wǎng)上也參考了其他人用C+編寫尤其是關(guān)于多進(jìn)程程序的設(shè)計實現(xiàn).在代碼的實現(xiàn)過程中,我是主要定義了兩個函數(shù) DWORD WINAPI Consumer(LPVOID para)和 DWORD WINAPI Producer(LPVOID para),在這兩 個函數(shù)中實現(xiàn)PV操作.通過本次設(shè)計,我較好地掌握了通過研究Linux的進(jìn)程機(jī)制和信號量實現(xiàn)生產(chǎn)者消費(fèi)者問題的并發(fā)限制全過程,尤其是對多進(jìn)程程序設(shè)計方法有了更深的理解, 開拓了思路,鍛煉了實踐動手能手.但是我覺
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度奶茶店加盟店形象設(shè)計與裝修合同
- 2025版甲級寫字樓租賃合同模板3篇
- 2024年度影視后期制作團(tuán)隊合作合同2篇
- 中草藥園藝合作與利潤分配合同
- 2025版專科診所精準(zhǔn)用藥采購合作協(xié)議3篇
- 2024年石材與瓷磚墻地磚購銷及施工指導(dǎo)協(xié)議3篇
- 自媒體運(yùn)營合伙經(jīng)營協(xié)議書
- 2024年自愿離婚協(xié)議書范本-無房房產(chǎn)分割及子女撫養(yǎng)6篇
- 2024年燃料油質(zhì)量檢測與分析服務(wù)合同3篇
- 2024年度國際貨物運(yùn)輸與運(yùn)費(fèi)支付規(guī)范合同2篇
- 2024版《糖尿病健康宣教》課件
- 期末 (試題) -2024-2025學(xué)年人教PEP版英語四年級上冊
- GB/T 44127-2024行政事業(yè)單位公物倉建設(shè)與運(yùn)行指南
- 2021-2022學(xué)年遼寧省大連市沙河口區(qū)北師大版五年級上冊期末測試數(shù)學(xué)試卷【含答案】
- MOOC 憲法學(xué)-西南政法大學(xué) 中國大學(xué)慕課答案
- 廣東省中山市2022-2023學(xué)年高一上學(xué)期期末考試物理試題
- 是誰殺死了周日
- 小學(xué)英語新思維朗文2A知識清單總結(jié)期末復(fù)習(xí)資料
- 03S702鋼筋混凝土化糞池圖集
- 牙科診所工作職責(zé)
- 完整版英文CV模板
評論
0/150
提交評論