目? 錄
第1章 題目分析. 1
1.1 生產者線程... 1
1.2 消費者線程... 1
1.3 緩沖區... 1
1.4 進程的同步與互斥... 1
第2章 解決方案. 2
2.1 總體方案... 2
2.2 生產者問題... 2
2.3 消費者問題... 3
2.4 進程問題... 5
第3章 實驗結果. 6
3.1 運行結果... 6
3.2 結果分析... 8
第4章 實驗總結. 8
參考文獻. 9
???????????????????????????????????????????????????????? ??????????????????????
第1章 題目分析
在我的題目中,要求創建4個工廠同時生產一種商品,并由1個銷售商進行銷售。這是一個典型的生產者-消費者問題。經過查閱資料,我對這個問題有了一個初步的認識和分析。在uC/OS-II實時操作系統中,生產者-消費者問題是指多個任務之間共享一個有限緩沖區的情況下的同步與通信問題。生產者任務負責向緩沖區中放入數據,而消費者任務則負責從緩沖區中取出數據。這需要確保生產者和消費者之間的協調,避免生產者在緩沖區已滿時繼續生產,或者消費者在緩沖區為空時繼續消費的問題。通過信號量來實現生產者與消費者之間的有效通信和同步。
1.1 生產者線程
??? 生產者線程是在生產者消費者問題中負責向共享緩沖區中放入數據的線程。其主要任務是生成數據,并將數據放入緩沖區中。生產者線程需要注意緩沖區的狀態,當緩沖區已滿時需要等待,直到有空間可以放入新的數據。為了實現線程間的同步與通信,生產者線程可以使用信號量同步機制來控制對共享資源的訪問。
1.2 消費者線程
??? 消費者線程與生產者線程類似,是在生產者消費者問題中負責從共享緩沖區中取出數據的線程。主要作用是消耗數據,并將緩沖區中的數據取出,釋放空間。消費者線程需要注意緩沖區的狀態,當緩沖區為空時需要等待,直到有數據可供消費。與生產者線程相同,可以使用信號量同步。
1.3 緩沖區
??? 緩沖區相當于倉庫,是在生產者消費者問題中用于存儲數據的區域。用來在生產者和消費者之間傳遞數據。生產者負責向緩沖池中寫入數據,而消費者則從中讀取數據進行處理。緩沖區位置的空和缺會影響生產者和消費者線程的行為。
1.4 進程的同步與互斥
??? 為了使進程之間正確協調和共享資源,就需要進程的同步與互斥,進程的同步能夠確保進程按照特定順序執行,互斥則是確保在任何時刻只有一個進程可以訪問共享資源,通過同步機制和互斥鎖或信號量,確保進程間的安全交互和數據一致性。
在編寫程序時,我創建了兩個信號量,分別是mutex、empty、full、proCmutex。mutex用來控制對共享緩沖區的訪問,初始值為1,此時表示共享資源可訪問。也就是可以生產和銷售產品。empty用來表示空閑的緩沖區空位的數量,初始值為緩沖區的大小,在我的實驗中,這個值等于100。full用來表示已被生產者填充的緩沖區空位的數量,初始值為0,表示初始時沒有產品可已消費。proCmutex用來控制生產者計數的訪問,初始值為1,此時表示初始時生產者計數可以進行訪問。
第2章 解決方案
2.1 總體方案
??? 為了完成從生產到銷售這一完整的產業鏈,需要完成并協調生產工廠、倉庫、銷售商三個主要部分的工作,實驗的總體思路非常明確。首先是4個生產商同時進行商品的生產,然后把生產的東西放入庫存,最后由1個銷售商進行銷售即可。

