基于ucos-ii操作系統的生產者消費者-問題

目? 錄

第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時,立即停止生產,并等待商品的銷售;然后更新庫存,再次判斷庫存的數量是否在合理范圍內。

  1. void*?producer(void*?a)?{??
  2. ????while?(true)?{??
  3. ????????while?(proCmutex?<=?0);??
  4. ????????proCmutex--;??
  5. ????????proCount++;??
  6. ????????gc++;??
  7. ????????printf("[%d]?工廠生產一個傻妞\n",gc);??
  8. ????????if?(gc?>=?4)?{?gc?=?0;?}??
  9. ????????full++;??
  10. ????????printf("當前庫存數量:%d\n",?full);??
  11. ????????proCmutex++;??
  12. ????????while?(empty?<=?0)?{??
  13. ????????????printf("庫存已滿!\n");??
  14. ????????????Sleep(2000);??}??
  15. ????????empty--;??
  16. ????????while?(mutex?<=?0);??
  17. ????????mutex--;??
  18. ????????buffer[in]?=?proCount;??
  19. ????????in?=?(in?+?1)?%?N;??
  20. ????????mutex++;??
  21. ????????Sleep(sleepTime);??
  22. ????}??}??

圖2-2 生產者程序流程圖

2.3 消費者問題

??? 消費系統和生產系統有相似之處,如圖2-3所示,首先系統進入初始化,完成這一步后需要立即判斷庫存的數量,因為當未生產商品時是不能進行商品銷售的。如果判斷目前庫存數量為空,則立即停止銷售,等待生產系統生產商品,并更新庫存,進入下一個循環;反之,如果判斷目前庫存數量不為空,則開始進行銷售,并進入下一個條件判斷。

  1. void*?consumer(void*?b)?{??
  2. ????while?(true)?{??
  3. ????????while?(full?<=?0)?{??
  4. ????????????printf("庫存為空!\n");??
  5. ????????}??
  6. ????????full--;??
  7. ????????while?(mutex?<=?0);??
  8. ????????mutex--;??
  9. ????????int?nextc?=?buffer[out];??
  10. ????????buffer[out]?=?0;?//消費完將緩沖區設置為0??
  11. ????????out?=?(out?+?1)?%?N;??
  12. ????????mutex++;??
  13. ????????empty++;??
  14. ????????consCount++;??
  15. ????????printf("\t\t\t\t陸小千 銷售一個傻妞\n");??
  16. ????????printf("\t\t\t\t已銷售產品數量:%d\n",?consCount);??
  17. ????????Sleep(sleepTime);??
  18. ????}??
  19. }??


圖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操作系統和其他實時操作系統的知識,并將其應用于更復雜的并發編程問題中,以提升自己的編程水平和解決問題的能力。同時,非常感謝顧老師的本學期的辛勤付出以及對我的教導。

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15106.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15106.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15106.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

提取 Chrome、Firefox 中儲存的用戶密碼用于憑據發現

操作環境 Chrome 瀏覽器 Version 125.0.6422.112 (Official Build) (64-bit)Firefox 瀏覽器 Version 126.0 (64 位) Chrome 瀏覽器儲存密鑰原理 新的 Chrome 瀏覽器儲存密碼的方案是使用 Chrome 生成的 AES 密鑰對用戶密碼進行加密之后儲存在 Sqlite 數據庫文件中&#xff0c;A…

Qt資源系統用法筆記 qrc

目錄 創建和使用.qrc文件的步驟&#xff1a; 步驟1: 創建.qrc文件 步驟2: 編輯.qrc文件 步驟3: 在代碼中使用資源 步驟4: 編譯和運行 優點和注意事項 c調用&#xff1a; Qt資源系統&#xff08;Qt Resource System&#xff09;提供了一種將應用程序所需的文件&#xff0…

Linux 內核之 mmap 內存映射的原理及源碼解析

文章目錄 前言一、簡介1. mmap 是什么&#xff1f;2. Linux 進程虛擬內存空間 二、mmap 內存映射1. mmap 內存映射的實現過程2. mmap 內存映射流程2.1 mmap 系統調用函數2.2 ksys_mmap_pgoff 函數2.3 vm_mmap_pgoff 函數2.4 do_mmap_pgoff 函數2.5 do_mmap 函數2.6 get_unmappe…

私域流量的真諦:構建并運營屬于你自己的私域生態

大家好&#xff0c;我是來自一家專注于私域電商行業的軟件開發公司的產品經理&#xff0c;擁有超過七年的行業經驗。今天&#xff0c;我想和大家聊聊私域流量的真正含義&#xff0c;以及為何我們應該關注并努力打造屬于自己的私域生態。 什么是私域流量&#xff1f; 私域流量&…

HCIA第二天復習上

延長傳輸距離-------中繼器&#xff08;放大器&#xff09;------物理層設備 可以延長5倍傳輸距離 增加網絡節點數量 網絡拓撲結構 1直線型拓撲 信息安全性差 網絡延遲高傳輸速度慢 2環形拓撲 3星型拓撲 4網狀型拓撲 傳輸效率高&#xff0c;…

【字典樹 馬拉車算法】336. 回文對

本文涉及知識點 字典樹 馬拉車算法 336. 回文對 給定一個由唯一字符串構成的 0 索引 數組 words 。 回文對 是一對整數 (i, j) &#xff0c;滿足以下條件&#xff1a; 0 < i, j < words.length&#xff0c;i ! j &#xff0c;并且words[i] words[j]&#xff08;兩個字…

通過注意力調節實現更好的文本到圖像生成對齊

