浅析嵌入式实时系统中信号量的概念

目录

概述

1. 认识信号量

1.1 定义信号量

1.2 信号量的类型

1.2.1 二值信号量

1.2.2 计数信号量

1.2.3 互斥信号量

1.2.3.1 认识互斥信号量

1.2.3.2 互斥信号量的其他特性

2 典型信号量的使用

2.1 等待和信号同步

2.2 多任务等待和信号同步

2.3 信用跟踪同步 

2.4 单一共享资源访问同步

2.5 递归共享资源访问同步

2.6 多个共享资源访问同步 

3 总结 


概述

本文主要介绍嵌入式实时操作系统信号量的相关知识点和实现原理,以及一些典型信号量的使用的方法和技巧,并对各类信号量的特点做了简要的分析。引入信号量,主要是为了解决多个任务之间能够同步它们的运行和协调对共享资源的互斥访问。

1. 认识信号量

1.1 定义信号量

信号量是一个内核对象,一个或者多个task可以获取或者释放它,从而达到同步或者相互排斥的目的。当一个信号量首次建立是,内核会分配给它一个控制块,一个唯一的ID、一个值和一个任务等候列表。

信号量的特点:

1)一个信号量就像一把钥匙,允许任务执行多次操作或访问一个资源。

2)获取到信号量之后,才能操作和访问相应的资源,没有获取到信号量就不能操作和访问该资源

3)一个单个信号量可以被访问多次。

4)信号量可分为不同的类型:包括而知,计数和相互排斥信号量

5)多个任务访问同一个信号量资源是,如果该信号量已经被占用,只能等它被释放之后才能重新被Task抢占

令牌计数器作用:

1)信号量创立时对计数器设定初值, 初值value = 0, 表示不可用, value = 1, 表示可用

2)当一个task获取信号量时,令牌计数被减一

3)当一个Task释放信号量时,令牌计数被加一

4)当令牌计数value = 0,表示此时没有令牌可用。此时,如果一个任务等待获取可用的令牌,该任务此时处于阻塞状态

任务等待列表的作用:

1)追踪所有等待信号量而被阻塞的任务

2)这些任务在等待列表中的排序方式:先进先出(FIFO)或者最高优先权优先

3)当有可用信号量时,内核允许等待列表中的第一个任务使用它。如果它是最高优先级任务,内核会使该任务从阻塞态------->运行态或者就绪态。

1.2 信号量的类型

1.2.1 二值信号量

二值信号灯的要点:

1)二值信号量只能取值0或1,

2)二值信号量为0时,该信号量不可用,当信号量为1时,该信号量可用。

3)二值信号量创立时,可以被初始化为可用或者不可用

4)二值信号量被当做全局资源。它们可以被需要信号量的所有Task共享

1.2.2 计数信号量

计数信号量特点:

1)一个信号使用一个计数,允许多次获取或者释放

2)当创立一个计数信号量时,赋予信号量一个数,表示已经初始化的信号量令牌的个数。

初始值 value = 0,创立时处于不可用状态

初始值 value > 0, 创立时处于可用状态

3)一个或者多个任务可以连续获取计数信号灯的一个令牌,直到没有令牌被留下。

4)当所有令牌被耗尽时,计数等于0,此时信号量处于不可用状态。

5)要使信号量从不可用状态跳转到可用状态,必须有任务释放一个令牌。

6)计数信号量时全局变量,可被所有需要信号量的Task共享

7)其允许任何一个Task释放一个计数令牌,即使是它没有获取到令牌,每次释放也会把计数递增一次

信号计数的分类

1)有界计数: 当信号量初次创立时,为计数信号量设置初始数,作为信号量的最大计数

2)无界计数:允许信号量计数超过初始数,直到达到数据类型的最大数。举例:计数类型为uint8_t,其最大计数为255

1.2.3 互斥信号量

1.2.3.1 认识互斥信号量

互斥信号量时一个特殊的二值信号量,它有如下特征:

1)支持所有权访问

2)支持递归访问

3)任务删除安全

3)一个或者多个协议

互斥信号量的特点:

1)互斥信号量的状态是开锁或者闭锁。

2)互斥信号量最初建立为开锁状态,可以被一个task获取,获取后,互斥信号量转到闭锁状态。

3)反之,当任务释放互斥信号量时,互斥信号量又返回到开锁状态。

4)互斥信号量使用: lock 或者 unlock操作

1.2.3.2 互斥信号量的其他特性

1 互斥信号量的所有权

1)当一个任务获取到信号量首次被锁住,得到互斥信号量的所有权

2)当一个任务释放互斥信号量将其开启,将失去互斥信号量的所有权

3)当一个任务拥有该信号量时,其他任何任务都不能开启或者锁住该互斥信号量

2 递归的闭锁

1)允许拥有互斥信号量的任务在闭锁的状态下多次获取它

2)带有递归闭锁的互斥信号量被称为递归互斥信号量

