同步互斥与通信

news2024/11/15 8:28:35

我们可以把多任务系统当作一个团队,里面的每一个任务都相当于团队里的一个人。团队成员之间要协调工作进度(同步)、争用会议室(互斥)、沟通(通信)。多任务系统所涉及的概念,都可以在现实生活中找到例子。

各类RTOS都会涉及这些概念:任务通知(Task nofication)、队列(queue)、事件组(event group)、信号量(semaphore)、互斥量(mutex)等。

同步与互斥的概念

一句话理解同步与互斥:我等你用完厕所,我再用厕所。什么叫做同步?就是:哎哎哎,我正在用厕所,你等会。什么叫做互斥?就是:哎哎哎,我正在用厕所,你不能进来。同步与互斥经常放在一起讲,是因为它们之间的关系很大,“互斥”操作可以使用“同步”来实现。我“等”你用完厕所,我再用厕所,这不就是使用“同步”来实现“互斥”吗?

再举一个例子,在团队活动里面,同事A先写完报表,经理B才能拿去向领导汇报。经理B必须等同事A完成报表,AB之间有依赖,B必须放慢脚步,被称之为同步。在团队活动中,同事A已经使用会议室了,经理B也想使用,即使经理B是领导,他也得等着,这就叫互斥。经理B跟同事A说:你用完会议室就提醒我。这就是使用”同步“实现”互斥“得的例子。

这时候可以看代码,伪代码如下:

void 抢厕所(void)
{
    if(有人在用)    我眯一会;
    用厕所;
    喂,醒醒,有人要用厕所吗;

}

假设A、B两人早起抢厕所,A先行占用一步;B慢了一步,于是就眯一会;当A用完之后就叫醒B,B也愉快的使用厕所。在这个过程中,A,B是互斥的访问厕所,”厕所“被称之为临界资源。我们使用了“休眠-唤醒“的同步机制实现了”临界资源“的”互斥访问“。

同一时间只能有一个人使用的资源,被称之为临界资源。比如任务A、B都要使用串口来打印,串口就是临界资源。如果A、B同时使用串口,那么打印出来的信息就是A、B混杂,无法分辨。所以使用串口时,应该是这样:A用完,B再用;B用完,A再用。

各类方法的对比

能实现同步、互斥的内核方法有:任务通知(task notification)、队列(queue)、事件组(event group)、信号量(semaphore)、互斥量(mutex)。

它们都有类似的操作方法:获取/释放、阻塞/唤醒、超时。比如:

  • A获取资源,用完后A释放资源

  • A获取不到资源则阻塞,B释放资源并把A唤醒

  • A获取不到资源则阻塞,并定个闹钟,A要么超时返回,要么在这段时间内因为B释放资源而被唤醒。

这些内核对象五花八门,记不住怎么办,这里采用对比的方法来加深它们之间的区别。

  • 能否传信息?只能传递状态?

  • 为众生?只为你?

  • 我生产,你们消费?

  • 我上锁,只能由我开锁

内核对象

生产者

消费者

数据/状态

说明

队列

ALL

ALL

数据:若干个数据谁都可以往队列里扔数据,谁都可以从队列里读数据

用来传递数据,发送者,接收者无限制,一个数据只能唤醒一个接收者

事件组

ALL

ALL

多个位:或,与

谁都可以设置(生产)多个位,谁都可以等待某个位,若干个位

用来传递事件,可以是N个事件,发送者,接收者无限制;

可以唤醒多个接收者:像广播

信号量

ALL

ALL

数量:0~n

谁都可以增加一个数量

谁都可以消耗一个数量

用来维持资源的个数

生产者,消费者无限制,

1个资源只能唤醒1个接收者

任务通知

ALL

只有我

数据,状态都可以传输

使用任务通知时,

必须指定接受者

N对1的关系;

发送者无限制

接收者只能是这个任务

互斥量

只能A开锁

A上锁

位:0、1

我上锁:1变为0,

只能由我开锁:0变为1

就像一个空厕所,

谁使用谁上锁,

也只能由他开锁

