版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 操作系統(tǒng)課程設(shè)計(jì)報(bào)告</p><p> 生產(chǎn)者與消費(fèi)者算法的實(shí)現(xiàn)</p><p> 課程名稱:計(jì)算機(jī)操作系統(tǒng)課程設(shè)計(jì)</p><p><b> 小組成員:</b></p><p><b> 班 級(jí):</b></p><p> 時(shí) 間
2、:2010-10-18</p><p><b> 目錄</b></p><p> 1 課設(shè)簡(jiǎn)介:1</p><p> 1.1課程設(shè)計(jì)題目1</p><p> 1.2課程設(shè)計(jì)小組成員1</p><p> 1.3小組成員任務(wù)分配情況及每人所占工作比例1</p><
3、;p> 2生產(chǎn)者和消費(fèi)者原理分析1</p><p> 3 生產(chǎn)者與消費(fèi)者功能描述:1</p><p> 4 數(shù)據(jù)結(jié)構(gòu)分析2</p><p> 5 生產(chǎn)者與消費(fèi)者實(shí)現(xiàn)代碼2</p><p><b> 6心得體會(huì)7</b></p><p><b> 參考文
4、獻(xiàn):7</b></p><p><b> 相關(guān)工具:8</b></p><p><b> 致謝:8</b></p><p><b> 1 課設(shè)簡(jiǎn)介:</b></p><p><b> 1.1課程設(shè)計(jì)題目</b></p>
5、;<p> 生產(chǎn)者與消費(fèi)者算法的實(shí)現(xiàn)</p><p> 1.2課程設(shè)計(jì)小組成員</p><p><b> 張洋、巢蕾、段敏</b></p><p> 1.3小組成員任務(wù)分配情況及每人所占工作比例</p><p> 張 洋 負(fù)責(zé):分析設(shè)計(jì)消費(fèi)一個(gè)產(chǎn)品方法和主方法并且畫出流程圖,后期組織組內(nèi)成員
6、成果匯總進(jìn)行本組總體報(bào)告撰寫。</p><p> 巢 蕾 負(fù)責(zé):分析設(shè)計(jì)生產(chǎn)者的行為方法和消費(fèi)者的行為方法,并且畫出流程圖</p><p> 段 敏 負(fù)責(zé):分析設(shè)計(jì)生產(chǎn)產(chǎn)品的方法和把新生產(chǎn)的產(chǎn)品放入緩沖區(qū),并且畫出流程圖。</p><p> 生產(chǎn)者和消費(fèi)者原理分析</p><p> 在同一個(gè)進(jìn)程地址空間內(nèi)執(zhí)行的兩個(gè)線程。生
7、產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個(gè)空緩沖區(qū)中供消費(fèi)者線程消費(fèi)。消費(fèi)者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。當(dāng)生產(chǎn)者線程生產(chǎn)物品時(shí),如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費(fèi)者線程釋放出一個(gè)空緩沖區(qū)。當(dāng)消費(fèi)者線程消費(fèi)物品時(shí),如果沒有滿的緩沖區(qū),那么消費(fèi)者線程將被阻塞,直到新的物品被生產(chǎn)出來(lái)。</p><p> 3 生產(chǎn)者與消費(fèi)者功能描述:</p><p> 3.1生產(chǎn)者功能
8、描述</p><p> 在同一個(gè)進(jìn)程地址空間內(nèi)執(zhí)行的兩個(gè)線程。生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個(gè)空緩沖區(qū)中供消費(fèi)者線程消費(fèi)。當(dāng)生產(chǎn)者線程生產(chǎn)物品時(shí),如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費(fèi)者線程釋放出一個(gè)空緩沖區(qū)。</p><p> 3.2消費(fèi)者功能描述</p><p> 消費(fèi)者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。當(dāng)消費(fèi)者線程消費(fèi)物品時(shí),如果
9、沒有滿的緩沖區(qū),那么消費(fèi)者線程將被阻塞,直到新的物品被生產(chǎn)出來(lái)。</p><p><b> 3.3程序結(jié)構(gòu)圖:</b></p><p><b> 4 數(shù)據(jù)結(jié)構(gòu)分析</b></p><p> 生產(chǎn)者與消費(fèi)者實(shí)現(xiàn):</p><p> 這其中主要是通過多線程,來(lái)實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者之間的協(xié)調(diào)問題。
10、</p><p> 生產(chǎn)者(producer)——消費(fèi)者(consumer):</p><p> 通過一些記錄性變量,來(lái)記錄模擬實(shí)現(xiàn)生產(chǎn)者的行為,通過輸入語(yǔ)句的提示</p><p> 程序采用OO設(shè)計(jì)模式,緩存區(qū)采用數(shù)組結(jié)構(gòu)存儲(chǔ)。</p><p> 5 生產(chǎn)者與消費(fèi)者實(shí)現(xiàn)代碼</p><p> #includ
11、e <windows.h></p><p> #include <iostream></p><p> const unsigned short SIZE_OF_BUFFER = 10; //緩沖區(qū)長(zhǎng)度</p><p> unsigned short ProductID = 0; //產(chǎn)品號(hào)</p><p>
12、; unsigned short ConsumeID = 0; //將被消耗的產(chǎn)品號(hào)</p><p> unsigned short in = 0; //產(chǎn)品進(jìn)緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo)</p><p> unsigned short out = 0; //產(chǎn)品出緩沖區(qū)時(shí)的緩沖區(qū)下標(biāo)</p><p> int g_buffer[SIZE_
13、OF_BUFFER]; //緩沖區(qū)是個(gè)循環(huán)隊(duì)列</p><p> bool g_continue = true; //控制程序結(jié)束</p><p> HANDLE g_hMutex; //用于線程間的互斥</p><p> HANDLE g_hFullSemaphore; //當(dāng)緩沖區(qū)滿時(shí)迫使生產(chǎn)者等待</p>
14、<p> HANDLE g_hEmptySemaphore; //當(dāng)緩沖區(qū)空時(shí)迫使消費(fèi)者等待</p><p> DWORD WINAPI Producer(LPVOID); //生產(chǎn)者線程</p><p> DWORD WINAPI Consumer(LPVOID); //消費(fèi)者線程</p><p> int main()&l
15、t;/p><p><b> {</b></p><p> //創(chuàng)建各個(gè)互斥信號(hào)</p><p> g_hMutex = CreateMutex(NULL,FALSE,NULL);</p><p> g_hFullSemaphore = CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZ
16、E_OF_BUFFER-1,NULL);</p><p> g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);</p><p> //調(diào)整下面的數(shù)值,可以發(fā)現(xiàn),當(dāng)生產(chǎn)者個(gè)數(shù)多于消費(fèi)者個(gè)數(shù)時(shí),</p><p> //生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費(fèi)者;反之,消費(fèi)者經(jīng)常等待 </
17、p><p> const unsigned short PRODUCERS_COUNT = 3; //生產(chǎn)者的個(gè)數(shù)</p><p> const unsigned short CONSUMERS_COUNT = 1; //消費(fèi)者的個(gè)數(shù)</p><p><b> //總的線程數(shù)</b></p><p> const
18、 unsigned short THREADS_COUNT = PRODUCERS_COUNT+CONSUMERS_COUNT;</p><p> HANDLE hThreads[PRODUCERS_COUNT]; //各線程的handle</p><p> DWORD producerID[CONSUMERS_COUNT]; //生產(chǎn)者線程的標(biāo)識(shí)符</p><p&
19、gt; DWORD consumerID[THREADS_COUNT]; //消費(fèi)者線程的標(biāo)識(shí)符</p><p><b> //創(chuàng)建生產(chǎn)者線程</b></p><p> for (int i=0;i<PRODUCERS_COUNT;++i){</p><p> hThreads[i]=CreateThread(NULL,0,Pro
20、ducer,NULL,0,&producerID[i]);</p><p> if (hThreads[i]==NULL) return -1;</p><p><b> }</b></p><p><b> //創(chuàng)建消費(fèi)者線程</b></p><p> for (i=0;i<
21、CONSUMERS_COUNT;++i){</p><p> hThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumerID[i]);</p><p> if (hThreads[i]==NULL) return -1;</p><p><b> }<
22、;/b></p><p> while(g_continue){</p><p> if(getchar()){ //按回車后終止程序運(yùn)行</p><p> g_continue = false;</p><p><b> }</b></p><p><b> }<
23、/b></p><p><b> return 0;</b></p><p><b> }</b></p><p> //生產(chǎn)一個(gè)產(chǎn)品。簡(jiǎn)單模擬了一下,僅輸出新產(chǎn)品的ID號(hào)</p><p> void Produce()</p><p><b> {
24、</b></p><p> std::cerr << "Producing " << ++ProductID << " ... ";</p><p> std::cerr << "Succeed" << std::endl;</p><
25、p><b> }</b></p><p> //把新生產(chǎn)的產(chǎn)品放入緩沖區(qū)</p><p> void Append()</p><p><b> {</b></p><p> std::cerr << "Appending a product ... "
26、;;</p><p> g_buffer[in] = ProductID;</p><p> in = (in+1)%SIZE_OF_BUFFER;</p><p> std::cerr << "Succeed" << std::endl;</p><p> //輸出緩沖區(qū)當(dāng)前的狀態(tài)<
27、/p><p> for (int i=0;i<SIZE_OF_BUFFER;++i){</p><p> std::cout << i <<": " << g_buffer[i];</p><p> if (i==in) std::cout << " <-- 生產(chǎn)"
28、;</p><p> if (i==out) std::cout << " <-- 消費(fèi)";</p><p> std::cout << std::endl;</p><p><b> }</b></p><p><b> }</b><
29、/p><p> //從緩沖區(qū)中取出一個(gè)產(chǎn)品</p><p> void Take()</p><p><b> {</b></p><p> std::cerr << "Taking a product ... ";</p><p> ConsumeID =
30、g_buffer[out];</p><p> out = (out+1)%SIZE_OF_BUFFER;</p><p> std::cerr << "Succeed" << std::endl;</p><p> //輸出緩沖區(qū)當(dāng)前的狀態(tài)</p><p> for (int i=0;i&
31、lt;SIZE_OF_BUFFER;++i){</p><p> std::cout << i <<": " << g_buffer[i];</p><p> if (i==in) std::cout << " <-- 生產(chǎn)";</p><p> if (i==out
32、) std::cout << " <-- 消費(fèi)";</p><p> std::cout << std::endl;</p><p><b> }</b></p><p><b> }</b></p><p><b> //消耗一個(gè)
33、產(chǎn)品</b></p><p> void Consume()</p><p><b> {</b></p><p> std::cerr << "Consuming " << ConsumeID << " ... ";</p><p
34、> std::cerr << "Succeed" << std::endl;</p><p><b> }</b></p><p><b> //生產(chǎn)者</b></p><p> DWORD WINAPI Producer(LPVOID lpPara)</p
35、><p><b> {</b></p><p> while(g_continue){</p><p> WaitForSingleObject(g_hFullSemaphore,INFINITE);</p><p> WaitForSingleObject(g_hMutex,INFINITE);</p>
36、<p> Produce();</p><p><b> Append();</b></p><p> Sleep(1500);</p><p> ReleaseMutex(g_hMutex);</p><p> ReleaseSemaphore(g_hEmptySemaphore,1,NULL)
37、;</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p><b> //消費(fèi)者</b></p><p> DWORD WINAP
38、I Consumer(LPVOID lpPara)</p><p><b> {</b></p><p> while(g_continue){</p><p> WaitForSingleObject(g_hEmptySemaphore,INFINITE);</p><p> WaitForSingleObje
39、ct(g_hMutex,INFINITE);</p><p><b> Take();</b></p><p> Consume();</p><p> Sleep(1500);</p><p> ReleaseMutex(g_hMutex);</p><p> ReleaseSemap
40、hore(g_hFullSemaphore,1,NULL);</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> } </b></p><p> /* 一個(gè)消費(fèi)者三個(gè)生產(chǎn)者:</p>&
41、lt;p> /* 三個(gè)生產(chǎn)者三個(gè)消費(fèi)者</p><p> /*三個(gè)消費(fèi)者一個(gè)生產(chǎn)者</p><p> /*三個(gè)生產(chǎn)者四個(gè)消費(fèi)者</p><p><b> 心得體會(huì)</b></p><p> 本次課程設(shè)是關(guān)于生產(chǎn)者與消費(fèi)者之間互斥和同步的問題。問題的實(shí)質(zhì)是P、V操作,實(shí)驗(yàn)設(shè)一個(gè)共享緩沖區(qū),生產(chǎn)者和消費(fèi)者互斥
42、的使用,當(dāng)一個(gè)線程使用緩沖區(qū)的時(shí)候,另一個(gè)讓其等待直到前一個(gè)線程釋放緩沖區(qū)為止。</p><p> 生產(chǎn)者與消費(fèi)者是一個(gè)與現(xiàn)實(shí)有關(guān)的經(jīng)典問題,與“和尚挑水”問題的原理相同,通過此原理舉一反三可以解決其他類似的問題。</p><p> 通過本課程設(shè)計(jì),我們對(duì)操作系統(tǒng)的p、v進(jìn)一步的認(rèn)識(shí),深入的了解p、v操作的實(shí)質(zhì)和其重要性。課本的理論知識(shí)進(jìn)一步闡述了現(xiàn)實(shí)中的實(shí)際問題。</p>
43、<p> 實(shí)驗(yàn)中,我們小組分工合作,共同學(xué)習(xí),雖然在課程設(shè)計(jì)中遇到了一些問題,但在老師和同學(xué)的細(xì)心指導(dǎo)和熱心幫助下解決了。同時(shí),了解到團(tuán)隊(duì)精神的重要性,也為以后的學(xué)習(xí)和工作打下了堅(jiān)實(shí)的基礎(chǔ),同時(shí)積累了寶貴的經(jīng)驗(yàn)。</p><p><b> 參考文獻(xiàn):</b></p><p> [1] 湯小丹 梁紅兵 哲鳳屏 湯子瀛 計(jì)算機(jī)操作系統(tǒng)(第三版)西安電子
44、科技大學(xué)出版社 2007.12</p><p><b> 相關(guān)工具:</b></p><p> [1] 代碼編寫、分析工具:Visual C++ </p><p> [2] 流程圖分析工具:Microsoft visio</p><p><b> 致謝:</b></p><
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告---生產(chǎn)者消費(fèi)者同步算法
- 操作系統(tǒng)生產(chǎn)者與消費(fèi)者課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題
- 操作系統(tǒng)課程設(shè)計(jì)生產(chǎn)者消費(fèi)者
- 操作系統(tǒng)課程設(shè)計(jì)——生產(chǎn)者消費(fèi)者問題
- 操作系統(tǒng)課程設(shè)計(jì)——生產(chǎn)者消費(fèi)者問題
- 生產(chǎn)者消費(fèi)者問題操作系統(tǒng)課程設(shè)計(jì)
- 實(shí)現(xiàn)生產(chǎn)者消費(fèi)者問題和實(shí)現(xiàn)銀行家算法的課程設(shè)計(jì)
- 生產(chǎn)者與消費(fèi)者報(bào)告
- 利用信號(hào)量,pv,管程等解決生產(chǎn)者消費(fèi)者問題——操作系統(tǒng)原理課程設(shè)計(jì)提優(yōu)論文
- 6:生產(chǎn)者消費(fèi)者問題
- 6:生產(chǎn)者消費(fèi)者問題
- 生產(chǎn)者和消費(fèi)者問題實(shí)驗(yàn)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)---讀者-寫者問題實(shí)現(xiàn)
- 大連理工大學(xué)軟件學(xué)院操作系統(tǒng)上機(jī)實(shí)驗(yàn)之生產(chǎn)者與消費(fèi)者問題
- 讀者與寫者-操作系統(tǒng)課程設(shè)計(jì)實(shí)驗(yàn)報(bào)告
- 操作系統(tǒng)原理課程設(shè)計(jì)讀者-寫者問題的實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)--讀者寫者問題
- 操作系統(tǒng)課程設(shè)計(jì)-- linux下讀者與寫者的問題實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)-讀者寫者問題
評(píng)論
0/150
提交評(píng)論