3)递归闭锁的互斥信号量用于一个共享资源进行排他性访问,它需要调用一个或者多个例程,而这些例程也需要访问这些共享资源

4)一个递归的互斥信号量允许嵌套这样的一个操作:此时如果其他任务也打算获取互斥锁,递归互斥锁会记录下来这个操作。但不会引起死锁。

注释:死锁指的是,两个或者多个任务阻塞并且等待相互锁住的资源

3 任务删除安全

当一个任务拥有该互斥信号灯时,该任务不能被删除

4 优先权倒置避免 

优先权倒置的概念:当一个较高的优先权Task被阻塞,并且等待一个较低优先级的Task使用的资源,而此资源又被其他中等优先级的Task所占用。

解决这个问题的方法:

1)优先权继承协议

保证Task-1的优先权  > Task-2的优先权

Task-1的特点:

a. 已经获取到互斥信号量

b. 任务优先级低

Task-2的特点:

a. 已经请求互斥信号量

b. 任务优先级高

2)天花板优先权协议

1)设置获取到互斥信号量的Task的优先级是所有请求互斥信号Task中最高的

2)释放互斥信号量后,恢复到原来的优先级

2 典型信号量的使用

2.1 等待和信号同步

其主要指两个任务没有数据交换,只是为了同步通信

2.2 多任务等待和信号同步

二值信号量最初是不可用的,较高优先权的tWait-Task 1、2、3全在做某些处理。当它们完成时,企图获取不可用的信号量,结果阻塞。此时tSignalTask完成它的处理,而且信号量运行一个Flush命令。信号灯不在阻塞,其他3个Task可以获取信号量。

2.3 信用跟踪同步 

背景: 发送信号任务执行的速率高于接收任务的速率

使用信号量解决该问题的步骤:

step -1: 发信号任务可以执行,并且按他自己的步调将技术递增一次,同时等待任务

step - 2: 当不阻塞时,按他自己的速率执行

2.4 单一共享资源访问同步

信号量创立数 value = 1, 说明此时可用,用来保护共享资源,并且保护共享资源,为了访问共享资源,task-1和task-2在读写共享资源之前,需要首先成功获取二值信号量,此种情况一般采用互斥信号量来控制不同task访问同一个资源。

 

2.5 递归共享资源访问同步

 

2.6 多个共享资源访问同步 

使用方法:给每一个共享资源分配一个单独的互斥信号灯

3 总结 

1)使用信号量允许多个任务或者ISR与任务同步运行,或者协调对一个共享资源的互斥访问

2)信号量有一个相关的信号量控制块,唯一的ID,一个用户分配的值和一个任务等待列表

3)三个通常类型的信号量是二值,计数和互斥信号量,每个都可以获取或者释放

4)二值信号量: 1表示可用,0表示不可用

5)除信号量的追已经是0,获取一个二值,在此情况下,它选择等候信号灯,则请求的任务阻塞

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ - Clion安装Qt msvc2017版本教程,基础环境配置clion+ Qt5.12.12 msvc2017 + VS2019

背景:平时代码开发使用clion,但使用项目要制定mscv2017版本Qt。先装过mingw版本Qt无法运行,但msvc版本依赖装有Visual Studio,本地装的又是2019版。就出现了这个大坑,需要配置好clion Qt msvc2017 VS2019。 文章目录 …

深度学习中embedding层的理解

Embedding层作用 在深度学习领域中,Embedding层扮演着至关重要的角色,尤其在处理文本数据或类别数据。Embedding层的功能有两个: 1. 将高维稀疏的输入数据(如单词、类别标签等)转换为低维稠密的向量表示,…

LNMP配置

文章目录 一、相关概念CGI的由来FastCGIPHP-FPM 二、编译安装编译安装nginxyum安装mysql编译安装php配置nginx支持php解析增加数据库安装论坛 一、相关概念 CGI的由来 最早的Web服务器只能简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器…

Python | Leetcode Python题解之第144题二叉树的前序遍历

题目: 题解: class Solution:def preorderTraversal(self, root: TreeNode) -> List[int]:res list()if not root:return resp1 rootwhile p1:p2 p1.leftif p2:while p2.right and p2.right ! p1:p2 p2.rightif not p2.right:res.append(p1.val)…

DeepSpeed MoE

MoE概念 模型参数增加很多;计算量没有增加(gating小FNN,比以前的大FNN计算量要小);收敛速度变快; 效果:PR-MoE > 普通MoE > DenseTransformer MoE模型,可视为Sparse Model&…

手机投屏到电脑时,手机提示连接失败

前言 注意,本方法建立在你已经通过其他帖子等解决了前置条件的情况下,手机提示连接失败情况下,包括但不限于关闭防火墙、安装无线投屏工具、手机和电脑连接在同一个WiFi频段下、关闭杀毒软件等。 具体操作方法 1、请进入设置 > 系统和…

电脑存储设备,固态硬盘介绍,usb接口

