多線(xiàn)程實(shí)現(xiàn)生產(chǎn)者消費(fèi)者_(dá)第1頁(yè)
多線(xiàn)程實(shí)現(xiàn)生產(chǎn)者消費(fèi)者_(dá)第2頁(yè)
多線(xiàn)程實(shí)現(xiàn)生產(chǎn)者消費(fèi)者_(dá)第3頁(yè)
多線(xiàn)程實(shí)現(xiàn)生產(chǎn)者消費(fèi)者_(dá)第4頁(yè)
多線(xiàn)程實(shí)現(xiàn)生產(chǎn)者消費(fèi)者_(dá)第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、嵌入式Linux編程課程設(shè)計(jì)題目:多線(xiàn)程實(shí)現(xiàn)生產(chǎn)者消費(fèi)者之間的通信班 級(jí): 計(jì)算機(jī)應(yīng)用xxxx班 學(xué) 號(hào): 12號(hào) 姓 名: xx 指導(dǎo)教師: xxx 日 期: 2014.6.232014.6.27 目 錄13一、課程設(shè)計(jì)說(shuō)明1二、概要設(shè)計(jì)1三、模塊設(shè)計(jì)2四、詳細(xì)設(shè)計(jì)4五、程序調(diào)試6六、總結(jié)8七、參考文獻(xiàn)9八、附錄10一、課程設(shè)計(jì)說(shuō)明生產(chǎn)者-消費(fèi)者(producer-consumer)問(wèn)題,也稱(chēng)作有界緩沖區(qū)(bounded-buffer)問(wèn)題,兩個(gè)進(jìn)程共享一個(gè)公共的固定大小的緩沖區(qū)。其中一個(gè)是生產(chǎn)者,用于將消息放入緩沖區(qū);另外一個(gè)是消費(fèi)者,用于從緩沖區(qū)中取出消息。問(wèn)題出現(xiàn)在當(dāng)緩沖區(qū)已經(jīng)滿(mǎn)了,而

2、此時(shí)生產(chǎn)者還想向其中放入一個(gè)新的數(shù)據(jù)項(xiàng)的情形,其解決方法是讓生產(chǎn)者此時(shí)進(jìn)行休眠,等待消費(fèi)者從緩沖區(qū)中取走了一個(gè)或者多個(gè)數(shù)據(jù)后再去喚醒它。同樣地,當(dāng)緩沖區(qū)已經(jīng)空了,而消費(fèi)者還想去取消息,此時(shí)也可以讓消費(fèi)者進(jìn)行休眠,等待生產(chǎn)者放入一個(gè)或者多個(gè)數(shù)據(jù)時(shí)再喚醒它。本次課設(shè)通過(guò)研究Linux的進(jìn)程機(jī)制和信號(hào)量實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題的并發(fā)控制。二、概要設(shè)計(jì)本作業(yè)是完善課件上的線(xiàn)程綜合實(shí)例的練習(xí)生產(chǎn)者-消費(fèi)者問(wèn)題,重構(gòu)這個(gè)程序的框架,完成性能分析,使之進(jìn)一步理解掌握Linux下線(xiàn)程的同步、通信以及互斥和多線(xiàn)程的安全問(wèn)題。一般情況下,解決互斥方法常用信號(hào)量和互斥鎖,即semaphore和mutex,而解決這個(gè)問(wèn)題

3、,多采用一個(gè)類(lèi)似資源槽的結(jié)構(gòu),每個(gè)槽位標(biāo)示了指向資源的指針以及該槽位的狀態(tài),生產(chǎn)者和消費(fèi)者互斥查詢(xún)資源槽,判斷是否有產(chǎn)品或者有空位可以生產(chǎn),然后根據(jù)指針進(jìn)行相應(yīng)的操作。同時(shí),為了告訴生產(chǎn)者或者消費(fèi)者資源槽的情況,還要有一個(gè)消息傳送機(jī)制,無(wú)論是管道還是線(xiàn)程通信。然而,本次試驗(yàn)有幾個(gè)特殊的要求:1、循環(huán)緩沖。2、除了stderr,stdout等外,只用小于2個(gè)的互斥鎖、3、放棄資源槽分配機(jī)制,采用額外的數(shù)據(jù)結(jié)構(gòu)。4、生產(chǎn)者一直持續(xù)生產(chǎn),形成生產(chǎn)消費(fèi)的良性循環(huán)。首先,使用一個(gè)互斥鎖,意味著資源槽機(jī)制就不能使用了。因?yàn)橘Y源槽雖以用一個(gè)互斥鎖完成,但是需要有額外的通信,如果使用管道通信,則管道也必須是互