圖2-1 總體系統方案
2.2 生產者問題
??? 根據生產問題的邏輯關系,繪制圖2-2的流程圖。首先是生產系統的初始化,這里把商品的初始數量設置為0,然后開始生產商品,4個工廠一次同時生產1個商品,并將生產的商品放入緩沖區中,庫存的最大數量是100,當生產的商品的數量大于100時,立即停止生產,并等待商品的銷售;然后更新庫存,再次判斷庫存的數量是否在合理范圍內。
- void*?producer(void*?a)?{??
- ????while?(true)?{??
- ????????while?(proCmutex?<=?0);??
- ????????proCmutex--;??
- ????????proCount++;??
- ????????gc++;??
- ????????printf("[%d號]?工廠生產一個傻妞\n",gc);??
- ????????if?(gc?>=?4)?{?gc?=?0;?}??
- ????????full++;??
- ????????printf("當前庫存數量:%d\n",?full);??
- ????????proCmutex++;??
- ????????while?(empty?<=?0)?{??
- ????????????printf("庫存已滿!\n");??
- ????????????Sleep(2000);??}??
- ????????empty--;??
- ????????while?(mutex?<=?0);??
- ????????mutex--;??
- ????????buffer[in]?=?proCount;??
- ????????in?=?(in?+?1)?%?N;??
- ????????mutex++;??
- ????????Sleep(sleepTime);??
- ????}??}??
圖2-2 生產者程序流程圖
2.3 消費者問題
??? 消費系統和生產系統有相似之處,如圖2-3所示,首先系統進入初始化,完成這一步后需要立即判斷庫存的數量,因為當未生產商品時是不能進行商品銷售的。如果判斷目前庫存數量為空,則立即停止銷售,等待生產系統生產商品,并更新庫存,進入下一個循環;反之,如果判斷目前庫存數量不為空,則開始進行銷售,并進入下一個條件判斷。
- void*?consumer(void*?b)?{??
- ????while?(true)?{??
- ????????while?(full?<=?0)?{??
- ????????????printf("庫存為空!\n");??
- ????????}??
- ????????full--;??
- ????????while?(mutex?<=?0);??
- ????????mutex--;??
- ????????int?nextc?=?buffer[out];??
- ????????buffer[out]?=?0;?//消費完將緩沖區設置為0??
- ????????out?=?(out?+?1)?%?N;??
- ????????mutex++;??
- ????????empty++;??
- ????????consCount++;??
- ????????printf("\t\t\t\t陸小千 銷售一個傻妞\n");??
- ????????printf("\t\t\t\t已銷售產品數量:%d\n",?consCount);??
- ????????Sleep(sleepTime);??
- ????}??
- }??
圖2-3 消費者程序流程圖
2.4 進程問題
??? 如圖2-4的程序流程圖,在編寫程序時,首先需要定義一些信號量,用來控制對共享資源緩沖區的使用權限,前面已經介紹,我定義了mutex、empty、full、proCmutex? 4個信號量。初始化變量之后,開始創建生產者進程和消費者進程;生產者生產的產品存放到緩沖區,發送信號量通知消費,此時消費者收到信號量開始銷售產品。銷售完一個產品,就釋放掉一個緩沖區的空間位置。
圖2-4 進程流程圖
第3章 實驗結果
3.1 運行結果
??? 如圖3-1、3-2所示,按照實驗要求,在系統運行之前,打印出了我的個人信息,接著顯示了生產的產品數量和當前的庫存數量。按照實驗要求,有4個工廠同時生產,有1個銷售商進行銷售,實驗完成情況符合實驗要求。

圖3-1 運行初期界面

圖3-2 運行中期界面
如圖3-3、3-4所示,我設置的最大庫存數量為100,當庫存數量達到最大值時,打印:庫存已滿!并且停止生產,此時可以正常銷售,當銷售掉一個產品,此時庫存數量小于100,這時又開始生產。并且實時打印了已銷售的產品的數量。

圖3-3 運行后期界面

圖3-4 運行后期界面
3.2 結果分析
??? 結合題目要求和實驗的運行結果可以看出,實驗結果達到了實驗要求。在我的實驗中程序中,創建了兩個任務,并定義了信號量來控制兩個任務之間的進程問題,加上生產-消費的邏輯關系,經過大量的測試修改代碼,最終較好的完成了實驗。
第4章 實驗總結
在本次實驗中,我查閱基于μC/OS-II操作系統的生產者與消費者問題的大量資料。認識到μC/OS-II作為一款開源的嵌入式實時操作系統,為并發編程提供了強大的支持。生產者與消費者問題作為一個經典的并發問題,其核心在于多個任務(生產者、消費者)如何安全、高效地共享有限資源(緩沖區)。
我首先定義了生產者和消費者兩個任務,并分配了相應的優先級和棧空間。生產者任務負責模擬數據的生成并放入緩沖區,而消費者任務則負責從緩沖區中取出數據進行處理。在任務實現過程中,我也考慮了數據的一致性和同步性,確保生產者和消費者之間的協調運作。
為了實現生產者與消費者之間的同步和互斥,我采用了μC/OS-II的信號量機制。通過創建信號量并對其進行合理的操作(如P操作和V操作),我成功地實現了對緩沖區的訪問控制,避免了數據競爭和混亂。
在完成基本功能后,我進行了大量的測試工作。通過模擬不同的生產速度和消費速度,我驗證了系統的穩定性和可靠性。同時,我還對代碼進行了優化,提高了系統的運行效率和響應速度。
本次實驗讓我深刻體會到了μC/OS-II操作系統在并發編程中的強大功能和靈活性。通過實際編程操作,我不僅掌握了生產者與消費者問題的解決方案,還深入理解了任務同步與通信機制的重要性。同時,我也認識到了在編寫并發程序時需要注意的問題,如數據一致性和同步性等。此外,本次實驗還鍛煉了我的編程能力和解決問題的能力,提高了我的實踐能力和綜合素質。
在未來的學習和工作中,我將繼續深入學習μC/OS-II操作系統和其他實時操作系統的知識,并將其應用于更復雜的并發編程問題中,以提升自己的編程水平和解決問題的能力。同時,非常感謝顧老師的本學期的辛勤付出以及對我的教導。
?