欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      實驗4生產(chǎn)者消費者問題報告

      時間:2019-05-14 08:10:49下載本文作者:會員上傳
      簡介:寫寫幫文庫小編為你整理了多篇相關(guān)的《實驗4生產(chǎn)者消費者問題報告》,但愿對你工作學(xué)習(xí)有幫助,當(dāng)然你在寫寫幫文庫還可以找到更多《實驗4生產(chǎn)者消費者問題報告》。

      第一篇:實驗4生產(chǎn)者消費者問題報告

      南京信息工程大學(xué) 實驗(實習(xí))報告

      實驗(實習(xí))名稱 生產(chǎn)者-消費者問題的模擬實現(xiàn) 實驗(實習(xí))日期 2014.11.30 得分 指導(dǎo)教師 陳遙

      系 計算機(jī)

      專業(yè) 計科 年級 12級

      班次 2 姓名 唐薇 學(xué)號 20122308061

      一、實驗?zāi)康?/p>

      本實驗的目的是通過編寫和調(diào)試一個解決生產(chǎn)者–消費者問題的簡單模擬程序,進(jìn)一步深入理解課堂教學(xué)中講授的進(jìn)程同步問題,以及用于解決同步問題的信號量機(jī)制的基本思想,即通過研究進(jìn)程同步和信號量機(jī)制實現(xiàn)生產(chǎn)者消費者問題的并發(fā)控制,以便階段性地鞏固學(xué)習(xí)成果。

      二、實驗內(nèi)容

      (1)概述

      說明:有界緩沖區(qū)內(nèi)設(shè)有20個存儲單元,放入/取出的數(shù)據(jù)項設(shè)定為1-20這20個整型數(shù)。

      編制程序模擬解決生產(chǎn)者-消費者同步問題。具體設(shè)計要求:(1)每個生產(chǎn)者和消費者對有界緩沖區(qū)進(jìn)行操作后,即時顯示有界緩沖區(qū)的全部內(nèi)容,當(dāng)前指針位置和生產(chǎn)者/消費線程的標(biāo)識符。(2)生產(chǎn)者和消費者各有兩個以上。(3)多個生產(chǎn)者或多個消費者之間須有共享對緩沖區(qū)進(jìn)行操作的函數(shù)代碼。(2)設(shè)計原理

      通過一個有界緩沖區(qū)把生產(chǎn)者和消費者聯(lián)系起來。假定生產(chǎn)者和消費者的優(yōu)先級是相同的,只要緩沖區(qū)未滿,生產(chǎn)者就可以生產(chǎn)產(chǎn)品并將產(chǎn)品送入緩沖區(qū)。類似地,只要緩沖區(qū)未空,消費者就可以從緩沖區(qū)中取走產(chǎn)品。應(yīng)該禁止生產(chǎn)者向滿的緩沖區(qū)送入產(chǎn)品,同時也應(yīng)該禁止消費者從空的緩沖區(qū)中取出產(chǎn)品,這一機(jī)制由生產(chǎn)者線程和消費者線程之間的互斥關(guān)系來實現(xiàn)。與計算打印兩進(jìn)程同步關(guān)系相同,生產(chǎn)者和消費者兩進(jìn)程Producer和Consumer之間應(yīng)滿足下列兩個同步條件:

      ? 只有在緩沖池中至少有一個緩沖區(qū)已存入消息后,消費者才能從中提取信息,否則消費者必須等待。

      ? 只有緩沖池中至少有一個緩沖區(qū)是空時,生產(chǎn)者才能把消息放入緩沖區(qū),否則生產(chǎn)者必須等待。

      為了滿足第一個同步條件,設(shè)置一個同步信號量full,它代表的資源是緩沖區(qū)滿,它的初始值為0,它的值為n時整個緩沖池滿。這個資源是消費者進(jìn)程Consumer所有,Consumer進(jìn)程可以申請該資源,對它施加P操作,而Consumer進(jìn)程的合作進(jìn)程生產(chǎn)者進(jìn)程Producer對它施加V操作。同樣為了滿足第二個同步條件,設(shè)置另一個同步信號量empty,它代表的資源是緩沖空區(qū),它的初始值為n,表示緩沖池中所有緩沖區(qū)空。信號量full表示可用緩沖區(qū)數(shù)量,信號量empty表示緩沖區(qū)數(shù)量,設(shè)置整型變量:存入指針in和取出指針out。

      為解決生產(chǎn)者/消費者問題,應(yīng)該設(shè)置兩個資源信號量,其中一個表示空緩沖區(qū)的數(shù)目,用g_hFullSemaphore表示,其初始值為有界緩沖區(qū)的大小SIZE_OF_BUFFER;另一個表示緩沖區(qū)中產(chǎn)品的數(shù)目,用g_hEmptySemaphore表示,其初始值為0。另外,由于有界緩沖區(qū)是一個臨界資源,必須互斥使用,所以還需要在設(shè)置一個互斥信號量g_hMutex,初始值為1.P原語的主要動作是:

      ? sem(信號量)減1;

      ? 若sem減一后仍大于或等于零,則進(jìn)程繼續(xù)執(zhí)行;

      ? 若sem減一后小于零,則該進(jìn)程被阻塞后入與該信號相對應(yīng)的隊列中,然后轉(zhuǎn)進(jìn)程調(diào)度。V原語的操作主要動作是:

      ? sem加1;

      ? 若相加結(jié)果大于零,進(jìn)程繼續(xù)執(zhí)行;

      ③若相加結(jié)果小于或等于零,則從該信號的等待隊列中喚醒一等待進(jìn)程然后再返回原進(jìn)程繼續(xù)執(zhí)行或轉(zhuǎn)進(jìn)程調(diào)度。

      采用的同步方法:

      1)利用函數(shù)CreateMutex(NULL,FALSE,NULL)創(chuàng)建互斥信號量g_hMutex,表示緩沖區(qū)當(dāng)前的狀態(tài),若為true時,則表示緩沖區(qū)正被別的進(jìn)程使用。三個參數(shù)表示的意義分別為:指向安全屬性的指針,初始化互斥對象的所有者,指向互斥對象名的指針。

      2)利用函數(shù)CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1, NULL)創(chuàng)建緩沖區(qū)空的信號量g_hFullSemaphore,值為true時表示緩沖區(qū)已滿。四個參數(shù)分別為:表示是否允許繼承、設(shè)置信號機(jī)的初始計數(shù)、設(shè)置信號機(jī)的最大計數(shù)、指定信號機(jī)對象的名稱(-1是因為計數(shù)從開始)。

      3)利用函數(shù)CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL)創(chuàng)建緩沖區(qū)滿的信號量g_hEmptySemaphore,該值為true時表示緩沖區(qū)為空。

      程序清單 1.存儲結(jié)構(gòu)定義

      利用信號量解決生產(chǎn)者消費者問題

      const unsigned short SIZE_OF_BUFFER = 20;//緩沖區(qū)長度 unsigned short ProductID = 0;//產(chǎn)品號

      unsigned short ConsumeID = 0;//將被消耗的產(chǎn)品號

      unsigned short in = 0;//產(chǎn)品進(jìn)緩沖區(qū)時的緩沖區(qū)下標(biāo) unsigned short out = 0;//產(chǎn)品出緩沖區(qū)時的緩沖區(qū)下標(biāo) int g_buffer[SIZE_OF_BUFFER];//緩沖區(qū)是個循環(huán)隊列 bool g_continue = true;//控制程序結(jié)束 HANDLE g_hMutex;//用于線程間的互斥

      HANDLE g_hFullSemaphore;//當(dāng)緩沖區(qū)滿時迫使生產(chǎn)者等待 HANDLE g_hEmptySemaphore;//當(dāng)緩沖區(qū)空時迫使消費者等待 DWORD WINAPI Producer(LPVOID);//生產(chǎn)者線程 DWORD WINAPI Consumer(LPVOID);//消費者線程

      2.算法相關(guān)的函數(shù)

      (1)創(chuàng)建各個互斥信號以及生產(chǎn)者線程和消費者線程的函數(shù)在如下主函數(shù)里面所示: int main(){ //創(chuàng)建各個互斥信號

      g_hMutex = CreateMutex(NULL,FALSE,NULL);g_hFullSemaphore=CreateSemaphore(NULL,SIZE_OF_BUFFER-1,SIZE_OF_BUFFER-1,NULL);g_hEmptySemaphore = CreateSemaphore(NULL,0,SIZE_OF_BUFFER-1,NULL);//調(diào)整下面的數(shù)值,可以發(fā)現(xiàn),當(dāng)生產(chǎn)者個數(shù)多于消費者個數(shù)時,//生產(chǎn)速度快,生產(chǎn)者經(jīng)常等待消費者;反之,消費者經(jīng)常等待。const unsigned short PRODUCERS_COUNT = 3;//生產(chǎn)者的個數(shù) const unsigned short CONSUMERS_COUNT = 1;//消費者的個數(shù) //總的線程數(shù)

      const unsigned short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;HANDLE hThreads[THREADS_COUNT];//各線程的handle DWORD producerID[PRODUCERS_COUNT];//生產(chǎn)者線程的標(biāo)識符 DWORD consumerID[CONSUMERS_COUNT];//消費者線程的標(biāo)識符 //創(chuàng)建生產(chǎn)者線程

      for(int i=0;i< PRODUCERS_COUNT;++i){ hThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producerID[i]);if(hThreads[i]==NULL)return-1;} //創(chuàng)建消費者線程

      for(i=0;i

      //生產(chǎn)一個產(chǎn)品。簡單模擬了一下,僅輸出新產(chǎn)品的ID號 void Produce(){ std::cerr << “Producing ” << ++ProductID << “ *** ”;std::cerr << “Succeed” << std::endl;}(3)把新生產(chǎn)的產(chǎn)品放入緩沖區(qū)的函數(shù): //把新生產(chǎn)的產(chǎn)品放入緩沖區(qū) void Append(){ std::cerr << “Appending a product *** ”;g_buffer[in] = ProductID;in =(in+1)%SIZE_OF_BUFFER;std::cerr << “Succeed” << std::endl;}(4)輸出緩沖區(qū)當(dāng)前的狀態(tài)的代碼: //輸出緩沖區(qū)當(dāng)前的狀態(tài)

      for(int i=0;i

      for(int i=0;i

      DWORD WINAPI Producer(LPVOID lpPara){ while(g_continue){ WaitForSingleObject(g_hFullSemaphore,INFINITE);WaitForSingleObject(g_hMutex,INFINITE);Produce();Append();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hEmptySemaphore,1,NULL);} return 0;}(2)消費者算法: //消費者

      DWORD WINAPI Consumer(LPVOID lpPara){ while(g_continue){ WaitForSingleObject(g_hEmptySemaphore,INFINITE);WaitForSingleObject(g_hMutex,INFINITE);Take();Consume();Sleep(1500);ReleaseMutex(g_hMutex);ReleaseSemaphore(g_hFullSemaphore,1,NULL);} return 0;} ? 運行結(jié)果分析

      輸入輸出數(shù)據(jù)說明和分析:

      該程序設(shè)置的緩沖區(qū)數(shù)據(jù)長度為20,生產(chǎn)者個數(shù)為3,消費者個數(shù)為1,程序啟動后,生產(chǎn)者先進(jìn)行生產(chǎn),當(dāng)3個生產(chǎn)者全部生產(chǎn)完之后,消費者開始從緩沖區(qū)中取出產(chǎn)品,當(dāng)消費者取出一個后,生產(chǎn)者開始繼續(xù)生產(chǎn),當(dāng)生產(chǎn)完3個之后,消費者開始從緩沖池中取產(chǎn)品,依次循環(huán)。

      三、小結(jié)

      通過本次試驗,我對操作系統(tǒng)中線程,進(jìn)程同步互斥等知識的應(yīng)用有了更深的了解,我知道了生產(chǎn)者—消費者問題是很著名的同步問題,的確是既簡單又復(fù)雜。

      第二篇:操作系統(tǒng)實驗報告經(jīng)典生產(chǎn)者—消費者問題

      實 驗 二 經(jīng) 典 的 生 產(chǎn) 者 — 消 費 者 問 題

      一、目的

      實現(xiàn)對經(jīng)典的生產(chǎn)者—消費者問題的模擬,以便更好的理解經(jīng)典進(jìn)程同步問題。

      二、實驗內(nèi)容及要求

      編制生產(chǎn)者—消費者算法,模擬一個生產(chǎn)者、一個消費者,共享一個緩沖池的情形。

      1、實現(xiàn)對經(jīng)典的生產(chǎn)者—消費者問題的模擬,以便更好的理解此經(jīng)典進(jìn)程同步問題。生產(chǎn)者- 消費者問題是典型的 PV 操作問題,假設(shè)系統(tǒng)中有一個比較大的緩沖池,生產(chǎn)者的任務(wù)是只要緩沖池未滿就可以將生產(chǎn)出的產(chǎn)品放入其中,而消費者的任務(wù)是只要緩沖池未空就可以從緩沖池中拿走產(chǎn) 品。緩沖池被占用時,任何進(jìn)程都不能訪問。

      2、每一個生產(chǎn)者都要把自己生產(chǎn)的產(chǎn)品放入緩沖池,每個消費者從緩沖池中取走產(chǎn)品消費。在這種情況下,生產(chǎn)者消費者進(jìn)程同步,因為只有通過互通消息才知道是否能存入產(chǎn)品或者取走產(chǎn)品。他們之間也存在互斥,即生產(chǎn)者消費者必須互斥訪問緩沖池,即不能有兩個以上的進(jìn)程同時進(jìn)行。

      三、生產(chǎn)者和消費者原理分析

      在同一個進(jìn)程地址空間內(nèi)執(zhí)行兩個線程。

      生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費。

      消費者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。

      當(dāng)生產(chǎn)者線程生產(chǎn)物品時,如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費者線程釋放一個空緩沖區(qū)。

      當(dāng)消費者線程消費物品時,如果沒有滿的緩沖區(qū),那么消費者線程將被阻擋,直到新的物品被生產(chǎn)出來。

      四、生產(chǎn)者與消費者功能描述:

      生產(chǎn)者功能描述:在同一個進(jìn)程地址空間內(nèi)執(zhí)行兩個線程。生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費。當(dāng)生產(chǎn)者線程生產(chǎn)物品時,如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費者線程釋放出一個空緩沖區(qū)。

      消費者功能描述:消費者線程從緩沖區(qū)獲得物品,然后釋放緩沖區(qū),當(dāng)消費者線程消費物品時,如果沒有滿的緩沖區(qū),那么消費者線程將被阻塞,直到新的物品被生產(chǎn)出來。

      五、實驗環(huán)境

      操作系統(tǒng)環(huán)境:

      Windows 系統(tǒng)。編程語言:

      C#。

      六、生產(chǎn)者與消費者的思路和設(shè)計

      1、程序流程圖 (1)生產(chǎn)者 開 始 生產(chǎn)產(chǎn)品 Wait empty ≤ 0 Y N Wait 緩沖區(qū)內(nèi)已滿,已無 可用緩沖區(qū) N Mutex=1 Y 緩沖區(qū)正被其他 程占用 進(jìn) 存入緩沖區(qū) empty = empty-1 Signal Signal(full)結(jié) 束

      (2)消費者

      開 始 Wait(full)消費請求 full ≤ 0 Y N Wait 緩沖區(qū)內(nèi)產(chǎn)品已空,不能進(jìn)行消費 N Mutex=1 Y 消 費 緩沖區(qū)正被其他 程占用 進(jìn) full = full-1 Signal Signal 結(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;= “1”;= “0”;= “5”;} // 消費者從緩沖區(qū)中消費一個產(chǎn)品 private void consumer_Click(object sender, EventArgs e){ if(full > 0){ // 消費者已進(jìn)入互斥臨界區(qū) if(mutex == 1)// 申請進(jìn)入臨界區(qū) { mutex = 0;// 消費者已進(jìn)入互斥臨界區(qū) = “0”;= true;// 啟動消費者消費緩沖區(qū)產(chǎn)品 } else {(“ 緩沖區(qū)被占用,請等待。。

      ”, “ 信息提 ”;} } else {(“ 緩沖區(qū)為空,不能消費!”, “ 信息提示 ”,;} } // 生產(chǎn)者向緩沖區(qū)中存入一個產(chǎn)品 private void producer_Click(object sender, EventArgs e){

      count1 = count1 + if(empty > 0){ 1;

      //

      // 生產(chǎn)一個產(chǎn)品

      有緩沖區(qū)可放產(chǎn)品 if(mutex == 1){

      //

      申請進(jìn)入臨界區(qū) mutex = 0;

      //

      生產(chǎn)者已進(jìn)入臨界區(qū) = “0”;

      ();// 啟動生產(chǎn)者將產(chǎn)品放入緩沖區(qū) } else { // 不能進(jìn)入臨界區(qū) count1 = count1-1;(“ 緩沖區(qū)被占用,請等待。。

      ”, “ 信息提示 ”,;} } else {(“ 緩沖區(qū)已滿!”, “ 信息提示 ”,;// 無緩沖區(qū)可放產(chǎn)品 count1 = count1-1;} } // 生產(chǎn)者 private void timer1_Tick_1(object sender, EventArgs e){ if(bool1){ switch(count1){ case 1: = true;break;case 2: = true;break;case 3: = true;break;case 4: = true;break;case 5: = true;break;} = “ 生產(chǎn)者進(jìn)程占用緩沖區(qū),請等待。。

      ”;bool1 = false;} else { switch(count1){ case 1: = false;break;case 2: = false;break;case 3: = false;break;case 4: = false;break;case 5: = false;break;} = “ 生產(chǎn)者進(jìn)程占用緩沖區(qū),請等待。。

      ”;bool1 = true;} i = i + 1;if(i == 5)

      { // 循環(huán)緩沖區(qū),首尾相接 i = 0;= false;mutex = 1;= “1”;switch(count1){ case 1: = true;break;case 2: = true;break;case 3: = true;break;case 4: = true;break;case 5: = true;break;} full = full + 1;=();empty = empty-1;=();= “ 生產(chǎn)結(jié)束!”;} } // 消費者 private void timer_consumer_Tick(object sender, EventArgs e){ if(bool1){ switch(count1){ case 1: = true;break;case 2: = true;break;case 3: = true;break;case 4: = true;break;case 5: = true;break;} = “ 消費者進(jìn)程占用緩沖區(qū),請等待。。

      ”;bool1 =false;} else{ switch(count1){ case 1: = false;break;case 2: = false;break;case 3: = false;break;case 4: = false;break;case 5: = false;break;} = “ 消費者進(jìn)程占用緩沖區(qū),請等待。。

      ”;bool1= true;}

      i = i + 1;if(i==5){ i = 0;= false;mutex = 1;= “1”;switch(count1){ case 1: = false;break;case 2: = false;break;case 3: = false;break;case 4: = false;break;case 5: = false;break;} count1 = count1-1;full = full-1;=();empty = empty+1;=();=“ 消費結(jié)束!

      ”;} 3、運行界面和運行結(jié)果 一般情況下,點一次生產(chǎn)者按紐,mutex 由 1 變?yōu)?0,緩沖區(qū)呈現(xiàn)閃爍狀態(tài)(表示正在存儲),此時不可以再進(jìn)行緩沖區(qū)操作,否則將顯示“生產(chǎn)者進(jìn)程正在占用緩沖區(qū),請等待”。閃爍約秒后,mutex 由 0 變?yōu)?1,閃爍停止,表示存儲過程結(jié)束;點一次消費者按紐,mutex 由 1 變?yōu)?0,緩沖區(qū)呈現(xiàn)閃爍狀態(tài)(表示正在消費),此時不可以再進(jìn)行緩沖區(qū)操作,否則將顯示“消費者進(jìn)程正在占用緩 沖區(qū),請等待”。閃爍約秒后,mutex 由 0 變?yōu)?1,閃爍停止,表示消費過程結(jié)束。緩沖池滿后,若再點生產(chǎn)者按紐,會給出信息提示:

      “緩沖區(qū)已滿!”。

      緩沖池空后,若再點消費者按紐,也會給出信息提示:

      “緩沖區(qū)為空,不能消費!”。

      在存儲狀態(tài)或消費狀態(tài)(閃爍狀態(tài)),無論是點生產(chǎn)者按紐還是消費者按紐都會給出“緩沖區(qū)被占用,請等待。”信息提示。

      七、心得體會

      本次實驗是關(guān)于生產(chǎn)者與消費者之間互斥和同步的問題。問題的是指是 P、V 操作,實驗設(shè)一個共享緩沖區(qū),生產(chǎn)者和消費者互斥的使用,當(dāng)一個線程使用緩沖區(qū)的時候,另一個讓其等待直到前一 個線程釋放緩沖區(qū)為止。

      生產(chǎn)者與消費者是一個與現(xiàn)實有關(guān)的經(jīng)驗問題,通過此原理舉一反三可以解決其他類似的問題。

      通過本實驗設(shè)計,我們對操作系統(tǒng)的 P、V 進(jìn)一步的認(rèn)識,深入的了解 P、V 操作的實質(zhì)和其重 要性。課本的理論知識進(jìn)一步闡述了現(xiàn)實中的實際問題。

      實驗中,我們小組分工合作,共同學(xué)習(xí),雖然在實驗中遇到了一些問題,但在老師和同學(xué)的細(xì)心指導(dǎo)和熱心幫助下解決了。同時,了解到團(tuán)隊精神的重要性,也為以后的學(xué)習(xí)和工作打下了堅實的基礎(chǔ),同時積累了寶貴的經(jīng)驗。

      第三篇:實驗報告五 生產(chǎn)者和消費者問題

      實驗報告五

      ——生產(chǎn)者和消費者問題

      姓名:叢菲 學(xué)號:20100830205 班級:信息安全二班

      一、實習(xí)內(nèi)容

      ? ?

      1、模擬操作系統(tǒng)中進(jìn)程同步和互斥

      2、實現(xiàn)生產(chǎn)者和消費者問題的算法實現(xiàn)

      二、實習(xí)目的

      ? ? ? ? ?

      1、熟悉臨界資源、信號量及PV操作的定義與物理意義

      2、了解進(jìn)程通信的方法

      3、掌握進(jìn)程互斥與進(jìn)程同步的相關(guān)知識

      4、掌握用信號量機(jī)制解決進(jìn)程之間的同步與互斥問題

      5、實現(xiàn)生產(chǎn)者-消費者問題,深刻理解進(jìn)程同步問題

      三、實習(xí)題目

      ? 在Linux操作系統(tǒng)下用C實現(xiàn)經(jīng)典同步問題:生產(chǎn)者—消費者,具體要求如下:

      (1)一個大小為10的緩沖區(qū),初始狀態(tài)為空。

      (2)2個生產(chǎn)者,隨機(jī)等待一段時間,往緩沖區(qū)中添加數(shù)據(jù),若緩沖區(qū)已滿,等待消費者取走數(shù)據(jù)之后再添加,重復(fù)10次。

      (3)2個消費者,隨機(jī)等待一段時間,從緩沖區(qū)中讀取數(shù)據(jù),若緩沖區(qū)為空,等待生產(chǎn)者添加數(shù)據(jù)之后再讀取,重復(fù)10次。? 提示

      本實驗的主要目的是模擬操作系統(tǒng)中進(jìn)程同步和互斥。在系統(tǒng)進(jìn)程并發(fā)執(zhí)行異步推進(jìn)的過程中,由于資源共享和進(jìn)程間合作而造成進(jìn)程間相互制約。進(jìn)程間的相互制約有兩種不同的方式。

      (1)間接制約。這是由于多個進(jìn)程共享同一資源(如CPU、共享輸入/輸出設(shè)備)而引起的,即共享資源的多個進(jìn)程因系統(tǒng)協(xié)調(diào)使用資源而相互制約。

      (2)直接制約。只是由于進(jìn)程合作中各個進(jìn)程為完成同一任務(wù)而造成的,即并發(fā)進(jìn)程各自的執(zhí)行結(jié)果互為對方的執(zhí)行條件,從而限制各個進(jìn)程的執(zhí)行速度。

      生產(chǎn)者和消費者是經(jīng)典的進(jìn)程同步問題,在這個問題中,生產(chǎn)者不斷的向緩沖區(qū)中寫入數(shù)據(jù),而消費者則從緩沖區(qū)中讀取數(shù)據(jù)。生產(chǎn)者進(jìn)程和消費者對緩沖區(qū)的操作是互斥,即當(dāng)前只能有一個進(jìn)程對這個緩沖區(qū)進(jìn)行操作,生產(chǎn)者進(jìn)入操作緩沖區(qū)之前,先要看緩沖區(qū)是否已滿,如果緩沖區(qū)已滿,則它必須等待消費者進(jìn)程將數(shù)據(jù)取出才能寫入數(shù)據(jù),同樣的,消費者進(jìn)程從緩沖區(qū)讀取數(shù)據(jù)之前,也要判斷緩沖區(qū)是否為空,如果為空,則必須等待生產(chǎn)者進(jìn)程寫入數(shù)據(jù)才能讀取數(shù)據(jù)。

      在本實驗中,進(jìn)程之間要進(jìn)行通信來操作同一緩沖區(qū)。一般來說,進(jìn)程間的通信根據(jù)通信內(nèi)容可以劃分為兩種:即控制信息的傳送與大批量數(shù)據(jù)傳送。有時,也把進(jìn)程間控制在本實驗中,進(jìn)程之間要進(jìn)行通信來操作同一緩沖區(qū)。一般來說,進(jìn)程間的通信根據(jù)通信內(nèi)容可以劃分為兩種:即控制信息的傳送與大批量數(shù)據(jù)傳送。有時,也把進(jìn)程間控制信息的交換稱為低級通信,而把進(jìn)程間大批量數(shù)據(jù)的交換稱為高級通信。

      目前,計算機(jī)系統(tǒng)中用得比較普遍的高級通信機(jī)制可分為3大類:共享存儲器系統(tǒng)、消息傳遞系統(tǒng)及管道通信系統(tǒng)。

      ? 共享存儲器系統(tǒng)

      共享存儲器系統(tǒng)為了傳送大量數(shù)據(jù),在存儲器中劃出一塊共享存儲區(qū),諸進(jìn)程可通過對共享存儲區(qū)進(jìn)行讀數(shù)據(jù)或?qū)憯?shù)據(jù)以實現(xiàn)通信。進(jìn)程在通信之前,向系統(tǒng)申請共享存儲區(qū)中的一個分區(qū),并為它指定一個分區(qū)關(guān)鍵字。信息的交換稱為低級通信,而把進(jìn)程間大批量數(shù)據(jù)的交換稱為高級通信。

      目前,計算機(jī)系統(tǒng)中用得比較普遍的高級通信機(jī)制可分為3大類:共享存儲器系統(tǒng)、消息傳遞系統(tǒng)及管道通信系統(tǒng)。

      ? 消息傳遞系統(tǒng)

      在消息傳遞系統(tǒng)中,進(jìn)程間的數(shù)據(jù)交換以消息為單位,在計算機(jī)網(wǎng)絡(luò)中被稱為報文。消息傳遞系統(tǒng)的實現(xiàn)方式又可以分為以下兩種:(1)直接通信方式

      發(fā)送進(jìn)程可將消息直接發(fā)送給接收進(jìn)程,即將消息掛在接收進(jìn)程的消息緩沖隊列上,而接收進(jìn)程可從自己的消息緩沖隊列中取得消息。(2)間接通信方式

      發(fā)送進(jìn)程將消息發(fā)送到指定的信箱中,而接收進(jìn)程從信箱中取得消息。這種通信方式又稱信箱通信方式,被廣泛地應(yīng)用于計算機(jī)網(wǎng)絡(luò)中。相應(yīng)地,該消息傳遞系統(tǒng)被稱為電子郵件系統(tǒng)。

      ? 管道通信系統(tǒng)

      向管道提供輸入的發(fā)送進(jìn)程,以字符流方式將大量的數(shù)據(jù)送入管道,而接收進(jìn)程從管道中接收數(shù)據(jù)。由于發(fā)送進(jìn)程和接收進(jìn)程是利用管道進(jìn)行通信的,故稱為管道通信。為了協(xié)調(diào)發(fā)送和接收雙方的通信,管道通信機(jī)制必須提供以下3方面的協(xié)調(diào)功能。(1)互斥

      當(dāng)一個進(jìn)程正在對pipe文件進(jìn)行讀或?qū)懖僮鲿r,另一個進(jìn)程必須等待。(2)同步

      當(dāng)寫進(jìn)程把一定數(shù)量的數(shù)據(jù)寫入pipe文件后,便阻塞等待,直到讀進(jìn)程取走數(shù)據(jù)后,再把寫進(jìn)程喚醒。

      (3)確認(rèn)對方是否存在 只有確定對方已存在時,才能進(jìn)行管道通信,否則會造成因?qū)Ψ讲淮嬖诙鵁o限制地等待。在這個問題當(dāng)中,我們采用信號量機(jī)制進(jìn)行進(jìn)程之間的通信,設(shè)置兩個信號量,空的信號量和滿的信號量。在Linux系統(tǒng)中,一個或多個信號量構(gòu)成一個信號量集合。使用信號量機(jī)制可以實現(xiàn)進(jìn)程之間的同步和互斥,允許并發(fā)進(jìn)程一次對一組信號量進(jìn)行相同或不同的操作。每個P、V操作不限于減1或加1,而是可以加減任何整數(shù)。在進(jìn)程終止時,系統(tǒng)可根據(jù)需要自動消除所有被進(jìn)程操作過的信號量的影響

      1.緩沖區(qū)采用循環(huán)隊列表示,利用頭、尾指針來存放、讀取數(shù)據(jù),以及判斷隊列是否為空。緩沖區(qū)中數(shù)組大小為10;

      2.利用隨機(jī)函數(shù)rand()得到A~Z的一個隨機(jī)字符,作為生產(chǎn)者每次生產(chǎn)的數(shù)據(jù),存放到緩沖區(qū)中;

      3.使用shmget()系統(tǒng)調(diào)用實現(xiàn)共享主存段的創(chuàng)建,shmget()返回共享內(nèi)存區(qū)的ID。對于已經(jīng)申請到的共享段,進(jìn)程需把它附加到自己的虛擬空間中才能對其進(jìn)行讀寫。

      4.信號量的建立采用semget()函數(shù),同時建立信號量的數(shù)量。在信號量建立后,調(diào)用semctl()對信號量進(jìn)行初始化,例如本實習(xí)中,可以建立兩個信號量SEM_EMPTY、SEM_FULL,初始化時設(shè)置SEM_EMPTY為10,SEM_FULL為0。使用操 作信號的函數(shù)semop()做排除式操作,使用這個函數(shù)防止對共享內(nèi)存的同時操作。對共享內(nèi)存操作完畢后采用shmctl()函數(shù)撤銷共享內(nèi)存段。

      5.使用循環(huán),創(chuàng)建2個生產(chǎn)者以及2個消費者,采用函數(shù)fork()創(chuàng)建一個新的進(jìn)程。6.一個進(jìn)程的一次操作完成后,采用函數(shù)fflush()刷新緩沖區(qū)。7.程序最后使用semctl()函數(shù)釋放內(nèi)存。模擬程序的程序流程圖如下所示: 1.主程序流程圖:

      2.生產(chǎn)者進(jìn)程流程圖

      3.消費者進(jìn)程流程圖

      4.P操作流程圖

      5.V操作流程圖

      四、實現(xiàn)代碼為:

      // exet5.cpp //#include “stdafx.h” #include #include #define mSIZE 3 #define pSIZE 20 staticintmemery[mSIZE] = {0};staticint process[pSIZE] = {0};//static int process[pSIZE] = {2,3,2,1,5,2,4,5,3,2,5,2};//static int process[pSIZE]

      = {7,10,1,2,10,3,10,4,2,3,10,3,2,1,2,10,1,7,10,1};void build();void LRU();

      int main(intargc, char *argv[]){ printf(“Random sequence is as follows:n”);build();printf(“nInvoking LRU Algorithn: n”);LRU();return 0;}

      void build(){ inti = 0;for(i=0;i

      { process[i] =(int)(10.0*rand()/(RAND_MAX));printf(“%d ”,process[i]);

      } printf(“n”);}

      void LRU(){ int flag[mSIZE] = {0};inti = 0, j = 0;int m =-1, n =-1;int max =-1,maxflag = 0;int count = 0;for(i = 0;i

      //Find the first free Physical Block

      for(j=0;j

      {

      if(memery[j] == 0)

      {

      m = j;break;

      }

      }

      //Find if there are same processes for(j = 0;j

      {

      if(memery[j] == process[i])

      {

      n = j;

      }

      }

      //Find free PB for(j = 0;j

      {

      if(flag[j]>maxflag)

      {

      maxflag = flag[j];max = j;

      }

      }

      if(n ==-1)// Find no same process

      {

      if(m!=-1)// find free PB

      {

      memery[m] = process[i];flag[m] = 0;for(j = 0;j <= m;j++)

      { flag[j]++;

      }

      m =-1;

      }

      else //NO find free PB

      {

      memery[max] = process[i];flag[max] = 0;

      for(j = 0;j

      { flag[j]++;

      } max =-1;maxflag = 0;count++;

      }

      } else // Find same process

      { memery[n] = process[i];flag[n] = 0;if(m!=-1)//find free PB

      { flag[m] = 0;

      } for(j = 0;j

      { flag[j]++;

      } max =-1;maxflag = 0;

      n =-1;

      }

      for(j = 0;j

      {

      printf(“%d ”,memery[j]);

      } printf(“n”);}

      printf(“nThe is: %dn”,count);}

      times

      of

      page

      conversion

      五、在虛擬機(jī)上的具體操作及結(jié)果

      執(zhí)行exe5.c文件

      選擇Applications?Acecessories?Terminal,執(zhí)行文件:

      依次預(yù)處理?編譯?匯編?連接?執(zhí)行用文件,編譯通過之后-o執(zhí)行。報錯??!錯誤顯示為很多頭文件沒有預(yù)定義。連續(xù)查找之后得知原因是鏈接不上pthread庫

      在執(zhí)行命令后面加上-pthread,即新命令格式為:gcc-oexe5exe5.c–lpthread,重新執(zhí)行后的結(jié)果顯示如下截圖:

      其中1表示緩沖區(qū)被生產(chǎn)者producer1或者二producer2寫入了Item,0表示沒有寫入數(shù)據(jù)或者被消費者consumer1或者consumer2消耗掉

      六、實驗總結(jié)及思考

      1、本次實驗是關(guān)于生產(chǎn)者與消費者之間互斥和同步的問題。問題的是指是P、V操作,實驗設(shè)一個共享緩沖區(qū),生產(chǎn)者和消費者互斥的使用,當(dāng)一個線程使用緩沖區(qū)的時候,另一個讓其等待直到前一個線程釋放緩沖區(qū)為止。

      2、實驗中包含的知識點很多,包括臨界區(qū)資源共享問題、信號量定義、PV操作流程、進(jìn)程間的通信方式(消息傳遞和共享內(nèi)存)、進(jìn)程同步和互斥、信號量機(jī)制解決進(jìn)程之間的同步與互斥問題等等。加深了對于本部分內(nèi)容的理解

      通過本實驗設(shè)計,我們對操作系統(tǒng)的P、V進(jìn)一步的認(rèn)識,深入的了解P、V操作的實質(zhì)和其重要性。課本的理論知識進(jìn)一步闡述了現(xiàn)實中的實際問題。

      第四篇:操作系統(tǒng)課程設(shè)計生產(chǎn)者消費者

      湖北民族學(xué)院信息工程學(xué)院11級計算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計

      (操作系統(tǒng)課程設(shè)計)

      生 產(chǎn) 者 和 消 費 湖北民族學(xué)院信息工程學(xué)院11級計算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計

      學(xué)生姓名: 學(xué)生學(xué)號: 班 級: 0311401、02、03、04班制

      二〇一三年十二月

      一、課程題目分析

      這個題目是生產(chǎn)者向消費者提供商品,消費者消耗商品,并且兩組人共用同一緩沖區(qū)。生產(chǎn)者提供了商品之后消費者才能去取商品,消費者若不取走商品則當(dāng)緩沖區(qū)用完之后生產(chǎn)者則不能再向緩沖區(qū)中添加新的商品。

      思考問題:

      (1)對于生產(chǎn)者進(jìn)程:每產(chǎn)生一個數(shù)據(jù),則需去訪問共用緩沖區(qū)是否有已滿,未滿則可以將該數(shù)據(jù)存入并通知消費者進(jìn)程,否則不能。

      (2)對于消費者進(jìn)程:每當(dāng)想去消費(取出數(shù)據(jù))時,則需訪問緩沖區(qū)是否為空,為空則不能消費(取出數(shù)據(jù)),否則可以取,并通知生產(chǎn)者。

      (3)緩沖區(qū)是個臨界資源,所有的進(jìn)程對于該空間都是共享的,所以,還有互斥問題存在。

      二、課程設(shè)計目的

      通過實驗?zāi)M生產(chǎn)者與消費者之間的關(guān)系,了解并掌握他們之間的關(guān)系及原理。由此增加對進(jìn)程同步問題的了解:

      (1)掌握基本的同步互斥算法,理解生產(chǎn)者與消費者模型

      (2)了解windows中多線程(多進(jìn)程)的并發(fā)執(zhí)行機(jī)制,線程(進(jìn)程)間的同步于互斥

      (3)學(xué)習(xí)使用windows中基本的同步對象,掌握相應(yīng)的API。

      三、課程設(shè)計內(nèi)容

      有n個生產(chǎn)者和m個消費者,連接在具有k個單位緩沖區(qū)的有界環(huán)轉(zhuǎn)緩沖上,湖北民族學(xué)院信息工程學(xué)院11級計算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計

      故又稱有界緩沖問題。其中Pi和Cj都是并發(fā)進(jìn)程,只要緩沖區(qū)未滿,生產(chǎn)者進(jìn)程Pi所生產(chǎn)的產(chǎn)品就可投入緩沖區(qū);類似地,只要緩沖區(qū)非空,消費者進(jìn)程Cj就可以從緩沖區(qū)取走并消耗產(chǎn)品。

      四、開發(fā)環(huán)境

      操作系統(tǒng):Windows系統(tǒng) 編寫語言:C++語言

      五、系統(tǒng)分析設(shè)計

      (一)算法原理

      生產(chǎn)者——消費者問題是典型的進(jìn)程同步問題,這些進(jìn)程必須按照一定的生產(chǎn)率和消費率來訪問共享緩沖區(qū),用P、V操作解決生產(chǎn)者和消費者共享單緩沖區(qū)的問題,可設(shè)置兩個信號量empty和full,其初值分別為1和0,empty指示能否向緩沖區(qū)放入產(chǎn)品,full指示能否從緩沖區(qū)取出產(chǎn)品。為了使其協(xié)調(diào)工作,必須使用一個信號量mutex(初值為1),以限制生產(chǎn)者和消費者互斥地對緩沖區(qū)進(jìn)行存取,另用兩個信號量empty1(初值為緩沖區(qū)大小)和full1(初值為0),以保證生產(chǎn)者不向已滿的緩沖區(qū)中放入產(chǎn)品,消費者不從空緩沖區(qū)中取產(chǎn)品。

      (二)功能描述

      生產(chǎn)者功能描述:在同一個進(jìn)程地址空間內(nèi)執(zhí)行兩個線程。生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個空緩沖區(qū)中供消費者線程消費。當(dāng)生產(chǎn)者線程生產(chǎn)物品時,如果沒有空緩沖區(qū)可用,那么生產(chǎn)者線程必須等待消費者線程釋放出一個空緩沖區(qū)。

      消費者功能描述:消費者線程從緩沖區(qū)獲得物品,然后釋放緩沖區(qū),當(dāng)消費者線程消費物品時,如果沒有滿的緩沖區(qū),那么消費者線程將被阻塞,直到新的物品被生產(chǎn)出來。

      (三)算法流程圖

      生產(chǎn)者流程圖: 消費者流程圖:

      湖北民族學(xué)院信息工程學(xué)院11級計算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計

      總的流程圖:

      湖北民族學(xué)院信息工程學(xué)院11級計算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計

      開始Int i=1,n鍵盤輸入數(shù)字,初始化 n SeqSquare *b;b=new SeqSquare(n);鍵盤輸入數(shù)字,改變i的值i==0?Y退出Ncout<<“請輸入正確的菜單項進(jìn)行操作!”<

      (四)數(shù)據(jù)結(jié)構(gòu)及部分函數(shù)描述

      (1)類SeqSquare:對類SeqSquare的聲明及其中一些函數(shù)

      class SeqSquare { public:

      SeqSquare(int n);~SeqSquare();void P(int x);//p操作 void V(int x);//v操作 bool IsEmpty();//判斷是否為空

      湖北民族學(xué)院信息工程學(xué)院11級計算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計

      bool IsFull();//判斷是否已滿 void deca();void decb();int getSize();int getmaxSize();int gettop();int geta();int getb();protected: private:

      };說明:①用動態(tài)整型數(shù)組*elements來代表緩沖區(qū),不管是生產(chǎn)產(chǎn)品還是對已有產(chǎn)品的消費都需要訪問該緩沖區(qū)。②函數(shù)IsFull()用于判斷緩沖區(qū)是否已滿,生產(chǎn)者能否使用緩沖區(qū)。③函數(shù)IsEmpty()用于判斷緩沖區(qū)是否為空,消費者能否使用緩沖區(qū)。

      (2)生產(chǎn)者和消費者操作及顯示函數(shù)showbuf:

      void producer(SeqSquare *a)//生產(chǎn)者操作 { }

      void consumer(SeqSquare *a)//消費者操作 { }

      //緩沖區(qū)顯示

      void showbuf(SeqSquare *a){ }(3)在實現(xiàn)本程序的生產(chǎn)者消費者模型時,具體地通過以下同步對象實現(xiàn)互斥: int *elements;int top,a,b,maxSize;a->P(1);a->V(1);int i=a->getSize();湖北民族學(xué)院信息工程學(xué)院11級計算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計

      ①設(shè)一個互斥量Mutex,以實現(xiàn)生產(chǎn)者在查詢和保留緩沖區(qū)的下一個空位置時進(jìn)行互斥。

      ②每一個生產(chǎn)者用一個信號量與消費者同步,通過設(shè)置Full實現(xiàn),該組信號量用于表示相應(yīng)產(chǎn)品以生產(chǎn)。同時用一個表示空緩沖區(qū)數(shù)目的信號量Empty進(jìn)行類似的同步,指示緩沖區(qū)中是否存在空位置,以便開始生產(chǎn)下一個產(chǎn)品。

      (四)調(diào)試過程

      為解決生產(chǎn)者、消費者問題,應(yīng)該設(shè)置兩個資源信號量,其中一個表示空緩沖區(qū)的數(shù)目,用Full表示,其初值為用戶輸入的緩沖區(qū)的大小,另一個表示緩沖區(qū)中產(chǎn)品的數(shù)目,用Empty表示,其初值為0.另外,由于緩沖區(qū)是一個臨界資源,必須互斥使用,所以還需要再設(shè)置一個互斥信號量Mutex,其初值為1.在生產(chǎn)者、消費者問題中,信號量實現(xiàn)兩種功能。首先,他是生產(chǎn)產(chǎn)品和消費產(chǎn)品的計數(shù)器,計數(shù)器的初值是可使用的資源數(shù)目(緩沖區(qū)的長度)。其次,他是確保產(chǎn)品的生產(chǎn)者和消費者之間的動作同步的同步器。

      生產(chǎn)者要生產(chǎn)一個產(chǎn)品時,首先對資源信號量Full和互斥信號量Mutex進(jìn)行P操作,申請資源。如果可以通過的話,就生產(chǎn)一個產(chǎn)品,并把產(chǎn)品送人緩沖區(qū)。然后對互斥信號量Mutex和資源信號量Empty進(jìn)行V操作,釋放資源。

      消費者要消費一個產(chǎn)品時,首先對資源信號量Empty和互斥信號量Mutex進(jìn)行P操作,申請資源。如果可以通過的話就從緩沖區(qū)取出一個產(chǎn)品并消費掉。然后對互斥信號量Mutex和資源信號量Full進(jìn)行V操作,釋放資源。

      如果緩沖區(qū)中已經(jīng)沒有可用資源,就把申請資源的進(jìn)程添加到等待隊列的隊尾。如果有一個資源被釋放,在等待隊列中的第一個進(jìn)程被喚醒并取得這個資源的使用權(quán)。

      (五)參考資料

      《操作系統(tǒng)教程》 孫鐘秀 高等教育出版社 《C++程序設(shè)計》 譚浩強(qiáng) 高等教育出版社

      六、運行實例及結(jié)果分析

      (一)運行實例

      緩沖區(qū)大小為3,先生產(chǎn)一件產(chǎn)品,顯示緩沖區(qū),再接著生產(chǎn)一件產(chǎn)品,消耗一件產(chǎn)品,顯示緩沖區(qū),在消耗兩件產(chǎn)品,再生產(chǎn)4件產(chǎn)品,改變緩沖區(qū)的大小為6,顯示緩沖區(qū),選擇一個未出現(xiàn)的選項,退出程序。

      (二)結(jié)果顯示

      湖北民族學(xué)院信息工程學(xué)院11級計算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計

      湖北民族學(xué)院信息工程學(xué)院11級計算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計

      (三)結(jié)果分析

      (1)在每個程序中需要先做P,后做V,二者要成對出現(xiàn),夾在二者中間的代碼段就是該進(jìn)程的臨界區(qū)。

      (2)對同步信號量full和empty的P,V操作同樣必須成對出現(xiàn),但它們分別位于不同的程序中。

      (3)無論在生產(chǎn)者進(jìn)程中還是消費者進(jìn)程中,兩個P操作的次序不能顛倒:應(yīng)先執(zhí)行同步信號量的P操作,然后執(zhí)行互斥信號量的P操作。否則可能造成進(jìn)程死鎖。

      七、個人體驗

      雖然我也很想用java語言寫這個程序,但是由于自己學(xué)藝不精,所以只能用C++寫。通過這個實驗我發(fā)現(xiàn)我以前有很多知識都忘記了,重新拿起課本學(xué)習(xí)9 湖北民族學(xué)院信息工程學(xué)院11級計算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計

      時發(fā)現(xiàn)原來很多不懂得問題都有了新的認(rèn)識,有一種豁然開朗的感覺。也為我考研開了一個好的開頭。

      我認(rèn)為我完成的這個設(shè)計做的比較出色的地方是對C++語言中類以及數(shù)組的運用,其實這里我對數(shù)組的操作是按照“先進(jìn)先出”的方法進(jìn)行運作的,這是參考了棧的工作原理,因為緩沖區(qū)一般也是堆棧,比較符合設(shè)計要求。

      這次實驗中我感覺做的很粗糙,自己所想的模擬過程的確得到實現(xiàn)了,但是感覺靈活性不太高,思考還不過全面,應(yīng)該以后多注意一下,多考慮考慮才是。

      在這次實驗中我重新將《C++程序設(shè)計》和《數(shù)據(jù)結(jié)構(gòu)》的幾個重要章節(jié)復(fù)習(xí)了一遍,對類、數(shù)組、C++的I/O流類庫以及堆棧的語句格式、注意細(xì)節(jié)都再一次熟悉,感覺蠻有趣的。不過,在編程過程中許多語句的小問題還真是出現(xiàn)不少,而且感覺自己對C++強(qiáng)大豐富的語句方法用得太呆板,不夠靈活,總是想到那些常用的,而忽略了顆粒讓語句更簡短的方法,以后要多多注意才是。

      八、附錄

      // 生產(chǎn)者消費者1.cpp : Defines the entry point for the console application.//

      #include “stdafx.h” #include “iostream” using namespace std;class SeqSquare { public: SeqSquare(int n);~SeqSquare();void P(int x);

      //p操作

      void V(int x);

      //v操作

      bool IsEmpty();

      //判斷是否為空

      bool IsFull();

      //判斷是否已滿

      void deca();void decb();int getSize();int getmaxSize();int gettop();int geta();int getb();protected: private: int *elements;int top,a,b,maxSize;};10 湖北民族學(xué)院信息工程學(xué)院11級計算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計

      bool SeqSquare::IsEmpty()

      //判斷是否為空 { return(top==-1)?true:false;}

      bool SeqSquare::IsFull()

      //判斷是否已滿 { return(top>=maxSize-1)?true:false;}

      void SeqSquare::deca(){ a--;}

      void SeqSquare::decb(){ b--;}

      int SeqSquare::getSize(){ return top+1;}

      int SeqSquare::getmaxSize(){ return maxSize;}

      int SeqSquare::gettop(){ return top;}

      int SeqSquare::geta(){ return a;}

      int SeqSquare::getb(){ 湖北民族學(xué)院信息工程學(xué)院11級計算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計

      return b;}

      SeqSquare::SeqSquare(int n){ top =-1;a = b =0;maxSize = n;elements = new int[maxSize];}

      void SeqSquare::P(int x){ if(IsFull()==true){

      a=a+1;} else

      {

      elements[++top] = x;

      } }

      void SeqSquare::V(int x){ if(IsEmpty()==true){

      b = b+1;} else

      {

      x = elements[top--];

      } } 湖北民族學(xué)院信息工程學(xué)院11級計算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計

      void producer(SeqSquare *a)

      //生產(chǎn)者操作 { a->P(1);}

      void consumer(SeqSquare *a)

      //消費者操作

      { a->V(1);}

      SeqSquare::~SeqSquare(){ delete elements;}

      //緩沖區(qū)顯示

      void showbuf(SeqSquare *a){ int i=a->getSize();

      }

      int main(){ int i,n;cout<<“請輸入緩沖區(qū)大?。骸?>n;SeqSquare *s;s = new SeqSquare(n);while(i!=4){

      cout<<“請選擇操作:

      ”<

      4.退出系統(tǒng)。

      ”<

      ”<>i;

      switch(i)

      {

      case 1:

      producer(s);

      if(s->geta()==0)

      { 湖北民族學(xué)院信息工程學(xué)院11級計算機(jī)專業(yè)操作系統(tǒng)課程設(shè)計

      cout<

      }

      else

      {

      cout<

      s->deca();

      }

      break;

      case 2:

      consumer(s);

      if(s->getb()==0)

      {

      cout<

      }

      else

      {

      cout<

      }

      break;

      case 3:

      showbuf(s);

      cout<getSize()<<“

      ”<<“可用空間為:”<<(n-s->getSize())<

      break;

      case 4:

      cout<

      break;

      case 5:

      cout<

      cin>>n;

      s = new SeqSquare(n);

      cout<

      break;

      default:

      cout<

      }

      }

      return 0;}

      第五篇:生產(chǎn)者與消費者的問題-----操作系統(tǒng)課程設(shè)計

      閩江學(xué)院 計算機(jī)系 網(wǎng)絡(luò)操作系統(tǒng)課程設(shè)計

      設(shè)計內(nèi)容:進(jìn)程機(jī)制與并發(fā)程序設(shè)計——linux下生產(chǎn)者與消費者的問題實現(xiàn)

      目錄:

      一、設(shè)計內(nèi)容····························3

      二、設(shè)計思想····························4

      三、系統(tǒng)結(jié)構(gòu)····························5

      四、PV操作代碼··························5

      五、C++程序代碼·························6

      六、運行結(jié)果截圖························9

      七、參考文獻(xiàn)····························11

      八、實驗總結(jié)····························11

      一、設(shè)計內(nèi)容

      進(jìn)程機(jī)制與并發(fā)程序設(shè)計————linux下生產(chǎn)者與消費者的問題實現(xiàn) 1.實驗?zāi)康?/p>

      (1)掌握基本的同步互斥算法,理解生產(chǎn)者和消費者同步的問題模型。(2)了解linux中多線程的并發(fā)執(zhí)行機(jī)制,線程間的同步和互斥。

      2、實驗環(huán)境:C/C++語言編譯器

      3、實驗要求

      (1)創(chuàng)建生產(chǎn)者和消費者線程

      在linux環(huán)境下,創(chuàng)建一個控制臺進(jìn)程,在此進(jìn)程中創(chuàng)建n個線程來模擬生產(chǎn)者或者消費者。這些線程的信息由本程序定義的“測試用例文件”中予以指定。

      該文件的格式和含義如下: 3 1 P 3 2 P 4 3 C 4 1 4 P 2 5 C 3 1 2 4 第一行說明程序中設(shè)置幾個臨界區(qū),其余每行分別描述了一個生產(chǎn)者或者消費者線程的信息。每一行的各字段間用Tab鍵隔開。不管是消費者還是生產(chǎn)者,都有一個對應(yīng)的線程號,即每一行開始字段那個整數(shù)。第二個字段用字母P或者C區(qū)分是生產(chǎn)者還是消費者。第三個字段表示在進(jìn)入相應(yīng)線程后,在進(jìn)行生產(chǎn)和消費動作前的休眠時間,以秒計時;這樣做的目的是可以通過調(diào)整這一列參數(shù),控制開始進(jìn)行生產(chǎn)和消費動作的時間。如果是代表生產(chǎn)者,則該行只有三個字段。如果代表消費者,則該行后邊還有若干字段,代表要求消費的產(chǎn)品所對應(yīng)的生產(chǎn)者的線程號。所以務(wù)必確認(rèn)這些對應(yīng)的線程號存在并且該線程代表一個生產(chǎn)者。(2)生產(chǎn)和消費的規(guī)則

      在按照上述要求創(chuàng)建線程進(jìn)行相應(yīng)的讀寫操作時,還需要符合以下要求:

      ①共享緩沖區(qū)存在空閑空間時,生產(chǎn)者即可使用共享緩沖區(qū)。

      ②從上邊的測試數(shù)據(jù)文件例子可以看出,某一生產(chǎn)者生產(chǎn)一個產(chǎn)品后,可能不止一個消費者,或者一個消費者多次地請求消費該產(chǎn)品。此時,只有當(dāng)所有的消費需求都被滿足以后,該產(chǎn)品所在的共享緩沖區(qū)才可以被釋放,并作為空閑空間允許新的生產(chǎn)者使用。

      ③每個消費者線程的各個消費需求之間存在先后順序。例上述測試用例文件包含一行信息“5 C 3 l 2 4”,可知這代表一個消費者線程,該線程請求消費1,2,4號生產(chǎn)者線程生產(chǎn)的產(chǎn)品。而這種消費是有嚴(yán)格順序的,消費1號線程產(chǎn)品的請求得到滿足后才能繼續(xù)往下請求2號生產(chǎn)者線程的產(chǎn)品。

      ④要求在每個線程發(fā)出讀寫操作申請、開始讀寫操作和結(jié)束讀寫操作時分別顯示提示信息。(3)相關(guān)基礎(chǔ)知識

      本實驗所使用的生產(chǎn)者和消費者模型具有如下特點:

      本實驗的多個緩沖區(qū)不是環(huán)形循環(huán)的,也不要求按順序訪問。生產(chǎn)者可以把產(chǎn)品放到目前某一個空緩沖區(qū)中。

      消費者只消費指定生產(chǎn)者的產(chǎn)品。

      在測試用例文件中指定了所有的生產(chǎn)和消費的需求,只有當(dāng)共享緩沖區(qū)的數(shù)據(jù)滿足了所有關(guān)于它的消費需求后,此共享緩沖區(qū)才可以作為空閑空間允許新的生產(chǎn)者使用。

      本實驗在為生產(chǎn)者分配緩沖區(qū)時各生產(chǎn)者間必須互斥,此后各個生產(chǎn)者的具體生產(chǎn)活動可以并發(fā)。而消費者之間只有在對同一產(chǎn)品進(jìn)行消費時才需要互斥,同時它們在消費過程結(jié)束時需要判斷該消費對象是否已經(jīng)消費完畢并清除該產(chǎn)品。

      linux用來實現(xiàn)同步和互斥的實體。在linux中,常見的同步對象有:信號量(Semaphore)、互斥量(Mutex)、臨界段(CriticalSection)等。使用這些對象都分為三個步驟,一是創(chuàng)建或者初始化:接著請求該同步對象,隨即進(jìn)入臨界區(qū),這一步對應(yīng)于互斥量的上鎖;最后釋放該同步對象,這對應(yīng)于互斥量的解鎖。這些同步對象在一個線程中創(chuàng)建,在其他線程中都可以使用,從而實現(xiàn)同步互斥。

      二、設(shè)計思想

      生產(chǎn)者進(jìn)程與消費者進(jìn)程是經(jīng)典的同步互斥關(guān)系。系統(tǒng)創(chuàng)建兩類進(jìn)程:proceducer()和consumer(),分別用來描述生產(chǎn)者和消費者的行為。生產(chǎn)者與消費者問題是指若干進(jìn)程通過循環(huán)緩沖池區(qū)交換數(shù)據(jù)。如下圖所示,生產(chǎn)者進(jìn)程不斷向循環(huán)緩沖池區(qū)中寫入數(shù)據(jù)(即生產(chǎn)數(shù)據(jù)),而消費者進(jìn)程不斷從循環(huán)緩沖池區(qū)中讀出數(shù)據(jù)(即消費數(shù)據(jù))。循環(huán)緩沖池共有N個緩沖區(qū),緩沖區(qū)可以暫存一個產(chǎn)品,任何時刻只能有一個進(jìn)程課對循環(huán)緩沖池進(jìn)行操作。所有生產(chǎn)者和消費者要協(xié)調(diào)工作,以完成數(shù)據(jù)的交換。只要有空緩沖區(qū),生產(chǎn)者就可以把產(chǎn)品送入緩沖區(qū);只要有滿緩沖區(qū),消費者就可以從緩沖區(qū)中取走物品。

      為了解決生產(chǎn)者和消費者問題,應(yīng)該設(shè)置信號量和變量如下: full: 滿緩沖區(qū)資源信號量,初值為0; empty:空緩沖區(qū)資源信號量,初值為n; in: 生產(chǎn)者指針,初值均為0; out: 消費者指針,均為0;

      mutex:緩沖區(qū)操作的互斥信號量,初值為1

      三、系統(tǒng)結(jié)構(gòu)

      PCB* readyhead=NULL, * readytail=NULL;// 就緒隊列——鏈表結(jié)構(gòu) PCB* consumerhead=NULL, * consumertail=NULL;// 消費者隊列 PCB* producerhead=NULL, * producertail=NULL;// 生產(chǎn)者隊列 processproc()---給PCB分配內(nèi)存,產(chǎn)生相應(yīng)的的進(jìn)程 Pempty()---如果緩沖區(qū)滿,該進(jìn)程進(jìn)入生產(chǎn)者等待隊列;

      linkqueue(exe,&producertail);// 把就緒隊列里的進(jìn)程放入生產(chǎn)者隊列的尾部 執(zhí)行順序:Main()---empty---in---full---out---finish 當(dāng)緩沖池為空時,生產(chǎn)者生產(chǎn)產(chǎn)品in緩沖池 in=in+1 當(dāng)緩沖池為滿時,消費者消費產(chǎn)品out緩沖池 out=out+1

      四、PV操作代碼

      semaphore empty=n;semaphore full=0;semaphore mutex=1;message buffer[n];int in=0;

      int out=0;void main(){ parbegin(proceducer(),consumer());}

      void proceducer(){ do { prodece a new meddage;P(empty);P(mutex);send a new message to buffer[in];in=(in+1)%n;V(mutex);V(full);} while(true);} void consumer(){ do { P(full);P(mutex);get a message from buffer[out];out=(out+1)%n;V(mutex);V(empty);comsume a message;}while(true);}

      五、C++程序代碼

      #include “windows.h” #include “iostream.h” #include “math.h”

      #define random(rand()*10000)/RAND_MAX //定義一個隨機(jī)函數(shù)來生產(chǎn)產(chǎn)品,并且使兩個顧產(chǎn)品間的時間少于10秒

      int long waiting(0);//正在等待的產(chǎn)品的數(shù)目

      int buffer;//空位的總數(shù)目

      char empty;//緩沖區(qū)空

      char full;//緩沖區(qū)滿

      int count(0);//產(chǎn)品的號碼數(shù)

      int finish(0);//生產(chǎn)完畢的產(chǎn)品數(shù)目 DWORD a;void proceduce()

      {

      Sleep(10000);cout<<“緩沖區(qū)已空!”<

      }

      void getconsum(){

      Sleep(10001);//產(chǎn)品被生產(chǎn)的函數(shù),為了合理區(qū)分生產(chǎn)產(chǎn)品 cout<<“第”<

      HANDLE Mutex=CreateMutex(NULL, FALSE, “Mutex”);//用來實現(xiàn)進(jìn)程的互斥

      HANDLE proceducer=CreateSemaphore(NULL, 1,1, “proceducer”);//定義信號量來進(jìn)行線程間的同步

      HANDLE consumer=CreateSemaphore(NULL,0,3,“consum”);DWORD WINAPI consum(LPVOID pParm2)//消費的線程 {

      WaitForSingleObject(Mutex ,INFINITE);//p(mutex)來進(jìn)行互斥操作 count++;//生產(chǎn)的是第幾個產(chǎn)品

      cout<<“第 ”<

      {

      if(waiting!=0){

      cout<<“此時有”<

      else

      cout<<“沒有產(chǎn)品在等待”<

      ReleaseMutex(Mutex);//釋放互斥量,以便其他線程使用 WaitForSingleObject(proceducer,INFINITE);//等待生產(chǎn) getconsum();//消費并取走

      }

      else

      {

      cout<<“緩沖區(qū)已滿,第”<

      return 0;}

      DWORD WINAPI proceducers(LPVOID pParm1)//生產(chǎn)者的線程 {

      while(true)//一直執(zhí)行

      {

      WaitForSingleObject(consum,INFINITE);//p(customers),等待產(chǎn)品 WaitForSingleObject(Mutex,INFINITE);//等待互斥量 waiting--;//等待的產(chǎn)品數(shù)減一

      ReleaseSemaphore(proceducer,1,NULL);//釋放信號量 ResumeThread(proceducer);//喚醒消費進(jìn)程 ReleaseMutex(Mutex);//v(mutex);proceduce();//生產(chǎn)

      finish++;//消費的產(chǎn)品數(shù)加1 }

      return 0;}

      int main(int argc, char* argv[]){

      cout<<“請輸入緩沖區(qū)空位的總數(shù)目:”;cin>>buffer;cout<<“緩沖區(qū)共有”<>empty;while(empty!='y'){

      cout<>empty;}

      HANDLE hThread1;HANDLE hThread2;hThread2=::CreateThread(NULL,0,proceducers,NULL,0,NULL);//產(chǎn)生一個生產(chǎn)者進(jìn)程

      while(full!='y'){

      Sleep(random);//產(chǎn)品隨機(jī)進(jìn)入

      hThread1=::CreateThread(NULL,0,consum,NULL,a,NULL);cout<=10&&waiting==0)//如果完成數(shù)超過10并且沒有人等待

      {

      cout<<“已經(jīng)為”<>full;return full;}

      else;}

      if(full=='y'){

      cout<<“********對不起,緩沖區(qū)已滿********”<

      }

      六、運行結(jié)果截圖

      緩沖區(qū)空位總數(shù)目為1時運行結(jié)果截圖:

      緩沖區(qū)空位總數(shù)目為0和3時運行結(jié)果截圖(其余部分如上當(dāng)緩沖區(qū)空位總數(shù)目為1時的截圖)

      七、參考文獻(xiàn)

      1、計算機(jī)網(wǎng)絡(luò)操作系統(tǒng)原理與應(yīng)用 孔憲軍 呂濱(本學(xué)期教科書)

      2、網(wǎng)絡(luò)操作系統(tǒng)課程設(shè)計計劃書 陳衛(wèi)老師

      3、C程序設(shè)計(第三版)譚浩強(qiáng)

      八、實驗總結(jié)

      剛剛看到課程設(shè)計的內(nèi)容與要求時,不禁有點無從下手的感覺。經(jīng)過一番思考后,才決定選擇設(shè)計“進(jìn)程機(jī)制與并發(fā)程序設(shè)計——linux下生產(chǎn)者與消費者的問題實現(xiàn)”這部分。設(shè)計這部分不僅僅需要用到C/C++編程,還需要編寫相關(guān)的PV原語。由于自己的PV原語部分和C/C++編程學(xué)的不是很好,因此對我來說有點難。于是我就積極利用書本上的知識來編寫PV原語,C/C++編程是參考書上的指點以及網(wǎng)絡(luò)資源編寫出來的。不懂得地方查資料、上網(wǎng)找、問問其他同學(xué),最后終于慢慢的把課程設(shè)計做出來了。通過這次課程設(shè)計,才感覺到自己還是平時動手少,要經(jīng)常動手去做實驗才能真正學(xué)到東西。尤其是一些C/C++編程和PV原語的編寫更需要平時多加練習(xí)才能學(xué)好用好。特別是C/C++編程在遇到語法有多處錯誤時,不能急,要冷靜下來慢慢修改,知道程序正確。雖然是自己獨立做的課程設(shè)計,但是其中還是有很多不懂的東西是問同學(xué)的,因此了解到學(xué)習(xí)不是單獨的,應(yīng)該是相互交流相互學(xué)習(xí)的。

      下載實驗4生產(chǎn)者消費者問題報告word格式文檔
      下載實驗4生產(chǎn)者消費者問題報告.doc
      將本文檔下載到自己電腦,方便修改和收藏,請勿使用迅雷等下載。
      點此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報,并提供相關(guān)證據(jù),工作人員會在5個工作日內(nèi)聯(lián)系你,一經(jīng)查實,本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        消費者行為學(xué)實驗總結(jié)心得

        消費者行為學(xué)實驗總結(jié) 消費者行為學(xué),不僅學(xué)在課堂,更學(xué)在課外,學(xué)到的的不僅是書本上的知識,更是培養(yǎng)了我的實踐能力。書本上的知識:消費行為,消費心理,購買動機(jī)……就只聽老師在課......

        消費者調(diào)研報告

        消費者行為作為一個過程,通常經(jīng)歷六個階段:形成消費需要當(dāng)人們因意識到自己缺乏某種東西而產(chǎn)生心理緊張時,一定的需要便形成了。不同階段對窗簾軌道有不同的需求:1.單身人士,多為......

        2015中國消費者報告

        2015中國消費者報告-新常態(tài)下贏得中國消費者 中國消費者 IFB進(jìn)口食品專區(qū)-全國糖酒會 · 2015-07-02 09:21 資料來源:凱度消費者指數(shù),版權(quán)歸于原作者 貝恩公司已經(jīng)連續(xù)第四年......

        消費者行為學(xué)部分問題答案

        消費者行為學(xué) P5《日本動漫為何吸引青少年》 1、從需要的角度談?wù)劊毡緞勇槭裁次嗌倌辏?消費者需要是指消費者生理和心理上的匱乏狀態(tài),即感到缺少些什么,從而想獲得他們......

        地質(zhì)隊安全生產(chǎn)者述廉述職報告[推薦五篇]

        地質(zhì)隊安全生產(chǎn)管理者 述廉述職報告 按照地質(zhì)隊班子成員的分工,本人負(fù)責(zé)安全生產(chǎn)工作。一年來,我積極參加地方政府和上級部門組織的各類會議和培訓(xùn),學(xué)習(xí)國家相關(guān)政策法規(guī),認(rèn)真領(lǐng)......

        手機(jī)消費者市場調(diào)研報告

        手機(jī)消費者市場調(diào)研報告一.調(diào)研目的: 1.了解手機(jī)在目前市場現(xiàn)狀與潛力分析,了解手機(jī)銷售市場的容量(潛在消費者的接受度和挖掘市場的空白份額). 2.人們對手機(jī)品牌的忠誠度如何 3......

        山東大學(xué)操作系統(tǒng)實驗五理發(fā)師問題報告

        計算機(jī)科學(xué)與技術(shù)學(xué)院操作系統(tǒng)實驗報告 實驗題目:理發(fā)店問題 理發(fā)店問題:假設(shè)理發(fā)店的理發(fā)室中有3個理發(fā)椅子和3個理發(fā)師,有一個可容納4個顧客坐等理發(fā)的沙發(fā)。此外還有一間等......

        加強(qiáng)金融消費者權(quán)益保護(hù)問題研究

        加強(qiáng)金融消費者權(quán)益保護(hù)問題研究 來源:中國論文下載中心 作者:未知請聯(lián)系更改編輯:studa1211 【關(guān)鍵詞】問題,研究,保護(hù),消費者權(quán)益,金融,加強(qiáng), 后危機(jī)時代,加強(qiáng)金融消費者權(quán)......