基于ucos-ii操作系统的生产者消费者-问题

news2024/11/15 12:05:49

目  录

第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.coloradmin.cn/o/1685630.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【OpenGL实践10】关于几何着色器

目录 一、说明 二、几何着色器 2.1 设置 2.2 基本几何着色器 2.2.1 输入类型 2.2.2 输出类型 2.2.3 顶点输入 2.2.4 顶点输出 2.3 创建几何着色器 2.4 几何着色器和顶点属性 三、动态生成几何体 四、结论 练习 一、说明 几何着色器的应用比较高级&#xff0c;关于…

探索 Rust 语言的精髓:深入 Rust 标准库

探索 Rust 语言的精髓&#xff1a;深入 Rust 标准库 Rust&#xff0c;这门现代编程语言以其内存安全、并发性和性能优势而闻名。它不仅在系统编程领域展现出强大的能力&#xff0c;也越来越多地被应用于WebAssembly、嵌入式系统、分布式服务等众多领域。Rust 的成功&#xff0…

databricks~Unity Catalog

Unity Catalog hierarchy 包含了用户授权管理信息和元数据信息 workspace with unity catalog hierarchy unity metastore Ref: https://www.youtube.com/playlist?listPLY-V_O-O7h4fwcHcXgkR_zTLvddvE_GfC

欢乐钓鱼大师攻略大全,游戏自动辅助,钓鱼大全!

欢迎来到《欢乐钓鱼大师》的攻略大全&#xff01;本文将为你详细介绍游戏中的各类玩法、技巧和注意事项&#xff0c;帮助你快速掌握游戏精髓&#xff0c;成为一名真正的钓鱼大师。攻略内容包括新手鱼竿选择、锦标赛攻略、实用技巧、藏宝图玩法、箱子开法等多个方面。让我们一起…

数字信号处理:matlab解差分方程

1. 验证全响应 %验证全响应零状态响应零输入响应 %y(n)4y(n-1)x(n),其中x(n)δ(n),y(-1)2.clc;%清屏 clear all;%清除所有变量的值 b[1]; a[1,-4]; ys[2]; xs[0];%没有初始值&#xff0c;就是0 xn[1, zeros(1,4)];%输入序列&#xff0c;假设长度是5&#xff0c;则输出长度也是…

人工智能+量子计算:飞跃现实边界还是科技幻想?

人工智能量子计算&#xff0c;这是一种可能改变世界的伙伴关系。 在科技的前沿&#xff0c;两大革命性技术——人工智能&#xff08;AI&#xff09;和量子计算——正站在合作的十字路口。人工智能&#xff0c;以其强大的数据分析能力和模式识别&#xff0c;正在改变着我们生活…

【机器学习与大模型】驱动下的电子商务应用

摘要&#xff1a; 随着信息技术的飞速发展&#xff0c;电子商务已经成为当今商业领域中最为活跃和重要的部分之一。而机器学习和大模型的出现&#xff0c;为电子商务带来了新的机遇和挑战。本文深入探讨了机器学习与大模型在电子商务中的应用&#xff0c;包括个性化推荐、精准营…

第一份工资

当我拿到我人生的第一份工资时&#xff0c;那是一种难以言表的激动。我记得那个下午&#xff0c;阳光透过窗户洒在了我的办公桌上&#xff0c;我看着那张支票&#xff0c;心中满是欣喜和自豪。那是我独立生活的开始&#xff0c;也是我对自己能力的一种肯定。 我记得我是如何支配…

【云原生】kubernetes中的service原理、应用实战案例解析

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

5分钟在 VSCode 中使用 PlantUML 绘图

去年&#xff0c;写过一篇在 VSCode 中使用 PlantUML 的博客&#xff0c;那时候我嫌弃本地安装麻烦&#xff0c;所以采用的是在本地运行 docker 容器的方法部署的 PlantUML 服务端。不过&#xff0c;现在来看这样还必须依赖在本地手动启动 docker 容器&#xff08;如果有一个不…