4、斥,這就不滿(mǎn)足1個(gè)互斥鎖的要求。其次,要求生產(chǎn)者一直生產(chǎn),這就否定了另外一種方法:消費(fèi)者、生產(chǎn)者的位置均平等,消費(fèi)者消費(fèi)的時(shí)候生產(chǎn)者不能生產(chǎn),生產(chǎn)者生產(chǎn)的時(shí)候消費(fèi)者不能消費(fèi)。因此,就需要采用A要求,也就是循環(huán)鏈表的形式。為了保證互斥要求,需要定義一個(gè)數(shù)據(jù)結(jié)構(gòu),這個(gè)數(shù)據(jù)結(jié)構(gòu)包含兩個(gè)指針,一個(gè)讀一個(gè)寫(xiě),同時(shí)有一個(gè)資源數(shù)目量,告訴生產(chǎn)者和消費(fèi)者是否可以生產(chǎn)或者消費(fèi)。由于該數(shù)據(jù)結(jié)構(gòu)很小,因而可以對(duì)此結(jié)構(gòu)互斥訪(fǎng)問(wèn)。同時(shí),對(duì)于每組數(shù)據(jù),都有一個(gè)標(biāo)志位,表示此組數(shù)據(jù)是否被占用,生產(chǎn)者和消費(fèi)者均可以先占用此位置然后完成相應(yīng)的操作。當(dāng)消費(fèi)者互斥訪(fǎng)問(wèn)此結(jié)構(gòu)時(shí),首先判斷是否有數(shù)據(jù)可以取,如果沒(méi)有,直接等待,若有數(shù)據(jù)

5、可取,先更改標(biāo)志位占用此數(shù)據(jù),并將資源數(shù)目-1。然后交出互斥,把數(shù)據(jù)拷貝到自己緩沖區(qū)內(nèi),清空數(shù)據(jù)。當(dāng)生產(chǎn)者訪(fǎng)問(wèn)時(shí),首先判斷有沒(méi)有空位可以生產(chǎn),如果沒(méi)有,直接等待,若有數(shù)據(jù)可以生產(chǎn),先判斷該位是否被占用,如果沒(méi)被占用,則占用此位置進(jìn)行生產(chǎn)。生產(chǎn)完成后,將占用位改為未占用,同時(shí)將資源數(shù)目+1。三、模塊設(shè)計(jì)采用信號(hào)量來(lái)解決n個(gè)進(jìn)程的臨界區(qū)問(wèn)題,這n個(gè)進(jìn)程共享一個(gè)信號(hào)量mutex(mutual exclusion),并初始化為1。利用p ,v原語(yǔ)操作結(jié)合信號(hào)量實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者進(jìn)程對(duì)緩沖區(qū)的互斥訪(fǎng)問(wèn)。3.1 生產(chǎn)者進(jìn)程 if(fork() = 0 ) int i = 0; while( i <

6、100) 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

7、.2 消費(fèi)者進(jìn)程/消費(fèi)者A進(jìn)程 if(fork()=0) while(1) semop(fullid , &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 , &

8、;V , 1); semop(emptyid , &V ,1 );圖 3-2 sleep(1); /end of while(1) in line 82 printf("ConsumerA is over"); exit(0);/end of if in line 81else /消費(fèi)者B進(jìn)程 if(fork()=0) while(1) semop(fullid , &P , 1); semop(mutxid , &P , 1); if(*get = 100) break; *sum += array(*get)%MAXSEM; printf(&qu

9、ot;The ComsumerB 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); /end of while(1) in line105 printf("ConsumerB is over"); exit(0); /end of if in line 103 /end

10、of else in line 101 四、詳細(xì)設(shè)計(jì)一、 主函數(shù)圖 4-1二、統(tǒng)計(jì)線(xiàn)程圖 4-2三、生產(chǎn)者線(xiàn)程圖 4-3四、消費(fèi)者線(xiàn)程圖 4-4五、程序調(diào)試5.1 調(diào)試記錄有三個(gè)warning:圖 5-1-1圖 5-1-2圖 5-1-35.2 運(yùn)行結(jié)果圖 5-2-1圖5-2-2六、總結(jié)在這次的課程設(shè)計(jì)中,我遇到了很大的困難,對(duì)一些概念很不理解,不過(guò)通過(guò)和同學(xué)交流又上網(wǎng)查閱資料很好的解決了問(wèn)題,讓我在這個(gè)過(guò)程中學(xué)到很多東西,也進(jìn)一步理解操作系統(tǒng)的概念,同時(shí)對(duì)Linux編程也有了更多的學(xué)習(xí)。這個(gè)課程設(shè)計(jì)并不是很完美,但是起碼能讓我們很好的理解了什么是生產(chǎn)者消費(fèi)者問(wèn)題。讓我對(duì)互斥問(wèn)題有了更深的見(jiàn)解,