使用图形对比如下:

  • 队列:

  • 里面可以放任意数据,可以放多个数据

  • 任务,ISR都可以放入数据;任务,ISR都可以从中读取数据

  • 事件组

  • 一个事件用1bit来表示,1表示事件发生了,0表示事件没发生

  • 可以用来表示事件,事件的组合发生了,不能传递数据

  • 有广播效果:事件或事件的组合发生了,等待它的多个任务都会被唤醒

  • 信号量

  • 核心是“计数值”

  • 任务,ISR释放信号量时让计数值加1

  • 任务,ISR获得信号量时,让计数值减1

  • 任务通知

  • 核心是任务的TCB里的数值

  • 会被覆盖

  • 发通知给谁?必须指定接收任务

  • 只能由接收任务本身获取该通知

  • 互斥量:

  • 数值只有0或1

  • 谁获得互斥量,就必须由谁释放同一个互斥量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/355394.html

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

相关文章

Spring之事务底层源码解析

Spring之事务底层源码解析 1、EnableTransactionManagement工作原理 开启 Spring 事务本质上就是增加了一个 Advisor,当我们使用 EnableTransactionManagement 注解来开启 Spring 事务时,该注解代理的功能就是向 Spring 容器中添加了两个 Bean&#xf…

【算法基础】并查集⭐⭐⭐⭐⭐【思路巧,代码短,面试常考】

并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中。其特点是看似并不复杂,但数据量…

二叉树的相关列题!!

对于二叉树,很难,很难!笔者也是感觉很难!虽然能听懂课程,但是,对于大部分的练习题并不能做出来!所以感觉很尴尬!!因此,笔者经过先前的那篇博客,已…

Windows下编译安装Redis

Windows下安装Redis1.下载cygwin2.安装cygwin3.下载Redis4.编译Redis5.运行redis6.报错:继上次Windows下安装MySQL后,今天安装Redis发现也复杂许多,github上有几个仓库似乎提供了windows一键安装版,但是到 5.0版本就不更新了……所…

python机器学习

机器学习可分为两大类,分别为监督学习与非监督学习 监督学习 监督学习是机器学习的类型,其中机器使用“标记好”的训练数据进行训练,并基于该数据,机器预测输出。标记的数据意味着一些输入数据已经用正确的输出标记。 在监督学习…

设计模式之策略模式与责任链模式详解和应用

目录1.策略模式1.1 目标1.2.内容定位1.3.定义1.4.应用场景1.5.促销优惠业务场景1.6 用策略模式实现选择支付方式的业务场景1.7 策略模式在框架源码中的体现1.8 策略模式的优缺点2 责任链模式2.1 责任链楼式的应用场景2.2 利用责任链模式进行数据校验拦截2.3 责任链模式和建造者…

实战打靶集锦-006-Stapler

**写在前面:**记录博主的一次打靶经历。 目录1. 主机发现2. 端口发现3. 服务枚举4. 服务探查4.1 FTP探查4.1.1 匿名登录4.1.2 Elly用户4.1.3 John用户4.1.4 EXP搜索4.2 dnsmasq探查4.2.1 基础信息获取4.2.2 EXP搜索4.3 WEB应用探查4.3.1 浏览器访问4.3.2 目录扫描4.…

Nacos超简单-管理配置文件

优点理论什么的就不说了,按照流程开始配配置吧。登录Centos,启动Naocs,使用sh /data/soft/restart.sh将自动启动Nacos。访问:http://192.168.101.65:8848/nacos/账号密码:nacos/nacos分为两部分,第一部分准…

【RabbitMQ】Windows 安装 RabbitMQ

文章目录工具下载Eralng 安装与配置RabbitMQ 安装工具下载 RabbitMQ 3.7.4版本 网盘链接:https://pan.baidu.com/s/1pO6Q8fUbiMrtclpq2KqVVQ?pwdgf29 提取码:gf29 Eralng 网盘链接:https://pan.baidu.com/s/1irf8fgK77k8T9QzsIRwa7g?pwd9…

广度优先搜索(BFS)-蓝桥杯

一、BFS搜索的原理BFS搜索的原理:“逐层扩散”,从起点出发,按层次从近到远,逐层先后搜索。编码:用队列实现。应用:BFS一般用于求最短路径问题,BFS的特点是逐层搜索,先搜到的层离起点…