【UnityShader入门精要学习笔记】第十四章 非真实感渲染

本系列为作者学习UnityShader入门精要而作的笔记&#xff0c;内容将包括&#xff1a; 书本中句子照抄 个人批注项目源码一堆新手会犯的错误潜在的太监断更&#xff0c;有始无终 我的GitHub仓库 总之适用于同样开始学习Shader的同学们进行有取舍的参考。 文章目录 卡通风格渲…

2024年5月24日 十二生肖 今日运势

小运播报&#xff1a;2024年5月24日&#xff0c;星期五&#xff0c;农历四月十七 &#xff08;甲辰年己巳月戊子日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;龙、牛、猴 需要注意&#xff1a;兔、羊、马 喜神方位&#xff1a;东南方 财神方位&#xff1a;…

10个顶级的论文降重指令,让你的论文降重至1.9%

10个顶级的论文降重指令&#xff0c;本硕博写论文必备&#xff01; 在ChatGPT4o对话框中输入&#xff1a;写一个Spring BootVue实现的车位管理系统的论文大纲&#xff0c;并对其具体章节进行详细描述。 几小时即可完成一份1万字论文的编写 在GPTS中搜索论文降重&#xff0c;使…

[Redis]基本全局命令

Redis存储方式介绍 在 Redis 中数据是以键值对的凡事存储的&#xff0c;键&#xff08;Key&#xff09;和值&#xff08;Value&#xff09;是基本的数据存储单元。以下是对 Redis 键值对的详细讲解&#xff1a; 键&#xff08;Key&#xff09;&#xff1a; 类型&#xff1a;…

论文精读--InstructGPT

模型效果取决于数据效果&#xff0c;但在精细度上控制不够&#xff0c;只是大力出奇迹&#xff0c;这样有很大的问题&#xff1a; &#xff08;1&#xff09;数据量太多或者没有这方面的数据&#xff0c;模型学不会怎么办 &#xff08;2&#xff09;安全性问题&#xff0c;模…

c语言:利用随机函数产生20个[120, 834] 之间互不相等的随机数, 并利用选择排序法将其从小到大排序后输出(每行输出5个)

利用随机函数产生20个[120, 834] 之间互不相等的随机数&#xff0c; 并利用选择排序法将其从小到大排序后输出&#xff08;每行输出5个&#xff09; 代码如下&#xff1a; #include <stdio.h> #include <time.h> #include <stdlib.h> int shenchen(int a[…

信息系统项目管理师0126:输入(8项目整合管理—8.6管理项目知识—8.6.1输入)

点击查看专栏目录 文章目录 8.6 管理项目知识8.6.1 输入8.6 管理项目知识 管理项目知识是使用现有知识并生成新知识,以实现项目目标并且帮助组织学习的过程。管理项目过程的主要作用: 利用已有的组织知识来创造或改进项目成果;使当前项目创造的知识可用于支持组织运营和未来…

解决Vscode打开新文件会覆盖旧文件

现象&原因 现象&#xff1a;Vscode左侧点击新文件&#xff0c;右侧重用预览编辑器&#xff0c;新文件会替换旧文件原因&#xff1a; 默认单击是预览编辑器显示&#xff0c;双击是保持打开状态 解决方案 以下两种都可以 设置里搜索 Enable Preview 默认是勾选状态&#x…

京东科技市场与平台运营中心PMO负责人徐雪娇受邀为第十三届中国PMO大会演讲嘉宾

全国PMO专业人士年度盛会 京东集团京东科技市场与平台运营中心PMO负责人徐雪娇女士受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“AI数字人项目全过程管理实践分享”。大会将于6月29-30日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&…

springboot vue 开源 会员收银系统 (4) 分类及商品模块开发

前言 完整版演示 前面我们对会员系统 门店模块开发的开发 完成了门店的基础管理 并与会员相关联 下面我们将开发门店的分类及商品管理 我们分析以下几个重点 分类可以随时禁用不用单独下架某个商品便于管理商品添加应该有图片上传商品设置会员价和散客价便于营销商品应该参与…