11、同時(shí)也認(rèn)識(shí)的到自己很大的不足,在以后的學(xué)習(xí)中會(huì)加以克服,增強(qiáng)自己的問(wèn)題分析能力和動(dòng)手實(shí)踐能力。雖然實(shí)驗(yàn)以前我已經(jīng)對(duì)信號(hào)量機(jī)制解決進(jìn)程間同步問(wèn)題的原理有了很清楚的認(rèn)識(shí),但是此次課程設(shè)計(jì)中仍然遇到了很多問(wèn)題,如Linux系統(tǒng)下各種系統(tǒng)調(diào)用以及函數(shù)的各種參數(shù),都花費(fèi)了我很多時(shí)間去網(wǎng)上看各種資料雖然Linux系統(tǒng)中可以很方便的閱讀源代碼以及使用man命令進(jìn)行相應(yīng)指令的查看,但是全英文的資料讓人看了不免有些發(fā)怵,看來(lái)還要多多加強(qiáng)計(jì)算機(jī)專(zhuān)業(yè)英語(yǔ)的學(xué)習(xí),以后便可以在Linux系統(tǒng)中查看各種幫助文件。另一個(gè)問(wèn)題就是在編譯的時(shí)候遇到的,剛開(kāi)始用gcc o main main.c 進(jìn)行編譯的時(shí)候總是提示出錯(cuò),后來(lái)

12、查了相關(guān)資料才知道pthread 庫(kù)不是 Linux 系統(tǒng)默認(rèn)的庫(kù),連接時(shí)需要使用靜態(tài)庫(kù) libpthread.a,所以在使用pthread_create()等函數(shù)時(shí),需要鏈接該庫(kù)才能編譯通過(guò)。以前再用Windows IDE進(jìn)行編程的時(shí)候基本上不會(huì)遇到這樣的問(wèn)題,看來(lái)的確IDE為我們做了很多工作,隱藏了一些技術(shù)細(xì)節(jié),有時(shí)候隱藏這些細(xì)節(jié)雖然可以方便我們,卻讓我們離真相越來(lái)越遠(yuǎn)。最近使用Linux進(jìn)行相關(guān)的編程操作,感悟還是挺多的。Windows下的層層封裝的確讓我們感到很方便,但同時(shí)也讓我們編程變得越來(lái)越不靈活。因?yàn)槲覀儾挥迷偃チ私獾讓拥臇|西因此一遇到問(wèn)題就會(huì)束手無(wú)策。這段時(shí)間一直用Linux進(jìn)

13、行編程,感覺(jué)很方便,跟我以前想象地完全不一樣,而且我掌握了不少命令,比我以前用鼠標(biāo)操作的時(shí)候快多了,而且在Bash下可以用Ctrl+Z隨時(shí)中止正在運(yùn)行的進(jìn)程或命令,再用fg %id 重新運(yùn)行。Linux下的編程也很方便,我還了解了Makefile的編寫(xiě)方法,在多文件編程的時(shí)候可以極高地提高效率。 總之,我之后會(huì)加強(qiáng)專(zhuān)業(yè)英語(yǔ)的學(xué)習(xí),以便更好的利用Linux操作系統(tǒng)進(jìn)行編程之路的學(xué)習(xí)。七、參考文獻(xiàn)1Operating System Concepts(Sixth Edition)(操作系統(tǒng)概念)影印版 Abraham Silberschatz編 高等教育出版社 2003年2 操作系統(tǒng) 羅宇 鄒鵬 吳

14、剛 等編著 電子工業(yè)出版社 2006年2計(jì)算機(jī)操作系統(tǒng)教程(第三版) 張堯?qū)W編 清華大學(xué)出版社 2001年3 計(jì)算機(jī)操作系統(tǒng) 第三版 湯曉丹 梁紅兵 哲鳳屛 湯子瀛 編著西安電子科技大學(xué)出版社 2009年4 操作系統(tǒng)原理(第三版) 龐麗萍 華中科技大學(xué)出版社2000年八、附錄#include <sys/mman.h>#include <sys/types.h>#include <linux/sem.h>#include <fcntl.h>#include <unistd.h>#include <stdio.h>#inclu

15、de <errno.h>#include <time.h>#define MAXSEM 5/聲明三個(gè)信號(hào)燈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_ANONYMOUS,-1,0); sum=

16、(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; *set = 0; /生成信號(hào)燈 fulli

17、d= semget(IPC_PRIVATE,1,IPC_CREAT|00666); emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|00666); mutxid=semget(IPC_PRIVATE,1,IPC_CREAT|00666); /為信號(hào)燈賦值 arg.val = 0; if(semctl(fullid , 0 , SETVAL , arg) = -1) perror("semctl setval error"); arg.val = MAXSEM; if(semctl(emptyid , 0 ,SETVAL , arg) = -1)

18、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)者進(jìn)程 if(fork() = 0 ) int i = 0; while( i < 100) semop(

19、id , &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+; sleep(10); printf("Producer is over"); exit(0); else /消費(fèi)者A進(jìn)程 if(fork()=0) while(1) semop(fullid , &P , 1); semop(mutxid , &P , 1); if(*get = 100) break; *sum += array(*get)%MAXSEM; printf("The Comsu

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論