用多進(jìn)程同步方法演示“生產(chǎn)者-消費(fèi)者”問(wèn)題_第1頁(yè)
用多進(jìn)程同步方法演示“生產(chǎn)者-消費(fèi)者”問(wèn)題_第2頁(yè)
用多進(jìn)程同步方法演示“生產(chǎn)者-消費(fèi)者”問(wèn)題_第3頁(yè)
用多進(jìn)程同步方法演示“生產(chǎn)者-消費(fèi)者”問(wèn)題_第4頁(yè)
用多進(jìn)程同步方法演示“生產(chǎn)者-消費(fèi)者”問(wèn)題_第5頁(yè)
已閱讀5頁(yè),還剩8頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、*理工大學(xué)操作系統(tǒng)課程設(shè)計(jì)報(bào)告院(系): 計(jì)算機(jī)工程學(xué)院 專業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) 班級(jí): 計(jì)算111 學(xué)生姓名: * 學(xué)號(hào): 201107015 題目:用多進(jìn)程同步方法演示“生產(chǎn)者-消費(fèi)者”問(wèn)題 起迄日期: 2014.07.07-2014.07.18 設(shè)計(jì)地點(diǎn): 現(xiàn)代教育中心101-103、主教學(xué)樓B505 指 導(dǎo) 教 師: 王* 20132014年度 第 2 學(xué)期完成日期: 2014 年 7 月 18 日一、 課程設(shè)計(jì)目的本次操作系統(tǒng)課程設(shè)計(jì)的主要任務(wù)是通過(guò)研究Linux的進(jìn)程機(jī)制和信號(hào)量,實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問(wèn)題的并發(fā)控制。實(shí)驗(yàn)中需要設(shè)置多個(gè)生產(chǎn)者和多個(gè)消費(fèi)者,生產(chǎn)者和消費(fèi)者對(duì)同一個(gè)緩沖區(qū)進(jìn)

2、行操作,互斥的訪問(wèn)緩沖區(qū)。本次課程設(shè)計(jì)的目的就是加深對(duì)多進(jìn)程如何正確訪問(wèn)臨界資源的理解,同時(shí)掌握條件變量在互斥訪問(wèn)時(shí)應(yīng)該如何正確有效地使用。掌握生產(chǎn)者消費(fèi)者問(wèn)題的解決流程和方法,能夠在此基礎(chǔ)上解決現(xiàn)實(shí)中的具體問(wèn)題。二、 課程設(shè)計(jì)內(nèi)容課程設(shè)計(jì)內(nèi)容:1) 生產(chǎn)者和消費(fèi)者進(jìn)程的數(shù)目不固定,可在程序界面上設(shè)置2) 生產(chǎn)者和消費(fèi)者進(jìn)程的數(shù)目在程序界面上可調(diào),在運(yùn)行時(shí)可隨時(shí)單個(gè)增加與減少生產(chǎn)者與消費(fèi)者3) 生產(chǎn)者的生產(chǎn)速度與消費(fèi)者的消費(fèi)速度均可在程序界面調(diào)節(jié),在運(yùn)行中,該值調(diào)整后立即生效4) 生產(chǎn)者生產(chǎn)的產(chǎn)品由隨機(jī)函數(shù)決定5) 多個(gè)生產(chǎn)者或多個(gè)消費(fèi)者之間必須有共享對(duì)緩沖區(qū)進(jìn)行操作的函數(shù)代碼6) 每個(gè)生產(chǎn)者

3、和消費(fèi)者對(duì)有界緩沖區(qū)進(jìn)行操作后,即時(shí)顯示有界緩沖區(qū)的全部?jī)?nèi)容、當(dāng)前生產(chǎn)者與消費(fèi)者的指針位置,以及生產(chǎn)者和消費(fèi)者線程標(biāo)識(shí)符7) 采用可視化界面,可在運(yùn)行過(guò)程中隨時(shí)暫停,查看當(dāng)前生產(chǎn)者、消費(fèi)者以及有界緩沖區(qū)的狀態(tài)三、 系統(tǒng)分析與設(shè)計(jì)1、系統(tǒng)分析1.1功能需求:生產(chǎn)者與消費(fèi)者需要對(duì)緩沖池互斥操作,其中生產(chǎn)者和消費(fèi)者的數(shù)目可以任意改變。生產(chǎn)者和消費(fèi)者的速度也要隨機(jī)的進(jìn)行修改??梢圆榭串?dāng)前生產(chǎn)者和消費(fèi)者以及有界緩沖區(qū)的狀態(tài)。1.2數(shù)據(jù)需求:本次試驗(yàn)生產(chǎn)者和消費(fèi)者的數(shù)量要?jiǎng)討B(tài)的增加、減少,還有緩沖區(qū)的產(chǎn)品數(shù),以及生產(chǎn)、消費(fèi)產(chǎn)品的指針。rear:生產(chǎn)者指針;front:消費(fèi)者指針;size:產(chǎn)品數(shù);CONS

