十二、同步互斥与通信

1、概述

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

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

2、同步与互斥的概念

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

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

(3)有时候看代码更容易理解,伪代码如下:

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

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

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

3、各类方法的对比

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

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

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

(3)这些内核对象五花八门,记不住怎么办?我也记不住,通过对比的方法来区分它们。

  • 能否传信息?只能传状态?
  • 为众生?只为你?
  • 我生产,你们消费?
  • 我上锁,只能由我开锁。

(4)同步互斥方法介绍表

内核对象生产者消费者数据/状态说明
队列ALLALL

数据:若干个数据

谁都可以往队列里扔数据,

谁都可以从队列里读数据

用来传递数据,

发送者、接收者无限制,

一个数据只能唤醒一个接收者

事件组ALLALL

多个位:或、与

谁都可以设置(生产)多个位,

谁都可以等待某个位、若干个位

用来传递事件,

可以是N个事件,

发送者、接收者无限制,

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

信号量ALLALL

数量:0~n

谁都可以增加一个数量,

谁都可以消耗一个数量

用来维持资源的个数,

生产者、消费者无限制,

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

任务通知ALL只有我

数据、状态都可以传输,

使用任务通知时,

必须指定接收者

N对1的关系:

发送者无限制,

接收者只能是这个任务

互斥量只能A开锁A上锁

位:0、1

我上锁:1变为0

只能我开锁:0变为1

就像一个空厕所,

谁使用谁上锁,

也只能由他开锁

(5)使用图形对比如下:

  • 队列
    • 里面可以放任意数据,可以放多个数据
    • 任务、ISR都可以放入数据;任务、ISR都可以从中读出数据
  • 事件组
    • 一个事件用一bit来表示,1表示事件发生了,0表示事件没发生
    • 可以用来表示事件、事件的组合发生了,不能传递数据
    • 有广播效果:事件或事件的组合发生了,等待它的多个任务都会被唤醒
  • 信号量
    • 核心是"计数值"
    • 任务、ISR释放信号量时,让计数值加1
    • 任务、ISR获得信号量时,让计数值减1
  • 任务通知
    • 核心是任务的TCB里的数值
    • 会被覆盖
    • 发通知给谁?必须指定接收任务
    • 只能由接收任务本身获取该通知
  • 互斥量
    • 数值只有0或1
    • 谁获得互斥量,就必须由谁释放同一个互斥量



 

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

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

相关文章

小程序入门笔记(一) 黑马程序员前端微信小程序开发教程

微信小程序基本介绍 小程序和普通网页有以下几点区别: 运行环境:小程序可以在手机的操作系统上直接运行,如微信、支付宝等;而普通网页需要在浏览器中打开才能运行。 开发技术:小程序采用前端技术进行开发,…

XC5013 马达驱动和充电集成一体的控制芯片 一档输出芯片

XC5013 是一款应用于马达驱动或 LED 驱动的控制芯片,集成了锂电池充电管理系统,设定一档高电平输 出,并带有对不同状态的 LED 指示功能。 XC5013 集成了涓流充电、恒流充电和恒压充电全过程的充电方式,浮充电压精度在全温度范…

正点原子嵌入式linux驱动开发——TF-A初探

上一篇笔记中,正点原子的文档简单讲解了一下什么是TF-A,并且也学习了如何编译TF-A。但是TF-A是如何运行的,它的一个运行流程并未涉及。TF-A的详细运行过程是很复杂的,涉及到很多ARM处理器底层知识,所以这一篇笔记的内容…

大促节奏:速卖通黑五接力双十一,如何打造产品权重瓜分活动流量

双十一和黑五作为一种独特的消费文化现象,已经逐渐成为了消费领域中的一块“金字招牌”。无论是消费者还是商家,都非常期待这一天的到来,因为它不仅代表着购物的欲望和刺激,更重要的是,双十一和黑五已经成为了一种全新…

全排列[中等]

优质博文:IT-BLOG-CN 一、题目 给定一个不含重复数字的数组nums,返回其所有可能的全排列。你可以按任意顺序返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例…

不做静态化,当部署到服务器上的项目刷新出现404【已解决】