简介 存储设备分为两大类主存和辅存,另外还有专门提供存储服务的网络存储 主存储器 随机存取存储器(RAM, Random Access Memory) 特点:高速、易失性存储器,断电后数据丢失。用途:临时存储正在使用的数据…

卷积神经网络 convolution neural network

1.数学卷积:滑动窗口 2.图像具有局部相关性和平移不变性,有许多冗余的特征点,如果用全连接的神经网络会很浪费时间。 3.卷积nn:减少参数,滑动提取特征,特征作为下层卷积的输入,然后放到全连接…

Androidstudio项目加载不出来,显示Connect timed out

Android studio加载不出来所需要的环境依赖,99%的问题都是网络原因 解决办法有两个: 1.科学上网 2.使用国内的镜像 方法一自行解决,下面重点介绍方法二 在项目目录下找到gradle->wrapper->gradle-wrapper.properties 将项目的distributionUrl改为https://mirrors.cl…

设计模式-装饰器模式(结构型)

装饰器模式 装饰器模式是一种结构模式,通过装饰器模式可以在不改变原有类结构的情况下向一个新对象添加新功能,是现有类的包装。 图解 角色 抽象组件:定义组件的抽象方法具体组件:实现组件的抽象方法抽象装饰器:实现…

Unity 笔试题分享

1. 请回答以下代码片段执行时是否会产生堆内存分配 a. void SetChar(string s){s.Replace(b, d);}b. void Update(Transform t){t.localPosition new Vector3(0, 0, 0);}c、 int Sum(List<int> l){int total 0;foreach (int i in l){total i;} return total;}d…

C++ | Leetcode C++题解之第144题二叉树的前序遍历

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> preorderTraversal(TreeNode *root) {vector<int> res;if (root nullptr) {return res;}TreeNode *p1 root, *p2 nullptr;while (p1 ! nullptr) {p2 p1->left;if (p2 ! nullptr) {…

python教程

python解释器的安装 https://www.python.org/ftp/python/3.12.4/python-3.12.4-amd64.exe jetbrains官网 英文 PyCharm 专业的版本 Thank you for downloading PyCharm! 社区 Thank you for downloading PyCharm! 中文 PyCharm 专业的版本 感谢您下载PyCharm&#xff01…

群体优化算法---水波优化算法介绍以及应用于聚类数据挖掘代码示例

介绍 水波优化算法&#xff08;Water Wave Optimization, WWO&#xff09;是一种新兴的群智能优化算法&#xff0c;灵感来自水波在自然环境中的传播和衰减现象。该算法模拟了水波在水面上传播和碰撞的行为&#xff0c;通过这些行为来寻找问题的最优解。WWO算法由三种主要的操作…

【JavaEE】Spring Boot MyBatis详解(一)

一.MyBatis的基本概念与相关配置. 1.基本概念 MyBatis是一款优秀的持久层框架&#xff0c;用于简化JDBC的开发。MyBatis本是Apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache迁移到了google code&#xff0c;并且改名为MyBatis. 2013年11月迁移到Github.持久层…

区间预测 | Matlab实现GRU-ABKDE门控循环单元自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现GRU-ABKDE门控循环单元自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现GRU-ABKDE门控循环单元自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现GRU-ABKDE门控循环单元自适应…

[Vue3:组件通信)子组件props接收和watch监听,emit发送父组件 (添加修改设置成绩,添加、删除选课记录)

文章目录 一&#xff1a;系统功能&#xff1a;设置成绩&#xff08;添加或修改&#xff09;交互逻辑&#xff1a;涉及页面 Page02.vue&#xff0c;ModalEdit.vue主页面Page.vue注入子页面&#xff0c;使用子页面标签属性主页面对子页面做通信&#xff0c;子页面ModalEdit接收参…

Nginx+Tomcat负载均衡,动静分离群集

Nginx反向代理原理 Nginx 反向代理&#xff1a;将Nginx接收到的请求转发给其它应用服务器处理 Nginx 负载均衡&#xff1a;通过反向代理实现&#xff0c;还可以将nginx接收到的请求转发给多个后端应用服务器处理 Nginx 动静分离&#xff1a;静态页面请求&#xff0c;由nginx…

将AIRNet集成到yolov8中,实现端到端训练与推理

AIRNet是一个图像修复网络,支持对图像进行去雾、去雨、去噪声的修复。其基于对比的退化编码器(CBDE),将各种退化类型统一到同一嵌入空间;然后,基于退化引导恢复网络(DGRN)将嵌入空间修复为目标图像。可以将AIRNet的输出与yolov8进行端到端集成,实现部署上的简化。 本博…

vue3-使用富文本编辑器-wangEditor-文章发表1

最近在搞项目:我们组内几位成员正在搞一个网站搭建,以后更新会比较缓慢 引言:如果要网站要用的富文本编辑器的话,这边推荐用wangEditor 官网地址传送 : wangEditorhttps://www.wangeditor.com/ 我现在还在扩展我的写文章用的富文本编辑器 现在我将简单介绍一下其基本使用方…