4、UME_TIME:消費(fèi)者速度;PRODUCE_TIME :生產(chǎn)者速度;mutex:對(duì)緩沖區(qū)互斥操作的鎖;empty_cond:緩沖區(qū)空的條件變量;full_cond:緩沖區(qū)滿的條件變量。設(shè)置生產(chǎn)速度刪除消費(fèi)者刪除生產(chǎn)者緩沖池信息添加消費(fèi)者主程序添加生產(chǎn)者設(shè)置消費(fèi)速度2、系統(tǒng)設(shè)計(jì):3、模塊設(shè)計(jì):函數(shù)調(diào)用關(guān)系:void init_list()void on_changed()void create_pthread_producer()void create_pthread_consumer()void remove_pthread_producer()void remove_pthread_pro

5、ducer()void consumer_time()void produce_time()void show_pool_fun()main()void *producer()void *consumer()void add_to_list()生產(chǎn)者流程圖:是否申請(qǐng)空緩沖區(qū)信號(hào)量size>=BUFFER_LENGTH緩沖區(qū)已滿,線程阻塞rear = rear+1bufferrear = rand()%BUFFER_LENGTH;打印緩沖區(qū)狀態(tài)size = size+1釋放緩沖區(qū)開始結(jié)束消費(fèi)者流程圖:是否申請(qǐng)空緩沖區(qū)信號(hào)量size>=BUFFER_LENGTH緩沖區(qū)已滿,線程阻塞re

6、ar = rear+1bufferrear = rand()%BUFFER_LENGTH;打印緩沖區(qū)狀態(tài)size = size+1釋放緩沖區(qū)開始結(jié)束四、系統(tǒng)測(cè)試與調(diào)試分析1、系統(tǒng)測(cè)試(1)因?yàn)楫?dāng)生產(chǎn)者在緩沖區(qū)滿了以后自動(dòng)阻塞,所以生產(chǎn)者阻塞是否正常。測(cè)試說(shuō)明測(cè)試名稱用多進(jìn)程同步方法演示“生產(chǎn)者-消費(fèi)者”問(wèn)題測(cè)試目的驗(yàn)證生產(chǎn)者阻塞測(cè)試技術(shù)單元測(cè)試測(cè)試方法黑盒測(cè)試法測(cè)試用例測(cè)試內(nèi)容添加生產(chǎn)者,當(dāng)生產(chǎn)者生產(chǎn)滿緩沖區(qū)后,消費(fèi)者阻塞。測(cè)試數(shù)據(jù)添加5個(gè)生產(chǎn)者預(yù)期結(jié)果緩沖區(qū)開始增加產(chǎn)品,產(chǎn)品數(shù)達(dá)到20后5個(gè)消費(fèi)者阻塞測(cè)試結(jié)果與預(yù)期相符(2)因?yàn)楫?dāng)生產(chǎn)者在緩沖區(qū)滿了以后自動(dòng)阻塞,需要消費(fèi)者喚醒,所以需要測(cè)試喚