近年來&#xff0c;生成性AI技術在眾多領域取得了前所未有的進步。大規模預訓練模型的出現激發了各種下游任務中的新應用。這在文本到圖像生成領域尤為明顯&#xff0c;例如Stable Diffusion、DALL-E 2和Imagen等模型已經顯著展示了它們的能力。盡管如此&#xff0c;復雜提示中…

appium篇-windows桌面自動化(一)[環境配置]

1、windows版本&#xff1a;win10 2、winSdk版本 Windows SDK and emulator archive | Microsoft Developer 3、winAppDriver版本 1.2.99 Releases microsoft/WinAppDriver (github.com) ################ 4、python版本 Python 3.9.13 ############### 5、appium版本 Re…

hubilder Android模擬器華為手機連接不上

APP真機測試注意點&#xff1a; 1. 同一個局域網下 2. 手機連接USB模式&#xff08;華為選擇USB配置&#xff1a;音頻來源&#xff09; &#xff0c;開發者模式 3. 實在不行重啟HBuilderX再運行真機 可是卡在了“正在安裝手機端HBuilder調試基座...” 就沒反應了&#xff1f;&…

【高時效通路】

一 高時效通路 1.1 pathchdumper 實時數據拉取、實時數據處理、5分鐘微批dump來加速時效性&#xff0c;具體來說&#xff1a; 實時數據拉取&#xff08;Fetcher&#xff09;&#xff1a;基于Databus Fetcher基建&#xff0c;直接對接F0層實時拉取最新數據&#xff0c;保證該…

Springboot整合Minio對象存儲超級詳細講解以及配置搭建

windows環境下搭建minio步驟 1.從minio官網進行查看詳細信息 地址&#xff1a;https://min.io/里面有詳細的配置信息搭建成功之后如下如所示&#xff1a;用戶名密碼默認情況下為 username&#xff1a;minioadmin password&#xff1a;minioadmin2.搭建成功之后的訪問 地址&…

python - 分割 pytest 的 conftest.py 文件

解決 pytest 的 conftest.py 文件過大問題。 1. 項目目錄結構 project_name ├── LICENSE ├── MANIFEST.in ├── Makefile ├── README.md ├── project_name │ ├── __init__.py │ ├── testing │ │ ├── __init__.py │ │ ├── fixtur…

vue項目實戰 - 如果高效的實現防抖和節流

在Vue項目中&#xff0c;處理高頻事件的優化至關重要&#xff0c;直接影響用戶體驗和應用性能。防抖&#xff08;Debounce&#xff09;和節流&#xff08;Throttle&#xff09;是兩種常用且有效的方法&#xff0c;可以控制事件觸發頻率&#xff0c;減少不必要的資源消耗。如何在…

SEO優化,小白程序員如何做SEO優化流量從0到1

原文鏈接&#xff1a;SEO優化&#xff0c;小白程序員如何做SEO優化流量從0到1 1、SEO是什么&#xff1f; SEO即&#xff1a;搜索引擎優化(Search Engine Optimization)&#xff0c;是一種通過優化網站結構、內容和外部鏈接等因素&#xff0c;提高網站在搜索引擎中的自然排名&…

python愛心樹表白代碼

以下是一個使用Python的turtle模塊來繪制一顆愛心并表白的簡單示例代碼&#xff1a; import turtle import math # 設置屏幕 screen turtle.Screen() screen.bgcolor("black") # 繪制愛心 def draw_heart(t, size): t.speed(9) t.penup() t.goto(0, -size…

Python Minio 工具類封裝

最近因為需要對大規模的文件進行存儲&#xff0c;選了多種對象存儲方案&#xff0c;最終選擇了MinIO&#xff0c;為了方便python的調用&#xff0c;在minio第三方包的基礎上進行進一步封裝調用&#xff0c;該工具除了基礎的功能外&#xff0c;還封裝了多線程分片下載文件和上傳…

DeepDriving | CUDA編程-03:線程層級

本文來源公眾號“DeepDriving”&#xff0c;僅用于學術分享&#xff0c;侵權刪&#xff0c;干貨滿滿。 原文鏈接&#xff1a;CUDA編程-03:線程層級 DeepDriving | CUDA編程-01&#xff1a; 搭建CUDA編程環境-CSDN博客 DeepDriving | CUDA編程-02&#xff1a; 初識CUDA編程-C…

Linux之共享內存mmap用法實例(六十三)

簡介&#xff1a; CSDN博客專家&#xff0c;專注Android/Linux系統&#xff0c;分享多mic語音方案、音視頻、編解碼等技術&#xff0c;與大家一起成長&#xff01; 優質專欄&#xff1a;Audio工程師進階系列【原創干貨持續更新中……】&#x1f680; 優質專欄&#xff1a;多媒…

外賣霸王餐返利外賣會員卡小程序開發

外賣霸王餐返利外賣會員卡小程序開發 "社交電商賦能下的外賣返利小程序"是專為商家與用戶雙贏而設計的創新平臺。 以下是其開發方案的詳細步驟&#xff1a; 一、需求梳理&#xff1a;首先&#xff0c;我們需要明確小程序的核心功能和特色。包括設定活動類型、返利…

Python學習(3) 函數

定義 定義一個函數的格式&#xff1a; def 函數名(參數):執行代碼如果沒有參數&#xff0c;則稱為無參函數。 定義時小括號中寫的是形參&#xff08;形式參數&#xff09;&#xff0c;調用時寫的是實參&#xff08;實際參數&#xff09;。 調用 調用格式&#xff1a; def…