操作系統(tǒng)實(shí)驗(yàn)報(bào)告--經(jīng)典的生產(chǎn)者—消費(fèi)者問題_第1頁
操作系統(tǒng)實(shí)驗(yàn)報(bào)告--經(jīng)典的生產(chǎn)者—消費(fèi)者問題_第2頁
操作系統(tǒng)實(shí)驗(yàn)報(bào)告--經(jīng)典的生產(chǎn)者—消費(fèi)者問題_第3頁
操作系統(tǒng)實(shí)驗(yàn)報(bào)告--經(jīng)典的生產(chǎn)者—消費(fèi)者問題_第4頁
操作系統(tǒng)實(shí)驗(yàn)報(bào)告--經(jīng)典的生產(chǎn)者—消費(fèi)者問題_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

實(shí)驗(yàn)二 經(jīng)典的生產(chǎn)者消費(fèi)者問題一、目的實(shí)現(xiàn)對經(jīng)典的生產(chǎn)者消費(fèi)者問題的模擬,以便更好的理解經(jīng)典進(jìn)程同步問題。二、實(shí)驗(yàn)內(nèi)容及要求編制生產(chǎn)者消費(fèi)者算法,模擬一個(gè)生產(chǎn)者、一個(gè)消費(fèi)者,共享一個(gè)緩沖池的情形。1、實(shí)現(xiàn)對經(jīng)典的生產(chǎn)者消費(fèi)者問題的模擬,以便更好的理解此經(jīng)典進(jìn)程同步問題。生產(chǎn)者消費(fèi)者問題是典型的PV操作問題,假設(shè)系統(tǒng)中有一個(gè)比較大的緩沖池,生產(chǎn)者的任務(wù)是只要緩沖池未滿就可以將生產(chǎn)出的產(chǎn)品放入其中,而消費(fèi)者的任務(wù)是只要緩沖池未空就可以從緩沖池中拿走產(chǎn)品。緩沖池被占用時(shí),任何進(jìn)程都不能訪問。2、每一個(gè)生產(chǎn)者都要把自己生產(chǎn)的產(chǎn)品放入緩沖池,每個(gè)消費(fèi)者從緩沖池中取走產(chǎn)品消費(fèi)。在這種情況下,生產(chǎn)者消費(fèi)者進(jìn)程同步,因?yàn)橹挥型ㄟ^互通消息才知道是否能存入產(chǎn)品或者取走產(chǎn)品。他們之間也存在互斥,即生產(chǎn)者消費(fèi)者必須互斥訪問緩沖池,即不能有兩個(gè)以上的進(jìn)程同時(shí)進(jìn)行。三、生產(chǎn)者和消費(fèi)者原理分析在同一個(gè)進(jìn)程地址空間內(nèi)執(zhí)行兩個(gè)線程。生產(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)出來。四、生產(chǎn)者與消費(fèi)者功能描述:生產(chǎn)者功能描述:在同一個(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ū)。消費(fèi)者功能描述:消費(fèi)者線程從緩沖區(qū)獲得物品,然后釋放緩沖區(qū),當(dāng)消費(fèi)者線程消費(fèi)物品時(shí),如果沒有滿的緩沖區(qū),那么消費(fèi)者線程將被阻塞,直到新的物品被生產(chǎn)出來。五、實(shí)驗(yàn)環(huán)境操作系統(tǒng)環(huán)境:Windows系統(tǒng)。編程語言:C#。六、生產(chǎn)者與消費(fèi)者的思路和設(shè)計(jì)1、程序流程圖(1) 生產(chǎn)者 NYYN開 始生產(chǎn)產(chǎn)品Wait (empty)empty0Wait (mutex)Mutex=1存入緩沖區(qū)empty = empty- 1Signal (mutex)Signal (full)緩沖區(qū)內(nèi)已滿,已無可用緩沖區(qū)緩沖區(qū)正被其他進(jìn)程占用結(jié) 束(2) 消費(fèi)者NYYN開 始Wait (full) 消費(fèi)請求full0Wait (mutex)Mutex=1消 費(fèi)full = full - 1Signal (mutex)Signal (empty)緩沖區(qū)內(nèi)產(chǎn)品已空,不能進(jìn)行消費(fèi)緩沖區(qū)正被其他進(jìn)程占用結(jié) 束2、主要程序代碼/初始化變量 private void Form1_Load(object sender, EventArgs e) mutex = 1; /互斥信號量 full = 0; /緩沖池中滿緩沖區(qū)的數(shù)量 empty = 5;/緩沖池中空緩沖區(qū)的數(shù)量 count1 = 0;/生產(chǎn)的產(chǎn)品數(shù)目 i = 0; lb_mutex.Text = 1; lb_full.Text = 0; lb_empty.Text = 5; /消費(fèi)者從緩沖區(qū)中消費(fèi)一個(gè)產(chǎn)品 private void consumer_Click(object sender, EventArgs e) if (full 0) /消費(fèi)者已進(jìn)入互斥臨界區(qū) if (mutex = 1) /申請進(jìn)入臨界區(qū) mutex = 0; /消費(fèi)者已進(jìn)入互斥臨界區(qū) lb_mutex.Text = 0; timer_consumer.Enabled = true;/啟動消費(fèi)者消費(fèi)緩沖區(qū)產(chǎn)品 else MessageBox.Show(緩沖區(qū)被占用,請等待。, 信息提MessageBoxButtons.OK); else MessageBox.Show(緩沖區(qū)為空,不能消費(fèi)!, 信息提示, MessageBoxButtons.OK); /生產(chǎn)者向緩沖區(qū)中存入一個(gè)產(chǎn)品 private void producer_Click(object sender, EventArgs e) count1 = count1 + 1; /生產(chǎn)一個(gè)產(chǎn)品 if (empty 0) /有緩沖區(qū)可放產(chǎn)品 if (mutex = 1) /申請進(jìn)入臨界區(qū) mutex = 0; /生產(chǎn)者已進(jìn)入臨界區(qū) lb_mutex.Text = 0;timer1.Start(); /啟動生產(chǎn)者將產(chǎn)品放入緩沖區(qū) else /不能進(jìn)入臨界區(qū) count1 = count1 - 1; MessageBox.Show(緩沖區(qū)被占用,請等待。, 信息提示, MessageBoxButtons.OK); else MessageBox.Show(緩沖區(qū)已滿!, 信息提示, MessageBoxButtons.OK); /無緩沖區(qū)可放產(chǎn)品 count1 = count1 - 1; /生產(chǎn)者 private void timer1_Tick_1(object sender, EventArgs e) if (bool1) switch (count1) case 1: pictureBox1.Visible = true; break; case 2: pictureBox2.Visible = true; break; case 3: pictureBox3.Visible = true; break; case 4: pictureBox4.Visible = true; break; case 5: pictureBox5.Visible = true; break; lb_show.Text = 生產(chǎn)者進(jìn)程占用緩沖區(qū),請等待。; bool1 = false; else switch (count1) case 1: pictureBox1.Visible = false; break; case 2: pictureBox2.Visible = false; break; case 3: pictureBox3.Visible = false; break; case 4: pictureBox4.Visible = false; break; case 5: pictureBox5.Visible = false; break; lb_show.Text = 生產(chǎn)者進(jìn)程占用緩沖區(qū),請等待。; bool1 = true; i = i + 1; if (i = 5) /循環(huán)緩沖區(qū),首尾相接 i = 0; timer1.Enabled = false; mutex = 1; lb_mutex.Text = 1; switch (count1) case 1: pictureBox1.Visible = true; break; case 2: pictureBox2.Visible = true; break; case 3: pictureBox3.Visible = true; break; case 4: pictureBox4.Visible = true; break; case 5: pictureBox5.Visible = true; break; full = full + 1; lb_full.Text = full.ToString(); empty = empty - 1; lb_empty.Text = empty.ToString(); lb_show.Text = 生產(chǎn)結(jié)束!; /消費(fèi)者 private void timer_consumer_Tick(object sender, EventArgs e) if(bool1) switch(count1) case 1: pictureBox1.Visible = true; break; case 2: pictureBox2.Visible = true; break; case 3: pictureBox3.Visible = true; break; case 4: pictureBox4.Visible = true; break; case 5: pictureBox5.Visible = true; break; lb_show.Text = 消費(fèi)者進(jìn)程占用緩沖區(qū),請等待。; bool1 =false; else switch(count1) case 1: pictureBox1.Visible = false; break; case 2: pictureBox2.Visible = false; break; case 3: pictureBox3.Visible = false; break; case 4: pictureBox4.Visible = false; break; case 5: pictureBox5.Visible = false; break; lb_show.Text= 消費(fèi)者進(jìn)程占用緩沖區(qū),請等待。; bool1= true; i = i + 1;if(i=5) i = 0; timer_consumer.Enabled = false; mutex = 1;lb_mutex.Text= 1; switch(count1) case 1: pictureBox1.Visible = false; break; case 2: pictureBox2.Visible = false; break; case 3: pictureBox3.Visible = false; break; case 4: pictureBox4.Visible = false; break; case 5: pictureBox5.Visible = false; break; count1 = count1 - 1;full = full - 1;lb_full.Text = full.ToString();empty = empty+1; lb_empty.Text=empty.ToString(); lb_show.Text=消費(fèi)結(jié)束!; 3、運(yùn)行界面和運(yùn)行結(jié)果一般情況下,點(diǎn)一次生產(chǎn)者按紐,mutex由1變?yōu)?,緩沖區(qū)呈現(xiàn)閃爍狀態(tài)(表示正在存儲),此時(shí)不可以再進(jìn)行緩沖區(qū)操作,否則將顯示“生產(chǎn)者進(jìn)程正在占用緩沖區(qū),請等待”。閃爍約1.5秒后,mutex由0變?yōu)?,閃爍停止,表示存儲過程結(jié)束;點(diǎn)一次消費(fèi)者按紐,mutex由1變?yōu)?,緩沖區(qū)呈現(xiàn)閃爍狀態(tài)(表示正在消費(fèi)),此時(shí)不可以再進(jìn)行緩沖區(qū)操作,否則將顯示“消費(fèi)者進(jìn)程正在占用緩沖區(qū),請等待”。閃爍約1.5秒后,mutex由0變?yōu)?,閃爍停止,表示消費(fèi)過程結(jié)束。緩沖池滿后,若再點(diǎn)生產(chǎn)者按紐,會給出信息提示:“緩沖區(qū)已滿!”。緩沖池空后,若再點(diǎn)消費(fèi)者按紐,也會給出信息提示:“緩沖區(qū)為空,不能消費(fèi)!”。在存儲狀態(tài)或消費(fèi)狀態(tài)(閃爍狀態(tài)),無論是點(diǎn)生產(chǎn)者按紐還是消費(fèi)者按紐都會給出“緩沖區(qū)被占用,請等待。”信息提示。七、心得體會本次實(shí)驗(yàn)是關(guān)于生產(chǎn)者與消費(fèi)者之間互斥和同步的問題。問題的是指是P、V操作,實(shí)驗(yàn)設(shè)一個(gè)共享緩沖區(qū),生產(chǎn)者和消費(fèi)者互斥的使用,當(dāng)一

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論