7、醒的實(shí)現(xiàn)是否正常。測(cè)試說(shuō)明測(cè)試名稱用多進(jìn)程同步方法演示“生產(chǎn)者-消費(fèi)者”問(wèn)題測(cè)試目的消費(fèi)者喚醒生產(chǎn)者測(cè)試技術(shù)單元測(cè)試測(cè)試方法黑盒測(cè)試法測(cè)試用例測(cè)試內(nèi)容消費(fèi)者阻塞時(shí),開始增加消費(fèi)者,喚醒生產(chǎn)者測(cè)試數(shù)據(jù)添加5個(gè)生產(chǎn)者預(yù)期結(jié)果消費(fèi)者消費(fèi)緩沖區(qū)中的產(chǎn)品,從而喚醒生產(chǎn)者測(cè)試結(jié)果與預(yù)期相符(3)測(cè)試生產(chǎn)者和消費(fèi)者的速度是否可以調(diào)節(jié)測(cè)試說(shuō)明測(cè)試名稱用多進(jìn)程同步方法演示“生產(chǎn)者-消費(fèi)者”問(wèn)題測(cè)試目的調(diào)節(jié)生產(chǎn)者和消費(fèi)者的速度測(cè)試技術(shù)單元測(cè)試測(cè)試方法黑盒測(cè)試法測(cè)試用例測(cè)試內(nèi)容調(diào)節(jié)生產(chǎn)者和消費(fèi)者速度測(cè)試數(shù)據(jù)默認(rèn)是1s,生產(chǎn)者速度2s,消費(fèi)者速度3s預(yù)期結(jié)果生產(chǎn)者和消費(fèi)者的速度改變測(cè)試結(jié)果與預(yù)期相符2、調(diào)試分析:2.

8、1調(diào)試過(guò)程中遇到的問(wèn)題及解決方案:(1) 刪除一個(gè)正在執(zhí)行的生產(chǎn)者或者消費(fèi)者之后,其他的生產(chǎn)者和消費(fèi)者都處于等待狀態(tài),導(dǎo)致整個(gè)程序處于忙等狀態(tài)。解決方案:正在執(zhí)行的線程為了訪問(wèn)臨界資源而為其加上鎖,但在訪問(wèn)過(guò)程中被外界取消,由于線程處于響應(yīng)取消狀態(tài),且采用異步方式響應(yīng),并且在打開獨(dú)占鎖以前的運(yùn)行路徑上存在取消點(diǎn),則該臨界資源將永遠(yuǎn)處于鎖定狀態(tài)得不到釋放,從而使得其他的線程也無(wú)法執(zhí)行。外界取消操作是不可預(yù)見(jiàn)的,因此需要POSIX線程API中提供的一個(gè)pthread_cleanup_push()/pthread_cleanup_pop()函數(shù)對(duì)自動(dòng)釋放資源。(2) 不能取消子線程。解決方案:由于子

9、線程中存在一個(gè)while(1)死循環(huán),線程處于無(wú)限循環(huán)中,且循環(huán)體內(nèi)沒(méi)有執(zhí)行至取消點(diǎn)的必然路徑,導(dǎo)致線程無(wú)法由外部其他線程的取消請(qǐng)求而終止。此時(shí)可以在循環(huán)體的必經(jīng)路徑上應(yīng)該加入pthread_testcancel()調(diào)用。 (3) 被刪除的生產(chǎn)者線程和消費(fèi)者線程仍然后在執(zhí)行一次。解決方案:這是因?yàn)槿∠c(diǎn)被放在了緩沖池操作函數(shù)先調(diào)用之后,所以線程被取消后仍會(huì)對(duì)緩沖池進(jìn)行一次操作。此時(shí),只需要在緩沖池操作函數(shù)調(diào)用之前添加一個(gè) pthread_testcancel()調(diào)用即可。五、用戶手冊(cè)1、使用平臺(tái)是linux下gcc安裝gcc、Gtk命令:apt-get install build-essent

10、ial #安裝gcc/g+/gdb/make 等基本編程工具apt-get install gnome-core-devel #安裝 libgtk2.0-dev libglib2.0-dev 等開發(fā)相關(guān)庫(kù)文件apt-get install pkg-config #用于在編譯GTK程序時(shí)自動(dòng)找出頭文件及庫(kù)文件位置 apt-get install devhelp #安裝 devhelp GTK文檔查看程序apt-get install libglib2.0-doc libgtk2.0-doc #安裝 gtk/glib 的API參考手冊(cè)及其它幫助文檔apt-get install glade lib

