基于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.mzph.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…