版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、課程設(shè)計(jì)報(bào)告課程名:操作系統(tǒng)專業(yè)學(xué)生姓名班級學(xué)號指導(dǎo)教師完成日期博雅學(xué)院“操作系統(tǒng)”課程設(shè)計(jì)報(bào)告 生產(chǎn)者 -消費(fèi)者問題的模擬實(shí)現(xiàn)1. 課程設(shè)計(jì)的目的本課程設(shè)計(jì)是學(xué)習(xí)完“操作系統(tǒng)原理”課程后進(jìn)行的一次全面的綜合訓(xùn)練,通過課程設(shè)計(jì),更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,加深對操作系統(tǒng)基礎(chǔ)理論和重要算法的理解,加強(qiáng)學(xué)生的動手能力。2設(shè)計(jì)內(nèi)容2.1 概述用多進(jìn)程同步方法解決生產(chǎn)者-消費(fèi)者問題, C 或 C+語言實(shí)現(xiàn)。通過研究 Linux 的進(jìn)程機(jī)制和信號量實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題的并發(fā)控制。說明 :有界緩沖區(qū)內(nèi)設(shè)有 20 個(gè)存儲單元 ,放入 /取出的數(shù)據(jù)項(xiàng)設(shè)定為 1-20 這 20 個(gè)整型數(shù)。設(shè)計(jì)要求 :(
2、1)每個(gè)生產(chǎn)者和消費(fèi)者對有界緩沖區(qū)進(jìn)行操作后 ,即時(shí)顯示有界緩沖區(qū)的全部內(nèi)容,當(dāng)前指針位置和生產(chǎn)者 /消費(fèi)者縣城的標(biāo)識符。 (2)生產(chǎn)者和消費(fèi)者各有兩個(gè)以上。 (3)多個(gè)生產(chǎn)者或多個(gè)消費(fèi)者之間須有共享對緩沖區(qū)進(jìn)行操作的函數(shù)代碼。2.2 設(shè)計(jì)原理多進(jìn)程是一種非常簡潔的多任務(wù)操作方式。在 Linux 系統(tǒng)下,啟動一個(gè)新的進(jìn)程必須分配給它獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來維護(hù)它的代碼段、堆棧段和數(shù)據(jù)段,這是一種煩瑣的多任務(wù)工作方式。生產(chǎn)者 -消費(fèi)者方案是多進(jìn)程應(yīng)用程序開發(fā)中最常用的構(gòu)造之一。因此困難也在于此。因?yàn)樵谝粋€(gè)應(yīng)用程序中可以多次重復(fù)生產(chǎn)者 -消費(fèi)者行為,其代碼也可以如此。設(shè)計(jì)中創(chuàng)建了 Con
3、sumer 類,該類通過在一些多進(jìn)程應(yīng)用程序中促進(jìn)代碼重用以及簡化代碼調(diào)試和維護(hù)來解決這個(gè)問題。多進(jìn)程應(yīng)用程序通常利用生產(chǎn)者 -消費(fèi)者編程方案,其中由生產(chǎn)者進(jìn)程創(chuàng)建重復(fù)性作業(yè),將其傳遞給作業(yè)隊(duì)列,然后由消費(fèi)者進(jìn)程處理作業(yè)。多進(jìn)程是一種使應(yīng)用程序能同時(shí)處理多個(gè)操作的編程技術(shù)。通常有兩種不同類- 1 -型的多進(jìn)程操作使用多個(gè)進(jìn)程:適時(shí)事件,當(dāng)作業(yè)必須在特定的時(shí)間或在特定的間隔內(nèi)調(diào)度執(zhí)行時(shí);后臺處理,當(dāng)后臺事件必須與當(dāng)前執(zhí)行流并行處理或執(zhí)行時(shí);適時(shí)事件的示例包括程序提醒、超時(shí)事件以及諸如輪詢和刷新之類的重復(fù)性操作。后臺處理的示例包括等待發(fā)送的包或等待處理的已接收的消息。生產(chǎn)者 -消費(fèi)者方案很適合于后
4、臺處理類別的情況。這些情況通常圍繞一個(gè)作業(yè)“生產(chǎn)者”方和一個(gè)作業(yè)“消費(fèi)者”方。當(dāng)然,關(guān)于作業(yè)并行執(zhí)行還有其它考慮事項(xiàng)。在大多數(shù)情況下, 對于使用同一資源的作業(yè),應(yīng)以 FCFS 的方式按順序處理,這可以通過使用單進(jìn)程的消費(fèi)者輕松實(shí)現(xiàn)。通過使用這種方法,使用單個(gè)進(jìn)程來訪問單個(gè)資源,而不是用多個(gè)進(jìn)程來訪問單個(gè)資源。要啟用標(biāo)準(zhǔn)消費(fèi)者,當(dāng)作業(yè)到來時(shí)創(chuàng)建一個(gè)作業(yè)隊(duì)列來存儲所有作業(yè)。生產(chǎn)者進(jìn)程通過將新對象添加到消費(fèi)者隊(duì)列來交付這個(gè)要處理的新對象。然后消費(fèi)者進(jìn)程從隊(duì)列取出每個(gè)對象,并依次處理。當(dāng)隊(duì)列為空時(shí),消費(fèi)者進(jìn)入休眠。當(dāng)新的對象添加到空隊(duì)列時(shí),消費(fèi)者會醒來并處理該對象。2.3 詳細(xì)設(shè)計(jì)及編碼( 1)調(diào)試問
5、題分析為解決生產(chǎn)者 / 消費(fèi)者問題,應(yīng)該設(shè)置兩個(gè)資源信號量,其中一個(gè)表示空緩沖區(qū)的數(shù)目,用 Full 表示,其初始值為有界緩沖區(qū)的大小 BUFFER_NUM ;另一個(gè)表示緩沖區(qū)中產(chǎn)品的數(shù)目,用 Empty 表示,其初始值為 0。另外,由于有界緩沖區(qū)是一個(gè)臨界資源,必須互斥使用,所以還需要再設(shè)置一個(gè)互斥信號量 Mutex,起初值為 1。在生產(chǎn)者 / 消費(fèi)者問題中,信號量實(shí)現(xiàn)兩種功能。首先,它是生產(chǎn)產(chǎn)品和消費(fèi)產(chǎn)品的計(jì)數(shù)器, 計(jì)數(shù)器的初始值是可利用的資源數(shù)目(有界緩沖區(qū)的長度 )。其次,它是確保產(chǎn)品的生產(chǎn)者和消費(fèi)者之間動作同步的同步器。生產(chǎn)者要生產(chǎn)一個(gè)產(chǎn)品時(shí),首先對資源信號量Full 和互斥信號量M
6、utex 進(jìn)行 P操作,申請資源。如果可以通過的話,就生產(chǎn)一個(gè)產(chǎn)品,并把產(chǎn)品送入緩沖區(qū)。然后對互斥信號量 Mutex 和資源信號量 Empty 進(jìn)行 V 操作,釋放資源。消費(fèi)者要消費(fèi)一個(gè)產(chǎn)品時(shí),首先對資源信號量Empty 和互斥信號量 Mutex 進(jìn)行P 操作,申請資源。如果可以通過的話,就從緩沖區(qū)取出一個(gè)產(chǎn)品并消費(fèi)掉。然后對互斥信號量 Mutex 和資源信號量 Full 進(jìn)行 V 操作,釋放資源。如果緩沖區(qū)中已經(jīng)沒有可用資源, 就把申請資源的進(jìn)程添加到等待隊(duì)列的隊(duì)尾。如果有一個(gè)資源被釋放,在等待隊(duì)列中的第一個(gè)進(jìn)程被喚醒并取得這個(gè)資源的使用權(quán)。- 2 -( 2)流程圖生產(chǎn)者線程開未 通資源信號
7、量 P過操作互斥信號量 P操作線程自我阻塞生產(chǎn)一個(gè)產(chǎn)品添加到等待隊(duì)把產(chǎn)品送入緩沖區(qū)列互斥信號量V操作等待隊(duì)列中有消費(fèi)者線N資源信號量V操作通過通未 通過過線程自我阻塞添加到等待隊(duì)列Y喚醒對頭的消費(fèi)者線程Y等待隊(duì)列中有喚醒對頭的消費(fèi)者消費(fèi)者線線程未通生產(chǎn)者線程結(jié)圖 2-1 生產(chǎn)者流程圖- 3 -未通線程自我阻塞添加到等待隊(duì)消費(fèi)者線程開資源信號量P 操通過互斥信號量P 操通從緩沖區(qū)取出一個(gè)線程自我阻塞消費(fèi)一個(gè)產(chǎn)品添加到等待隊(duì)互斥信號量VY等待隊(duì)列中有喚醒對頭的生產(chǎn)者線生產(chǎn)者線N資源信號量VY等待隊(duì)列中有喚醒對頭的生產(chǎn)者線生產(chǎn)者線消費(fèi)者線程結(jié)圖 2-2 消費(fèi)者流程圖- 4 -( 3)源程序#incl
8、ude#include#include#includetypedefHANDLE Semaphore;/信號量的 Windows 原型#defineP(S) WaitForSingleObject(S,INFINITE)/定義 Windows 下的 P操作#defineV(S) ReleaseSemaphore(S,1,NULL)/定義 Windows 下的 V操作#definerate 1000#defineCONSUMER_NUM2 /*消費(fèi)者個(gè)數(shù)*/#define PRODUCER_NUM 3/*生產(chǎn)者個(gè)數(shù)*/#define BUFFER_NUM20/*緩沖區(qū)個(gè)數(shù)*/char *thin
9、g8 = 豆?jié){ , 油條 , 燒餅 , 牛奶 , 包子 , 燒賣 , 煎蛋 , 雪碧;/生產(chǎn)和消費(fèi)的產(chǎn)品名稱struct Bufferint productBUFFER_NUM;/緩沖區(qū)int start,end;/兩個(gè)指針相當(dāng)于教材中的inout 指針g_buf;SemaphoreEmpty,Full,Mutex;/分別相當(dāng)于 Empty, Full, Mutex 三個(gè)信號量/*消費(fèi)者線程 */DWORD WINAPI Consumer(LPVOIDpara)/ i 表示第 i個(gè)消費(fèi)者inti = *(int *)para;/利用 para傳入當(dāng)前消費(fèi)者的編號intptr;/待消費(fèi)的內(nèi)容的指
10、針printf ( 消費(fèi)者 %1d:需要資源 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)者使用- 5 -printf (消費(fèi)者 %01d:我需要 buf%d=%sn , i, ptr, thingg_ductptr);/ 消費(fèi)完畢,并釋放一個(gè)緩沖printf ( 消費(fèi)者 %01d: 我消費(fèi)完畢 %sn, i,thingg_buf.pr
11、oductptr); V(Mutex);V(Empty);Sleep(rate*rand()%10+110);return 0;/*生產(chǎn)者線程 */DWORD WINAPI Producer(LPVOID para)inti = *(int *)para - CONSUMER_NUM;intptr;intdata;/產(chǎn)品intj=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;/ 再移
12、動緩沖區(qū)指針g_buf.end =(g_buf.end+1)%BUFFER_NUM;printf ( 生產(chǎn)者 %01d:放到緩沖區(qū)buf%d=%sn,i,ptr,thingdata);g_ductptr=data ;/ 放好了完畢,釋放一個(gè)產(chǎn)品/ 讓其他消費(fèi)者或生產(chǎn)者使用V(Mutex);V(Full);Sleep(rate/2*rand()%10+110);return 0;int main(int argc,char *argv)- 6 -/ 線程技術(shù),前面為消費(fèi)者線程,后面為生產(chǎn)者線程HANDLEhThreadCONSUMER_NUM+PRODUCER_NUM;/線程計(jì)數(shù)s
13、rand(time(NULL);rand();DWORDtid;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(CreateSemaphoneError!n);return-1;int
14、 totalThreads=CONSUMER_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(;itotalThreads;i+)hThreadi=CreateThread(NULL,0,Producer,&i,0,&tid);if(hThreadi)WaitFor
15、SingleObject(hThreadi,10);/ 生產(chǎn)者和消費(fèi)者的執(zhí)行WaitForMultipleObjects(totalThreads,hThread,TRUE,INFINITE);return 0;- 7 -3 結(jié)果及分析- 8 -4 設(shè)計(jì)小結(jié)本次課程設(shè)計(jì)通過模擬計(jì)算機(jī)操作系統(tǒng)中經(jīng)典的“生產(chǎn)者消費(fèi)者問題”,鞏固了我在操作系統(tǒng)原理課上所學(xué)的知識, 加深了對操作系統(tǒng)中進(jìn)程同步和互斥等問題,完成了多進(jìn)程同步方法解決生產(chǎn)者消費(fèi)者問題全部過程,結(jié)果滿足設(shè)計(jì)要求。設(shè)計(jì)過程中遇到不少困難,在反復(fù)研究老師的PPT 及課本的原理后才逐漸明晰怎樣將代碼實(shí)現(xiàn),雖然這學(xué)期學(xué)過Java,但 java 不是很熟悉,因此還是選擇C+語言。以前學(xué)習(xí) C+沒有深入了解到線程這個(gè)概念,在學(xué)習(xí) Java 的時(shí)候才知道有專門的線程類。所以我在網(wǎng)上也參考了其他人用 C+ 編寫尤其是關(guān)于多進(jìn)程程序的設(shè)計(jì)實(shí)現(xiàn)。在代碼的實(shí)現(xiàn)過程中,我是主要定義了兩個(gè)函數(shù)DWORDWINAPIConsumer(LPVOID para) 和 DWORD WINAPI Producer(LPVOID para),在這兩個(gè)函數(shù)中實(shí)現(xiàn) PV 操作。通過本次設(shè)計(jì),我較好地掌握了通過研究Linux 的進(jìn)程機(jī)制和信號量實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題的并發(fā)控制全過程,尤其是對多進(jìn)程程序設(shè)計(jì)方法有了更深的理解,開拓了思路,鍛煉了實(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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度高端寵物品種買賣及繁殖權(quán)轉(zhuǎn)讓合同范本3篇
- 2024版事業(yè)編人員聘用合同范本
- 2024消防設(shè)施改造合同范本
- 2025年度汽車用材料采購與銷售合作協(xié)議3篇
- 2024年食品加工生產(chǎn)外包合同
- 福建省南平市武夷山第二中學(xué)高一生物模擬試題含解析
- 福建省南平市外屯中學(xué)高一語文聯(lián)考試卷含解析
- 2025廠區(qū)綠化升級改造及養(yǎng)護(hù)綜合服務(wù)合同3篇
- 2024版事業(yè)單位醫(yī)療專業(yè)技術(shù)崗位聘用協(xié)議一
- 2024汽車美容店承包合同模板
- 2023-2024學(xué)年浙江省杭州市上城區(qū)教科版四年級上冊期末考試科學(xué)試卷
- 《三國志》導(dǎo)讀學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 期末 (試題) -2024-2025學(xué)年外研版(三起)(2024)英語三年級上冊
- 2023年成都溫江興蓉西城市運(yùn)營集團(tuán)有限公司招聘筆試題庫及答案解析
- 中國地圖標(biāo)準(zhǔn)版(可編輯顏色)
- 瑪氏銷售常用術(shù)語中英對照
- 上海牛津版三年級英語3B期末試卷及答案(共5頁)
- 公務(wù)員級別工資套改辦法
- 行為疼痛量表BPS
- 小學(xué)生必背古詩詞80首(硬筆書法田字格)
- 二年級上冊表內(nèi)乘法口算練習(xí)題(10套)
評論
0/150
提交評論