11、glade2-dev #安裝基于GTK的界面GTK是開發(fā)Gnome窗口的c/c+語(yǔ)言圖形庫(kù)apt-get install libgtk2.0*,#gtk+2.0所需的所有文件統(tǒng)通下載安裝完畢。2、操作步驟:第一步:添加生產(chǎn)者第二步:添加消費(fèi)者第三步:顯示緩沖池信息第四步:刪除生產(chǎn)者第五步:刪除消費(fèi)者第六步:設(shè)置生產(chǎn)者和消費(fèi)者的速度六、程序清單創(chuàng)建生產(chǎn)者線程:int create_pthread_producer()char pthread_id20=""pthread_t producer_id;pthread_create(&producer_id,NULL,pr

12、oducer,NULL);/創(chuàng)建線程函數(shù)調(diào)用sprintf(pthread_id,"%lu",producer_id);add_to_list(list_producers, pthread_id);/將線程添加到線程列表return 0;創(chuàng)建消費(fèi)者線程:int create_pthread_consumer()char pthread_id20=""pthread_t consumer_id;pthread_create(&consumer_id,NULL,consumer,NULL);/創(chuàng)建線程函數(shù)調(diào)用sprintf(pthread_id,&

13、quot;%lu",consumer_id);add_to_list(list_consumers, pthread_id);/將線程添加到線程列表return 0;生產(chǎn)者函數(shù):void *producer(void *arg)pthread_detach(pthread_self();/線程分離char info50="Pool is full, producer "char *value=(char *)malloc(30);sprintf(value,"%lu",pthread_self();strcat(info,value);strc

14、at(info,"is waiting!");while(1)pthread_testcancel();/設(shè)置取消點(diǎn)pthread_cleanup_push(pthread_mutex_unlock, (void *) &mutex); /線程清理處理函數(shù)pthread_mutex_lock(&mutex);/對(duì)臨界資源加鎖while(size >= BUFFER_LENGTH)add_to_list(list_pool, info);producer_wait = 1;pthread_cond_wait(&full_cond, &mu

15、tex);/線程阻塞,并解鎖producer_wait = 0;pthread_testcancel();/設(shè)置取消點(diǎn)operate_pool(1);/對(duì)緩沖池操作pthread_mutex_unlock(&mutex);/解鎖pthread_cond_signal(&empty_cond);/喚醒消費(fèi)者pthread_cleanup_pop(0); /線程清理處理函數(shù)pthread_testcancel();/設(shè)置取消點(diǎn)usleep(10);消費(fèi)者函數(shù):void *consumer(void *arg)pthread_detach(pthread_self();/線程分離ch

16、ar info50="Pool is empty, consumer "char *value=(char *)malloc(30);sprintf(value,"%lu",pthread_self();strcat(info,value);strcat(info,"is waiting!");while(1)pthread_testcancel();/設(shè)置取消點(diǎn)pthread_cleanup_push(pthread_mutex_unlock, (void *) &mutex); /線程清理處理函數(shù)pthread_mutex

17、_lock(&mutex);/對(duì)臨界資源加鎖while(size <= 0)add_to_list(list_pool, info);consumer_wait = 1;pthread_cond_wait(&empty_cond,&mutex);/線程阻塞,并加鎖consumer_wait = 0;pthread_testcancel();/設(shè)置取消點(diǎn)operate_pool(0);/對(duì)緩沖池操作pthread_mutex_unlock(&mutex);/解鎖pthread_cond_signal(&full_cond);/喚醒生產(chǎn)者pthread

18、_cleanup_pop(0); /線程清理處理函數(shù)pthread_testcancel();/設(shè)置取消點(diǎn)usleep(10);操作緩沖池函數(shù):void *operate_pool(const int type)char produce20=""char *value=(char *)malloc(30);sprintf(value,"%lu",pthread_self(); gtk_label_set_text(GTK_LABEL(label_tid), value);if(type = 1)char pro20="生產(chǎn)產(chǎn)品:"bufferrear = rand()%BUFFER_LENGTH;/產(chǎn)品由隨機(jī)函數(shù)決定sprintf(produce,"%d",bufferrear);strcat(pro,produce);strcat(value,pro);add_to_list(list_pool, value);rear = (rear+1)%BUFFER_LENGTH;/生產(chǎn)者指針向后移一位+size;/緩沖池內(nèi)產(chǎn)品數(shù)加一sprintf(value,"%d",rear); gt

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論