当线上项目刷新出现404页面解决方法: 在nginx配置里加入这样一段代码 try_files $uri $uri/ /index.html; 它的作用是尝试按照给定的顺序访问文件 变量解释 try_files 固定语法 $uri 指代home文件(ip地址后面的路径,假如是127.0.0.1/index/a.png&…

二项分布以及实现

文章目录 前言所谓二项分布就是只会产生两种结果的概率 1.概念 前言 所谓二项分布就是只会产生两种结果的概率 1.概念 下面是一个二项分布的的theano实现 import numpy as np import theano import theano.tensor as T from theano.tensor.nnet import conv from theano.ten…

只需5秒视频就能生成3D模型的AI工具——Luma AI

HI,同学们,我是赤辰,本期是第13篇AI工具类教程,文章底部准备了粉丝福利,看完后可领取! 今天给大家介绍一款用视频生成3D模型内容的AI工具——Luma AI,基于神经渲染技术,只需拍摄照片…

计算机竞赛 题目:基于FP-Growth的新闻挖掘算法系统的设计与实现

文章目录 0 前言1 项目背景2 算法架构3 FP-Growth算法原理3.1 FP树3.2 算法过程3.3 算法实现3.3.1 构建FP树 3.4 从FP树中挖掘频繁项集 4 系统设计展示5 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 基于FP-Growth的新闻挖掘算法系统的设计与实现…

Linux:TCP三握四挥简析

文章目录 1. 前言2. 背景3. TCP连接的建立和断开3.1 TCP协议状态机3.2 TCP的三握四挥3.2.1 TCP 连接建立的三次握手过程分析3.2.1.1 服务端和客户端套接字的创建3.2.1.2 服务端进入 LISTEN 状态3.2.1.3 服务端在 LISTEN 状态等待客户端的 SYN 请求3.2.1.4 客户端向服务端发送 S…

IIC控制器(2):PS端

书接上文: I2C控制器练习(1)_NoNoUnknow的博客-CSDN博客 SPI协议与FPGA的自动升级和多启动-CSDN博客 本文主要做一些基本知识的补充和工程参考。 写IIC需要注意的事情: 1.查询芯片手册获得slave地址,以及寄存器地址…

GhostNet原理解析及pytorch实现

论文:https://arxiv.org/abs/1911.11907 源码:https://github.com/huawei-noah/ghostnet 简要论述GhostNet的核心内容。 Ghost Net 1、Introduction 在训练良好的深度神经网络的特征图中,丰富甚至冗余的信息通常保证了对输入数据的全面理…

【数据结构】红黑树(C++实现)

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯长路漫漫浩浩,万事皆有期待 上一篇博客:【数据…

妙不可言的Python之旅----(二)

Python基础语法 什么是字面量 字面量:在代码中,被写下来的的固定的值,称之为字面量 常用的值类型 类型 描述 说明 数字(Number) 支持 • 整数(int) • 浮点数(float&#xff…

手边酒店V2独立版小程序 1.0.21 免授权+小程序前端

手边酒店小程序独立版酒店宾馆订房系统支持创建多个小程序,让每一个客户单独管理属于自己的小程序。后台支持一键入住,一键退款、退押金、钟点房支持微信支付、模板消息。客服实时收到新的订单信息,可以在手机端处理订单。支持按日期维护房价…

在PHP8中使用instanceof操作符检测对象类型-PHP8知识详解

在PHP8中使用instanceof操作符可以检测当前对象属于哪个类。语法格式如下: objectName instanceof classname下面我们用一个实例来讲解使用instanceof操作符检测对象类型。 本实例将将创建3个类,其中有两个类是父类和子类的关系,然后实例化…

堆排序详解

堆排序 一.前言二.堆排序思路三.堆的创建1.堆的向上调整2.堆的向下调整3.向上建堆4.向下建堆5.两种建堆方式比较 四.堆排序五.复杂度分析六.Topk问题七.结语 一.前言 堆排序在生活中主要有两大应用场景:一是大数据排序,二是优先队列。其中典型的实例就是…

【算法与数据结构】归并排序的代码实现(详细图解)以及master公式的讲解

目录 1、归并排序 1.1、算法描述 1.2、图解说明 2、代码实现 3、master公式 3.1、公式以及结论 3.2、适用于某些特殊的递归 3.3、计算归并排序的时间复杂度 1、归并排序 归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用递归或者说是分治法(Di…

JAVA学习(5)-全网最详细~

🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…

第八章 Linux文件系统权限

目录 8.1 文件的一般权限 1.修改文件或目录的权限---chmod命令 2.对于文件和目录,r,w,x有不同的作用: 3.修改文件或目录的所属主和组---chown,chgrp 8.2 文件和目录的特殊权限 三种通过字符描述文件权限 8.3 ACL 权限 1.A…