




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、嵌入式Linux編程課程設(shè)計題目:多線程實現(xiàn)生產(chǎn)者消費者之間的通信班 級: 計算機應(yīng)用xxxx班 學(xué) 號: 12號 姓 名: xx 指導(dǎo)教師: xxx 日 期: 2014.6.232014.6.27 目 錄13一、課程設(shè)計說明1二、概要設(shè)計1三、模塊設(shè)計2四、詳細(xì)設(shè)計4五、程序調(diào)試6六、總結(jié)8七、參考文獻9八、附錄10一、課程設(shè)計說明生產(chǎn)者-消費者(producer-consumer)問題,也稱作有界緩沖區(qū)(bounded-buffer)問題,兩個進程共享一個公共的固定大小的緩沖區(qū)。其中一個是生產(chǎn)者,用于將消息放入緩沖區(qū);另外一個是消費者,用于從緩沖區(qū)中取出消息。問題出現(xiàn)在當(dāng)緩沖區(qū)已經(jīng)滿了,而
2、此時生產(chǎn)者還想向其中放入一個新的數(shù)據(jù)項的情形,其解決方法是讓生產(chǎn)者此時進行休眠,等待消費者從緩沖區(qū)中取走了一個或者多個數(shù)據(jù)后再去喚醒它。同樣地,當(dāng)緩沖區(qū)已經(jīng)空了,而消費者還想去取消息,此時也可以讓消費者進行休眠,等待生產(chǎn)者放入一個或者多個數(shù)據(jù)時再喚醒它。本次課設(shè)通過研究Linux的進程機制和信號量實現(xiàn)生產(chǎn)者消費者問題的并發(fā)控制。二、概要設(shè)計本作業(yè)是完善課件上的線程綜合實例的練習(xí)生產(chǎn)者-消費者問題,重構(gòu)這個程序的框架,完成性能分析,使之進一步理解掌握Linux下線程的同步、通信以及互斥和多線程的安全問題。一般情況下,解決互斥方法常用信號量和互斥鎖,即semaphore和mutex,而解決這個問題
3、,多采用一個類似資源槽的結(jié)構(gòu),每個槽位標(biāo)示了指向資源的指針以及該槽位的狀態(tài),生產(chǎn)者和消費者互斥查詢資源槽,判斷是否有產(chǎn)品或者有空位可以生產(chǎn),然后根據(jù)指針進行相應(yīng)的操作。同時,為了告訴生產(chǎn)者或者消費者資源槽的情況,還要有一個消息傳送機制,無論是管道還是線程通信。然而,本次試驗有幾個特殊的要求:1、循環(huán)緩沖。2、除了stderr,stdout等外,只用小于2個的互斥鎖、3、放棄資源槽分配機制,采用額外的數(shù)據(jù)結(jié)構(gòu)。4、生產(chǎn)者一直持續(xù)生產(chǎn),形成生產(chǎn)消費的良性循環(huán)。首先,使用一個互斥鎖,意味著資源槽機制就不能使用了。因為資源槽雖以用一個互斥鎖完成,但是需要有額外的通信,如果使用管道通信,則管道也必須是互
4、斥,這就不滿足1個互斥鎖的要求。其次,要求生產(chǎn)者一直生產(chǎn),這就否定了另外一種方法:消費者、生產(chǎn)者的位置均平等,消費者消費的時候生產(chǎn)者不能生產(chǎn),生產(chǎn)者生產(chǎn)的時候消費者不能消費。因此,就需要采用A要求,也就是循環(huán)鏈表的形式。為了保證互斥要求,需要定義一個數(shù)據(jù)結(jié)構(gòu),這個數(shù)據(jù)結(jié)構(gòu)包含兩個指針,一個讀一個寫,同時有一個資源數(shù)目量,告訴生產(chǎn)者和消費者是否可以生產(chǎn)或者消費。由于該數(shù)據(jù)結(jié)構(gòu)很小,因而可以對此結(jié)構(gòu)互斥訪問。同時,對于每組數(shù)據(jù),都有一個標(biāo)志位,表示此組數(shù)據(jù)是否被占用,生產(chǎn)者和消費者均可以先占用此位置然后完成相應(yīng)的操作。當(dāng)消費者互斥訪問此結(jié)構(gòu)時,首先判斷是否有數(shù)據(jù)可以取,如果沒有,直接等待,若有數(shù)據(jù)
5、可取,先更改標(biāo)志位占用此數(shù)據(jù),并將資源數(shù)目-1。然后交出互斥,把數(shù)據(jù)拷貝到自己緩沖區(qū)內(nèi),清空數(shù)據(jù)。當(dāng)生產(chǎn)者訪問時,首先判斷有沒有空位可以生產(chǎn),如果沒有,直接等待,若有數(shù)據(jù)可以生產(chǎn),先判斷該位是否被占用,如果沒被占用,則占用此位置進行生產(chǎn)。生產(chǎn)完成后,將占用位改為未占用,同時將資源數(shù)目+1。三、模塊設(shè)計采用信號量來解決n個進程的臨界區(qū)問題,這n個進程共享一個信號量mutex(mutual exclusion),并初始化為1。利用p ,v原語操作結(jié)合信號量實現(xiàn)生產(chǎn)者和消費者進程對緩沖區(qū)的互斥訪問。3.1 生產(chǎn)者進程 if(fork() = 0 ) int i = 0; while( i 100)
6、semop(emptyid , &P ,1 );semop(mutxid , &P , 1);array*(set)%MAXSEM = i + 1; printf(Producer %dn, array(*set)%MAXSEM); (*set)+; semop(mutxid , &V , 1); semop(fullid , &V , 1); i+; /end of while in line 62 sleep(10); printf(Producer is over); exit(0);圖 3-1 3.2 消費者進程/消費者A進程 if(fork()=0) while(1) semop(f
7、ullid , &P , 1); semop(mutxid , &P , 1); if(*get = 100) break; *sum+= array(*get)%MAXSEM;printf(The ComsumerA Get Number %dn, array(*get)%MAXSEM ); (*get)+; if( *get =100) printf(The sum is %d n , *sum); semop(mutxid , &V , 1); semop(emptyid , &V ,1 );圖 3-2 sleep(1); /end of while(1) in line 82 prin
8、tf(ConsumerA is over); exit(0);/end of if in line 81else /消費者B進程 if(fork()=0) while(1) semop(fullid , &P , 1); semop(mutxid , &P , 1); if(*get = 100) break; *sum += array(*get)%MAXSEM; printf(The ComsumerB Get Number %dn, array(*get)%MAXSEM ); (*get)+; if( *get =100) printf(The sum is %d n , *sum);
9、semop(mutxid , &V , 1); semop(emptyid , &V ,1 ); sleep(1); /end of while(1) in line105 printf(ConsumerB is over); exit(0); /end of if in line 103 /end of else in line 101 四、詳細(xì)設(shè)計一、 主函數(shù)圖 4-1二、統(tǒng)計線程圖 4-2三、生產(chǎn)者線程圖 4-3四、消費者線程圖 4-4五、程序調(diào)試5.1 調(diào)試記錄有三個warning:圖 5-1-1圖 5-1-2圖 5-1-35.2 運行結(jié)果圖 5-2-1圖5-2-2六、總結(jié)在這次的課程
10、設(shè)計中,我遇到了很大的困難,對一些概念很不理解,不過通過和同學(xué)交流又上網(wǎng)查閱資料很好的解決了問題,讓我在這個過程中學(xué)到很多東西,也進一步理解操作系統(tǒng)的概念,同時對Linux編程也有了更多的學(xué)習(xí)。這個課程設(shè)計并不是很完美,但是起碼能讓我們很好的理解了什么是生產(chǎn)者消費者問題。讓我對互斥問題有了更深的見解,同時也認(rèn)識的到自己很大的不足,在以后的學(xué)習(xí)中會加以克服,增強自己的問題分析能力和動手實踐能力。雖然實驗以前我已經(jīng)對信號量機制解決進程間同步問題的原理有了很清楚的認(rèn)識,但是此次課程設(shè)計中仍然遇到了很多問題,如Linux系統(tǒng)下各種系統(tǒng)調(diào)用以及函數(shù)的各種參數(shù),都花費了我很多時間去網(wǎng)上看各種資料雖然Lin
11、ux系統(tǒng)中可以很方便的閱讀源代碼以及使用man命令進行相應(yīng)指令的查看,但是全英文的資料讓人看了不免有些發(fā)怵,看來還要多多加強計算機專業(yè)英語的學(xué)習(xí),以后便可以在Linux系統(tǒng)中查看各種幫助文件。另一個問題就是在編譯的時候遇到的,剛開始用gcc o main main.c 進行編譯的時候總是提示出錯,后來查了相關(guān)資料才知道pthread 庫不是 Linux 系統(tǒng)默認(rèn)的庫,連接時需要使用靜態(tài)庫 libpthread.a,所以在使用pthread_create()等函數(shù)時,需要鏈接該庫才能編譯通過。以前再用Windows IDE進行編程的時候基本上不會遇到這樣的問題,看來的確IDE為我們做了很多工作,
12、隱藏了一些技術(shù)細(xì)節(jié),有時候隱藏這些細(xì)節(jié)雖然可以方便我們,卻讓我們離真相越來越遠。最近使用Linux進行相關(guān)的編程操作,感悟還是挺多的。Windows下的層層封裝的確讓我們感到很方便,但同時也讓我們編程變得越來越不靈活。因為我們不用再去了解底層的東西因此一遇到問題就會束手無策。這段時間一直用Linux進行編程,感覺很方便,跟我以前想象地完全不一樣,而且我掌握了不少命令,比我以前用鼠標(biāo)操作的時候快多了,而且在Bash下可以用Ctrl+Z隨時中止正在運行的進程或命令,再用fg %id 重新運行。Linux下的編程也很方便,我還了解了Makefile的編寫方法,在多文件編程的時候可以極高地提高效率。
13、總之,我之后會加強專業(yè)英語的學(xué)習(xí),以便更好的利用Linux操作系統(tǒng)進行編程之路的學(xué)習(xí)。七、參考文獻1Operating System Concepts(Sixth Edition)(操作系統(tǒng)概念)影印版 Abraham Silberschatz編 高等教育出版社 2003年2 操作系統(tǒng) 羅宇 鄒鵬 吳剛 等編著 電子工業(yè)出版社 2006年2計算機操作系統(tǒng)教程(第三版) 張堯?qū)W編 清華大學(xué)出版社 2001年3 計算機操作系統(tǒng) 第三版 湯曉丹 梁紅兵 哲鳳屛 湯子瀛 編著西安電子科技大學(xué)出版社 2009年4 操作系統(tǒng)原理(第三版) 龐麗萍 華中科技大學(xué)出版社2000年八、附錄#include #i
14、nclude #include #include #include #include #include #include #define MAXSEM 5/聲明三個信號燈IDint fullid;int emptyid;int mutxid;int main() struct sembuf P,V; union semun arg; /聲明共享內(nèi)存 int *array; int *sum; int *set; int *get; /映射共享內(nèi)存array=(int*)mmap(NULL,sizeof( int )*5,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_A
15、NONYMOUS,-1,0); sum=(int*)mmap(NULL, zeof( int ),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0); get=(int*)mmap(NULL,sizeof( int ),PROT_READ|PROT_WRITE,MAP_SHAR ED|MAP_ANONYMOUS,-1,0); set=(int*)mmap(NULL,sizeof( int ),PROT_READ|PROT_WRITE,MAP_SHAR ED|MAP_ANONYMOUS,-1,0); *sum = 0; *get = 0; *s
16、et = 0; /生成信號燈 fullid= semget(IPC_PRIVATE,1,IPC_CREAT|00666); emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|00666); mutxid=semget(IPC_PRIVATE,1,IPC_CREAT|00666); /為信號燈賦值 arg.val = 0; if(semctl(fullid , 0 , SETVAL , arg) = -1) perror(semctl setval error); arg.val = MAXSEM; if(semctl(emptyid , 0 ,SETVAL , ar
17、g) = -1)perror(semctl setval error); arg.val = 1; if(semctl(mutxid , 0 ,SETVAL , arg) = -1) perror(setctl setval error); /初始化P,V操作 V.sem_num=0; V.sem_op =1; V.sem_flg=SEM_UNDO; P.sem_num=0; P.sem_op =-1; P.sem_flg=SEM_UNDO; /生產(chǎn)者進程 if(fork() = 0 ) int i = 0; while( i 100) semop( id , &P ,1 ); semop(m
18、utxid , &P , 1); array*(set)%MAXSEM = i + 1; printf(Producer %dn, array(*set)%MAXSEM); (*set)+; semop(mutxid , &V , 1); semop(fullid , &V , 1); i+; sleep(10); printf(Producer is over); exit(0); else /消費者A進程 if(fork()=0) while(1) semop(fullid , &P , 1); semop(mutxid , &P , 1); if(*get = 100) break; *
19、sum += array(*get)%MAXSEM; printf(The ComsumerA Get Number %dn, array(*get)%MAXSEM ); (*get)+; if( *get =100) printf(The sum is %d n , *sum); semop(mutxid , &V , 1); semop(emptyid , &V ,1 ); sleep(1); printf(ConsumerA is over); exit(0);else /消費者B進程 if(fork()=0) while(1) semop(fullid , &P , 1); semop
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 幼兒園心理輔導(dǎo)工作的探索計劃
- 提升市場競爭力的行動方案計劃
- 2025年氣體摻混設(shè)備項目合作計劃書
- 2025年太陽能電池生產(chǎn)專用設(shè)備合作協(xié)議書
- 2025年CRO服務(wù)項目發(fā)展計劃
- 2025年儲冷、蓄熱裝置項目合作計劃書
- 2025年奧硝唑藥物項目發(fā)展計劃
- 2025年轉(zhuǎn)基因抗蟲樹木新品種合作協(xié)議書
- 智能交通系統(tǒng)建設(shè)運營合同
- 工程咨詢與設(shè)計服務(wù)框架協(xié)議
- 液化氣站隱患排查治理全套資料
- 有限空間作業(yè)審批表
- 內(nèi)地居民前往香港或者澳門定居申請表
- 學(xué)前教育大專畢業(yè)論文3000字
- 注塑領(lǐng)班簡歷樣板
- 骨骼肌-人體解剖學(xué)-運動系統(tǒng)
- 高中體育與健康-足球踢墻式“二過一”戰(zhàn)術(shù)教學(xué)課件設(shè)計
- 兒童財商養(yǎng)成教育講座PPT
- 前庭性偏頭痛診斷
- 三下《動物的一生》教材解讀
- 大學(xué)學(xué)院學(xué)生獎助資金及相關(guān)經(jīng)費發(fā)放管理暫行辦法
評論
0/150
提交評論