Prometheus 记录规则和警报规则

前提环境&#xff1a; Docker环境 涉及参考文档&#xff1a; Prometheus 录制规则Prometheus 警报规则 语法检查规则 promtool check rules /path/to/example.rules.yml一&#xff1a;录制规则语法 groups 语法&#xff1a; groups:[ - <rule_group> ]rule_group…

Redis 强化

(Redis入门使用查看)https://blog.csdn.net/weixin_73849581/article/details/128390152?spm1001.2014.3001.5501缓存使用原则什么时候,什么样的数据能够保存在Redis中?1.数据量不能太大2.使用越频繁,Redis保存这个数据越值得3.保存在Redis中的数据一般不会是数据库中频繁修改…

❤️Selenium实战操作,获取图片详解(内附源码)⚡

👋👋最近也是想换壁纸了,所以来一期详细的selenium获取壁纸教程。 公众号:测个der 源码地址:https://gitee.com/qinganan_admin/reptile-case.git 遇事不决就用selenium就对了。 💨💨目标地址:https://desk.zol.com.cn/dongman/ 目标存在地点: 好了解之后,…

GoLang设置gofmt和goimports自动格式化

目录 设置gofmt gofmt介绍 配置gofmt 设置goimports goimports介绍 配置goimports 设置gofmt gofmt介绍 Go语言的开发团队制定了统一的官方代码风格&#xff0c;并且推出了 gofmt 工具&#xff08;gofmt 或 go fmt&#xff09;来帮助开发者格式化他们的代码到统一的风格…

c/c++开发,无可避免的模板编程实践(篇四)

一、容器与模板 前文就说到&#xff0c;标准库基于模板编程&#xff0c;定义了许多容器类以及一系列泛型算法&#xff0c;使程序员可以更简洁、抽象和有效地编写程序。C标准库中有大量的标准容器&#xff0c;这些容器通常包含一组数据或对象的集合&#xff0c;几乎可以和任何类…

剑指 Offer 48. 最长不含重复字符的子字符串

摘要 剑指 Offer 48. 最长不含重复字符的子字符串 一、滑动窗口解析 这样一来&#xff0c;我们就可以使用「滑动窗口」来解决这个问题了&#xff1a; 我们使用两个指针表示字符串中的某个子串&#xff08;或窗口&#xff09;的左右边界&#xff0c;其中左指针代表着上文中枚…

解决Edge浏览器主页被篡改问题,或许可以帮你彻底解决

问题描述&#xff1a; 之前从一个第三方网站下载了一个不知名软件&#xff0c;接着电脑就各种下载360全家桶之类的软件&#xff0c;后来问题解决了&#xff0c;但是还残留了一些问题&#xff0c;前几天发现edge浏览器的主页被改成了360导航&#xff0c;就是那个该死的hao123&a…

TSITDM 的图

TSI (汽轮机监视保护系统) 时域信号的处理 TDM(Turbine Diagnosis Management) 对时域信号进行频域分析 频谱图&#xff08;Frequency Spectrogram Plot&#xff09;&#xff1a; 横轴是频率值&#xff0c;纵轴是振幅(被测信号在该频率下的能量值) 很多的故障都有自己特定的频…

吉林大学软件需求分析与规范(Software Requirements Analysis Specification)

chapter0课程简介&#xff1a;◼ 软件工程专业核心课程之一◼ 软件工程课程体系最前端课程◼ 主要内容&#xff1a;需求的基本概念&#xff0c;需求的分类&#xff0c;需求工程的基本过程&#xff0c;需求获取的方法、步骤、技巧&#xff0c;需求分析和建模技术&#xff0c;需求…

前端PWA渐进式加载技术

1.什么是PWA&#xff1f; 渐进式网络应用&#xff08;PWA&#xff09;是谷歌在2015年底提出的概念。基本上算是web应用程序&#xff0c;但在外观和感觉上与原生app类似。支持PWA的网站可以提供脱机工作、推送通知和设备硬件访问等功能。 2.PWA有那些优点&#xff1f; 更小更…