版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、計算機操作系統(tǒng)課程設(shè)計題目:生產(chǎn)者一消費者問題專 業(yè):軟件工程年級:2010級小組成員:絲上指導(dǎo)教師:時 間:地 點:2012年5月摘要生產(chǎn)者消費者問題(英語:Producer-consumer problem),也稱有限緩沖問 題(英語:Bounded-buffer problem ),是一個多線程同步問題的經(jīng)典案例。該 問題描述了兩個共享固定大小緩沖區(qū)的線程一一即所謂的“生產(chǎn)者”和“消費者”在實際運行時會發(fā)生的問題。生產(chǎn)者的主要作用是生成一定量的數(shù)據(jù)放到緩 沖區(qū)中,然后重復(fù)此過程。與此同時,消費者也在緩沖區(qū)消耗這些數(shù)據(jù)。該問題 的關(guān)鍵就是要保證生產(chǎn)者不會在緩沖區(qū)滿時加入數(shù)據(jù),消費者也不會在
2、緩沖區(qū)中空時消耗數(shù)據(jù)。生產(chǎn)者消費者模式是通過一個容器來解決生產(chǎn)者和消費者的強耦合問題。生產(chǎn)者和消費者彼此之間不直接通訊, 而通過阻塞隊列來進行通訊,所以生產(chǎn)者生 產(chǎn)完數(shù)據(jù)之后不用等待消費者處理, 直接扔給阻塞隊列,消費者不找生產(chǎn)者要數(shù) 據(jù),而是直接從阻塞隊列里取,阻塞隊列就相當于一個緩沖區(qū),平衡了生產(chǎn)者和消費者的處理能力。444445557889141717錯誤!未定義書簽。18目錄.概述.課程設(shè)計任務(wù)及要求設(shè)計任務(wù)設(shè)計要求分工日程表.算法及數(shù)據(jù)結(jié)構(gòu)算法的總體思想生產(chǎn)者模塊消費者模塊.程序設(shè)計與實現(xiàn)程序流程圖程序代碼實驗結(jié)果. 結(jié)論.收獲、體會和建議收獲.參考文獻.概述本課題設(shè)計是完成了 “操
3、作系統(tǒng)原理”課程進行的一次全面的綜合訓(xùn)練,通 過這次課程設(shè)計,充分檢驗學(xué)生對課程的掌握程度和熟練情況, 讓學(xué)生更好的掌 握操作系統(tǒng)的原理及其實現(xiàn)方法,加深對課程的基礎(chǔ)理論和算法的理解, 加強學(xué) 生的動手能力。.課程設(shè)計任務(wù)及要求. 1設(shè)計任務(wù)通過研究Linux的進程機制和信號量實現(xiàn)生產(chǎn)者消費者問題的并發(fā)控制.說明:有界緩沖區(qū)內(nèi)設(shè)有20個存儲單元,放入/取出的數(shù)據(jù)項設(shè)定為1-20 這20個整型數(shù)。. 2設(shè)計要求(1)每個生產(chǎn)者和消費者對有界緩沖區(qū)進行操作后,實時顯示有界緩沖區(qū)的 全部內(nèi)容、當前指針位置和生產(chǎn)者/消費者的標識符。(2)生產(chǎn)者和消費者各有兩個以上。(3)多個生產(chǎn)者或多個消費者之間須有
4、共享對緩沖區(qū)進行操作的函數(shù)代碼。提示:(1)有界緩沖區(qū)可用數(shù)組實現(xiàn)。3分工日程表周二卜午周四上午周四卜午周五上午周五卜午A分析題目討論,分工編寫代碼測試系統(tǒng)編寫文檔B分析題目討論,分工編寫代碼添加備注完善系統(tǒng)3,算法及數(shù)據(jù)結(jié)構(gòu)1算法的總體思想在同一個進程地址空間內(nèi)執(zhí)行的兩個線程。生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費。 消費者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。當生產(chǎn)者線程生產(chǎn)物品時,如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等 待消費者線程釋放出一個空緩沖區(qū)。當消費者線程消費物品時,如果沒有滿的緩 沖區(qū),那么消費者線程將被阻塞,直到新的物品被生產(chǎn)出來。2生產(chǎn)者模
5、塊功能在同一個進程地址空間內(nèi)執(zhí)行的兩個線程。生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費。當生產(chǎn)者線程生產(chǎn)物品 時,如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費者線程釋放出一 個空緩沖區(qū)。數(shù)據(jù)結(jié)構(gòu)producer_semaphore/生產(chǎn)者的資源信號量(初始值為緩沖區(qū)的大小)Bufferpn /有界緩沖區(qū)Pn / 緩沖區(qū)目標位置MAX_BUFFER/緩沖區(qū)上限buffer_mutex/互斥信號量Wait()/等待操作,用于申請資源Signal()/信號操作,用于釋放資源Sleep()/ 掛起算法void *producer_thread(void *tid)pthre
6、ad_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);/* 設(shè)置狀態(tài),PTHREAD_CANCEL_ENABLE是正常處理 cancel信號*/while(1)等待,需要生存*/sem_wait(&producer_semaphore); /* srand(int)time(NULL)*(int)tid);sleep(rand()%2+1); /*一個或兩個需要生產(chǎn) */while(produce_pointer+1)%20=consume_pointer); /*指針位置*/sem_wait(&buffer_mutex); /* 緩存區(qū) */buffer
7、produce_pointer=rand()%20+1;/*指針位置 */produce_pointer=(produce_pointer+1)%20; /*指針位置 */*判斷*/if(produce_pointer=0)printf( 生產(chǎn)者:%d 指針指向:%2d 生產(chǎn)產(chǎn)品號:2dn,(int)tid,19,buffer19);/*輸出生產(chǎn)者,指針,緩存區(qū)*/fprintf(fd, 生產(chǎn)者:%d指針指向:%2d生產(chǎn)產(chǎn)品號:2dn,(int)tid,19,buffer19);/*輸出生產(chǎn)者,指針,緩存區(qū)*/elseprintf( 生產(chǎn)者:%d 指針指向:%2d 生產(chǎn)產(chǎn)品號:%2dn,(in
8、t)tid,produce_pointer-1,bufferproduce_pointer-1);/*輸出生產(chǎn)者,指針,緩存區(qū) */fprintf(fd, 生產(chǎn)者:%d 指針指向:%2d 生產(chǎn)產(chǎn)品號:%2dn,(int)tid,produce_pointer-1,bufferproduce_pointer-1);/*輸出生產(chǎn)者,指針,緩存區(qū) */showbuf();sem_post(&buffer_mutex);sem_post(&consumer_semaphore); /*通知消費者緩沖區(qū)不是空的*/srand(int)time(NULL)*(int)tid);sleep(rand()%5
9、+1); /*等待幾秒鐘,然后繼續(xù)生產(chǎn)*/return (void*)0);3.3消費者模塊功能消費者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。當消費者線程消費物品 時,如果沒有滿的緩沖區(qū),那么消費者線程將被阻塞,直到新的物品被生產(chǎn)出來。數(shù)據(jù)結(jié)構(gòu)consumer_semaphore/消費者的資源信號量(初始值為0)Bufferpn /有界緩沖區(qū)Pn /緩沖區(qū)目標位置MAX_BUFFER緩沖區(qū)上限buffer_mutex/互斥信號量Wait()/等待操作,用于申請資源Signal。/信號操作,用于釋放資源Sleep() 掛起算法void *consumer_thread(void *tid)/*可
10、以被其他線程使用*/pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);/* 設(shè)置狀態(tài),PTHREAD_CANCEL_ENABLE 是忽略 cancel 信號*/while(1)sem_wait(&consumer_semaphore); /*通知消費者消費 */srand(int)time(NULL)*(int)tid);sleep(rand()%2+1);/*一個或兩個來消費 */sem_wait(&buffer_mutex);printf( 消費者:%d指針指向:%2d消費產(chǎn)品號:%2dn,(int)tid,consume_pointer
11、,bufferconsume_pointer);/*輸出消費者,消費者指針,緩存區(qū) */fprintf(fd, 消費者:%d 指針指向:%2d 消費產(chǎn)品號:%2dn,(int)tid,consume_pointer,bufferconsume_pointer);/*輸出消費者,消費者指針,緩存區(qū) */bufferconsume pointer=0; /*消費者指針指向 0*/consume_pointer=(consume_pointer+1)%20;showbuf();sem_post(&buffer_mutex);sem_post(&producer_semaphore);/*通知生產(chǎn)者緩
12、沖區(qū)不是空的*/srand(int)time(NULL)*(int)tid);sleep(rand()%5+1); /*等待幾秒鐘,然后繼續(xù)消費*/return (void*)0);.程序設(shè)計與實現(xiàn)程序流程圖程序代碼#include#include#include#include#include#include#include#include#include #include#define NUM_THREADS_P 5#define NUM_THREADS_C 5#define MAX_BUFFER 20#define RUN_TIME 20int bufferMAX_BUFFER;/*定義
13、數(shù)據(jù)為生產(chǎn)者*/*定義數(shù)據(jù)為消費者*/*定義數(shù)據(jù)為緩存區(qū)*/*定義運行時間*/*定義最大緩存區(qū)*/int produce_pointer=0,consume_pointer=0;/*定義指針*/sem_t producer_semaphore,consumer_semaphore,buffer_mutex;/*定義信-號量,互斥*/pthread_t threads_pNUM_THREADS_P; /*聲明生產(chǎn)者線程 */pthread_t threads_cNUM_THREADS_C; /*聲明消費者線程 */FILE* fd;void *producer_thread(void *tid)
14、;/* 聲明生產(chǎn)者線程 */void *consumer_thread(void *tid); /*聲明消費者線程 */void showbuf(); /* 聲明 showbuf 方法*/void handler()int i; /* 定義 i*/for(i=0;iNUM_THREADS_P;i+)pthread_cancel(threads_pi);/*for 循環(huán),如果 iNUM_THREADS_P, 貝U pthread_cancel(threads_pi); 并且 i+*/for(i=0;iNUM_THREADS_C;i+)pthread_cancel(threads_ci);/*fo
15、r 循環(huán),如果 iNUM_THREADS_C,貝U pthread_cancel(threads_ci); 并且 i+*/int main()int i; /* 定義 i*/signal(SIGALRM,handler);/* 定義信號量 */fd=fopen(output.txt,w);/*打開一個文件用來保存結(jié)果*/sem_init(&producer_semaphore,0,MAX_BUFFER); /*放一個值名信號燈 */sem_init(&consumer_semaphore,0,0);sem_init(&buffer_mutex,0,1);for(i=0;iMAX_BUFFER;
16、i+)bufferi=0; /* 引發(fā)緩沖 */*創(chuàng)建線程*/for(i=0;iNUM_THREADS_P;i+)pthread_create(&threads_pi,NULL,(void*)producer_thread,(void*)(i+1);/*創(chuàng)建線程*/for(i=0;iNUM_THREADS_C;i+)pthread_create(&threads_ci,NULL,(void*)consumer_thread,(void *)(i+1);alarm(RUN_TIME);for(i=0;iNUM_THREADS_P;i+)pthread_join(threads_pi,NULL);
17、/*等待線程退出*/for(i=0;iNUM_THREADS_C;i+)pthread_join(threads_ci,NULL);/*等待線程退出*/sem_destroy(&producer_semaphore);/*清除信號燈*/sem_destroy(&consumer_semaphore);/*清除信號燈*/sem_destroy(&buffer_mutex);/*清除緩存區(qū)*/fclose(fd); /* 關(guān)閉文件 */return 0;void *producer_thread(void *tid)pthread_setcancelstate(PTHREAD_CANCEL_ENA
18、BLE,NULL);/*設(shè)置狀態(tài),PTHREAD_CANCEL_ENABLE 是正常處理cancel信號*/while(1) sem_wait(&producer_semaphore); /* 等待,需要生存 */srand(int)time(NULL)*(int)tid);sleep(rand()%2+1); /*一個或兩個需要生產(chǎn)*/while(produce_pointer+1)%20=consume_pointer); /*指針位置*/sem_wait(&buffer_mutex); /* 緩存區(qū) */bufferproduce_pointer=rand()%20+1; /*指針位置
19、*/produce_pointer=(produce_pointer+1)%20; /*指針位置*/*判斷*/if(produce_pointer=0)printf( 生產(chǎn)者:%d指針指向:%2d生產(chǎn)產(chǎn)品號:2dn,(int)tid,19,buffer19);/*輸出生產(chǎn)者,指針,緩存區(qū)*/fprintf(fd, 生產(chǎn)者:%d 指針指向:%2d 生產(chǎn)產(chǎn)品 號:2dn,(int)tid,19,buffer19);/*輸出生產(chǎn)者,指針,緩存區(qū)*/ elseprintf( 生產(chǎn)者:%d指針指向:%2d生產(chǎn)產(chǎn)品號:%2dn,(int)tid,produce_pointer-1,bufferproduc
20、e_pointer-1);/*輸出生產(chǎn)者,指針,緩存區(qū) */fprintf(fd, 生產(chǎn)者:%d 指針指向:%2d 生產(chǎn)產(chǎn)品 號:%2dn,(int)tid,produce_pointer-1,bufferproduce_pointer-1);/*輸出生產(chǎn)者,指針,緩存區(qū) */showbuf();sem_post(&buffer_mutex);sem_post(&consumer_semaphore); /* 通知消費者緩沖區(qū)不是空的 */srand(int)time(NULL)*(int)tid);sleep(rand()%5+1); /*等待幾秒鐘,然后繼續(xù)生產(chǎn)*/return (void
21、*)0);void *consumer_thread(void *tid)/*可以被其他線程使用*/pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);/* 設(shè)置狀態(tài),PTHREAD_CANCEL_ENABLE 是忽略 cancel 信號*/while(1)sem_wait(&consumer_semaphore); /*通知消費者消費 */srand(int)time(NULL)*(int)tid);sleep(rand()%2+1);/*一個或兩個來消費 */sem_wait(&buffer_mutex);printf( 消費者:%d指針指
22、向:%2d消費產(chǎn)品號:%2dn,(int)tid,consume_pointer,bufferconsume_pointer);/*輸出消費者,消費者指針,緩存區(qū) */fprintf(fd, 消費者:%d指針指向:%2d消費產(chǎn)品號:%2dn,(int)tid,consume_pointer,bufferconsume_pointer);/*輸出消費者,消費者指針,緩存區(qū) */bufferconsume_pointer=0; /*消費者指針指向 0*/consume_pointer=(consume_pointer+1)%20;showbuf();sem_post(&buffer_mutex);
23、sem_post(&producer_semaphore); /*通知生產(chǎn)者緩沖區(qū)不是空的*/srand(int)time(NULL)*(int)tid);sleep(rand()%5+1); /*等待幾秒鐘,然后繼續(xù)消費*/)return (void*)0);)/*查看緩沖區(qū)內(nèi)容*/void showbuf()int i; /* 定義 i*/printf(buffer:);/*輸出緩存區(qū) */fprintf(fd,buffer:);/*輸出緩存區(qū) */for(i=0;iMAX_BUFFER;i+)printf(%2d ,bufferi);/* 輸出緩存區(qū) i*/fprintf(fd,%2d
24、,bufferi); /*輸出緩存區(qū) i*/printf(nn);/*換行*/fprintf(fd,nn); /*換行 */實驗結(jié)果文件()編揖(日 查看(Y)搜索(S)終端(工)幫助出)rootlocal.host 臬面#rootlocalhost 桌面 j#gcc 3.c -o 3 -Ipthread ./3rootlocalhost:/ 桌面生產(chǎn)者:5 緩沖區(qū):1指針指向:60 0 0 0生產(chǎn)產(chǎn)品號:10 0 0 0 0生產(chǎn)者:3卷神區(qū):1指針指向:112 0 e e生產(chǎn)產(chǎn)品號:120 0 0 0 0生產(chǎn)者:1 絳神區(qū):1指針指向:212 19 0 0生產(chǎn)產(chǎn)品號:19o e o e e生
25、產(chǎn)者:4線神區(qū):1指針指向:312 19 19 0生產(chǎn)產(chǎn)品號:190 0 0 0生產(chǎn)青:2領(lǐng)神區(qū):1指針指向:412 19 19 9生產(chǎn)產(chǎn)品號:0 0 0 0,消費者:1線神區(qū):0指針指向:012 19 19 9消費產(chǎn)品號:0 e o e津費者:2線沖區(qū):0指針指向:1 0 19 19 9消費產(chǎn)品號:120 0 0 0 0造費者:3綏神區(qū):0指針指向:20 0 19 9消費產(chǎn)品號:190 0 0 0 0消費者:4 綏神區(qū):。指針指向:30 0 0 9消費產(chǎn)品號:190 0 0 0港費者:5 鎂神區(qū):指針指向:40 0 0 0消費產(chǎn)品號:0 0 0 0生產(chǎn)者:1 緣神區(qū):。指針指向:5e e e
26、 e 18生產(chǎn)產(chǎn)品號:18o e o e生產(chǎn)者:5線神區(qū):0指針指向:60 0 0 0 18生產(chǎn)產(chǎn)品號:10 0 0文件(E)編輯(E)查看Q)搜索(S)終端(工)幫助(H)生產(chǎn)者:3緩沖區(qū):0指針指向:80 0 0 0生產(chǎn)產(chǎn)品號:90 6 9 0生產(chǎn)者:2 緩沖區(qū):。指針指向:90 0 0 0生產(chǎn)產(chǎn)品號:0 6 9 9消費者:2緩沖區(qū):。指針指向:70 0 0 0消費產(chǎn)品號:0 0 9 9消費者:4緩神區(qū):0指針指向:80 0 0 0消費產(chǎn)品號:0 0 0 9生產(chǎn)者:1 緩沖區(qū):。指針指向:100 0 0 0生產(chǎn)產(chǎn)品號:1717消費者:3緩神區(qū):0指針指向:90 0 0 0消費產(chǎn)品號:e e
27、 e o917生產(chǎn)者:3 緩沖區(qū):。指針指向:H0 0 0 0生產(chǎn)產(chǎn)品號:130 0 0 0 1713生產(chǎn)者:4緩神區(qū):0指針指向:120 0 0 0生產(chǎn)產(chǎn)品號:120 0 0 0 171312生產(chǎn)者:5緩沖區(qū):0指針指向:130 0 0 0生產(chǎn)產(chǎn)品號:180 0 0 0 17131218生產(chǎn)者:2緩神區(qū):0指針指向:140 0 0 0生產(chǎn)產(chǎn)品號:12e e 0 o 1713121812消費者:2 緩沖區(qū):。指針指向:ie0 0 0 0消費產(chǎn)品號:170 0 0 0 0131812消費者:5緩神區(qū):0指針指向:116 0 0 0消費產(chǎn)品號:136 0 0 0 0121812消費者:4緩沖區(qū):0
28、指針指向:120 0 0 0消費產(chǎn)品號:120 0 0 0 01812.結(jié)論本次課程設(shè)計主要是對操作系統(tǒng)中線程,進程同步互斥等知識的揉合應(yīng)用, 生產(chǎn)者-消費者問題是一個著名的同步問題,原理易懂,但操作并不簡單。本次 編寫的程序基本實現(xiàn)了設(shè)計要求的功能,但并沒有做到真正的完善,系統(tǒng)還有一 點小瑕疵,對于某些方面的小問題沒有能解決。 但這次課程設(shè)計通過我們組員的 努力還是基本完成了,對于自身的幫助非常大,無論是編寫程序還是設(shè)計等各方 面都有很大的提升。.收獲、體會和建議經(jīng)過2.5天的課程設(shè)計,我們完成了一個生產(chǎn)者-消費者問題的小程序,這 個程序主要考察的是是P、V操作,實驗設(shè)一個共享緩沖區(qū),生產(chǎn)者和消費者互 斥的使用,當一個線程使用緩沖區(qū)的時候,另一個讓其等待直到前一個線程釋放 緩沖區(qū)為止。還有就是對進程,線程的操作。實
溫馨提示
- 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)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度農(nóng)業(yè)保險代理與服務(wù)合同
- 2025年度高端制造裝備研發(fā)股權(quán)投資及市場拓展合同
- 二零二五年度南昌商品房買賣合同2025版標準文本
- 2025年度個人門面出租合同附贈增值服務(wù)范本3篇
- 2025年度鋼材運輸服務(wù)合同模板
- 二零二五年度跨境電商進口生鮮食品采購合同范本4篇
- 華為認證智能協(xié)作中級 HCIP-Collaboration H11-861考試題庫及答案
- 2025年度汽車租賃車輛租賃價格調(diào)整合同6篇
- 2025年度模具行業(yè)學(xué)徒培養(yǎng)用工合同示范4篇
- 2025年度南匯工商行政管理志編纂服務(wù)合同4篇
- 農(nóng)村自建房安全合同協(xié)議書
- 《教科版》二年級科學(xué)下冊全冊課件(完整版)
- 杜仲葉藥理作用及臨床應(yīng)用研究進展
- 4S店售后服務(wù)6S管理新規(guī)制度
- 高性能建筑鋼材的研發(fā)與應(yīng)用
- 無線廣播行業(yè)現(xiàn)狀分析
- 漢語言溝通發(fā)展量表(長表)-詞匯及手勢(8-16月齡)
- 高速公路相關(guān)知識講座
- 兒科關(guān)于抗生素使用的PDCA
- 小學(xué)生必備古詩
- 手術(shù)室護理實踐指南2023年
評論
0/150
提交評論