信号量笔记

news2025/1/11 23:40:50

 1、信号量简介

信号量是一种实现任务间通信机制,可以实现任务之间同步临界资源的互斥访问,常用于协助一组相互竞争的任务来访问临界资源。在多任务系统中,各任务之间需要同步或互斥实现临界资源的访问,信号量功能可以为用户提供这方面的支持。

抽象的来讲,信号量是一个非负整数,所有获取它的任务都会将该整数减一,当该整数值为零时,所有试图获取它的任务都将处于阻塞状态。通常一个信号量的计数值用于对应有效的资源数,表示剩下的可被占用的互斥资源数。

信号量的计数值都有限制:限定最大值。

如果最大值被限定为1,那么它就是二值信号量

如果最大值不是1,它就是计数型信号量

---------------------------------------------------------------------------------------------------------------------------------队列与信号量的对比

---------------------------------------------------------------------------------------------------------------------------------

2、二值信号量

简介

二值信号量的本质是一个队列长度为1的队列,该队列只有空和满两种情况,这就是所谓的二值。

二值信号量通常用于互斥访问或任务同步,与互斥信号量比较类似,但是二值信号量有可能会导致优先级翻转的问题,所以二值信号量更适合用于同步

什么是同步啊?举个例子吧。

用作同步时,信号量在创建后应被置为空,任务1获取信号量而进入阻塞状态,任务2在某种条件发生后,任务2运行并在最后释放信号量,于是任务1获得信号量得以进入就绪态,如果任务1的优先级是最高的,那么就会立即切换任务,任务1执行完成后并不需要归还信号量,从而达到了两个任务间的同步。同样的,在中断服务函数中释放信号量,任务1也会得到信号量,从而达到任务与中断间的同步。

---------------------------------------------------------------------------------------------------------------------------------

这里有一个知识点,优先级翻转

顾名思义,优先级翻转的意思就是高优先级的任务反而慢执行,而低优先级的任务反而优先执行。

优先级翻转在抢占式内核中是非常常见的,但是在实时操作系统中是不允许出现优先级翻转的,因为优先级翻转会破坏任务的预期顺序,可能会导致未知的严重后果。

这么纯说还是有一些抽象,那我要拿出正点原子的例子并解释一通了。

前提条件:任务L的优先级最低,M的优先级中,H的优先级最高;任务L和H的开头和结尾需要获取信号量然后释放信号量,任务M不需要。

L先执行,然后H想要执行,但是信号量的计数值此时为0,H没有办法执行而进入阻塞状态,所以L继续执行,然后M执行,因为M不需要信号量,所以M执行,等M和L都执行完,H才能执行,这个时候就会出现M优先级比H低,但是M先于H执行。

高优先级任务被低优先级任务阻塞,导致高优先级任务迟迟得不到调度。但其他中等优先级的任务却能抢到CPU资源。从现象上看,就像是中优先级的任务比高优先级任务具有更高的优先权(即优先级翻转)

---------------------------------------------------------------------------------------------------------------------------------

上一张信号量的图吧。

相关API函数

使用二值信号量的流程与队列类似,使用二值信号量的流程为:创建二值信号量、释放二值信号量、获取二值信号量。

后边的计数信号量和互斥信号量的释放和获取与这里使用的函数一致。

动态方式创建二值信号量

 #define   xSemaphoreCreateBinary( )   						
 xQueueGenericCreate( 1 ,   semSEMAPHORE_QUEUE_ITEM_LENGTH  ,   queueQUEUE_TYPE_BINARY_SEMAPHORE )
#define  semSEMAPHORE_QUEUE_ITEM_LENGTH      ( ( uint8_t ) 0U )

使用该函数创建的二值信号量是空的。

返回值

释放二值信号量函数

获取二值信号量函数

信号量删除函数

vSemaphoreDelete()用于删除一个信号量,包括二值信号量、计数信号量和互斥信号量。如果有任务阻塞在该信号量上,那么不要删除该信号量。

函数原型:

void vSemaphoreDelete(SemaphoreHandle_t xSemaphore);

传入参数:

信号量句柄。

3、计数型信号量

简介

计数型信号量相当于队列长度大于1的队列,因此计数型信号量能够容纳多个资源,这在计数型信号量被创建的时候确定。

计数型信号量使用场合

事件计数:当每次事件发生后,在事件处理函数中释放计数型信号量(计数值+1),其他任务会获取计数型信号量(计数值-1),这种场合一般在创建时将初始计数值设置为0。

资源管理:信号量表示有效的资源数目。任务必须先获取信号量(信号量计数值-1)才能获取资源控制权。当计数值减为零时表示没有资源。当任务使用完资源后,必须释放信号量(信号量计数值+1)。信号量创建时计数值应等于最大资源数目。

相关API函数

动态方式创建计数型信号量

获取信号量的计数值函数

4、互斥信号量

简介

互斥信号量其实就是一个拥有优先级继承的二值信号量,互斥信号量适合用于那些需要互斥访问的应用中。

用作互斥时,信号量创建后可用信号量个数应该是满的,任务在需要使用临界资源时(临界资源是指任何时刻只能被一个任务访问的资源),先获取互斥信号量,使其变空,这样其他任务需要使用临界资源时就会因为无法获取信号量而进入阻塞,从而保证了临界资源的安全。

在操作系统中,我们使用信号量的很多时候是为了给临界资源建立一个标志,信号量表示了该临界资源被占用情况。这样,当一个任务在访问临界资源的时候,就会先对这个资源信息进行查询,从而在了解资源被占用的情况之后,再做处理,从而使得临界资源得到有效的保护。

---------------------------------------------------------------------------------------------------------------------------------

优先级继承:当一个互斥信号量正在被一个低优先级的任务持有时,如果此时有个高优先级的任务也尝试获取这个互斥信号量,那么这个高优先级的任务就会被阻塞。不过这个高优先级的任务会将低优先级任务的优先级提升到与自己相同的优先级。

优先级继承并不能完全消除优先级翻转的问题,它只能尽可能的降低优先级翻转带来的影响。

H把L的优先级提升到与自己相同,那么M就不能抢占L。

---------------------------------------------------------------------------------------------------------------------------------

互斥信号量不能用于中断服务函数中,原因如下:

(1)互斥信号量有任务优先级继承的机制,但是中断不是任务,没有任务优先级,所以互斥信号量只能用于任务中,不能用于中断服务函数。

(2)中断服务函数中不能因为要等待互斥信号量而设置阻塞时间进入阻塞态。

相关API函数

互斥信号量创建API函数(动态)

注意:创建互斥信号量时,会主动释放一次信号量。

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

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

相关文章

智能新时代:探索【人工智能】、【机器学习】与【深度学习】的前沿技术与应用

目录 1. 引言 1.1 人工智能的概念与历史 1.2 机器学习与深度学习的演进 1.3 计算机视觉的崛起与应用场景 2. 人工智能基础 2.1 什么是人工智能? 2.2 人工智能的分类 2.3 人工智能的现实应用 3. 机器学习 3.1 机器学习的定义与基本原理 3.2 机器学习的主要…

【可能是全网最丝滑的LangChain教程】二十二、LangChain进阶之Callbacks(完结篇)

这是LangChain进阶教程的最后一篇,Let’s get it!!! 01 Callback介绍 在LangChain中,Callback 是一种非常重要的机制,它允许用户监听和处理在执行链式任务 (Chain) 过程中的各种事件。这包括但不限于开始执行、结束执行、异常处理等。Callba…

数据结构(邓俊辉)学习笔记】串 03——KMP算法:记忆法

文章目录 1. 重复匹配的前缀2. 不变性3. 记忆力4. 预知力 1. 重复匹配的前缀 关于串匹配,包括蛮力算法在内,至少有30多种知名的算法,而接下来,就将介绍其中最为经典的 KMP 算法。这个算法之所以著名,不仅是由于它出自包…

Autosar(Davinci) --- ADT和IDT如何Mapping

前言 这里我们讲一下ADT如何与IDT进行Mapping 一、ADT为什么要与IDT进行Mapping 二、ADT和IDT如何Mapping 鼠标右键【type Mapping Sets】,选择【New Data type Mapping Set...】 打开之后,我们起一个名字【DemoTypeMapping】 然后选择【Data Type Maps】来将ADT与IDT进行m…

SpringBoot+Grafana+Prometheus+Docker-Compose 快速部署与JVM监控的快速入门的简单案例

1. Java项目 1.1 项目结构 1.2 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"htt…

ThingsGateway:一款基于.NET8开源的跨平台高性能边缘采集网关

前言 今天大姚给大家分享一款基于.NET8开源的跨平台高性能边缘采集网关&#xff0c;提供底层PLC通讯库&#xff0c;通讯调试软件等&#xff0c;单机采集数据点位可达百万&#xff1a;ThingsGateway。 项目技术栈 后端技术栈&#xff1a;支持.NET 6/7/8&#xff0c;Sqlsugar&am…

爬虫使用优质代理:确保高效稳定的数据采集之道

爬虫使用优质代理的最佳实践 在进行网络爬虫时&#xff0c;使用优质代理就像是为你的爬虫装上了强劲的发动机&#xff0c;能够大幅提升数据抓取的效率和成功率。然而&#xff0c;选择和使用优质代理并非易事&#xff0c;今天我们就来探讨如何在爬虫中有效使用优质代理。 1. 什…

vue3组件封装系列-表格及分页-第二弹

第二弹来了&#xff0c;不知道有多少人是看过我的第一篇文章的&#xff0c;今天本来是没想更新的&#xff0c;但是现在项目正在验收期准备上线&#xff0c;闲着还不如来发发文。虽然这两天可能会高产&#xff0c;下一次高产就不知道是什么时候了。话不多说&#xff0c;先上图。…

OpenGuass under Ubuntu_22.04 install tutorial

今天开始短学期课程&#xff1a;数据库课程设计。今天9点左右在SL1108开课&#xff0c;听陈老师讲授了本次短学期课程的要求以及任务安排&#xff0c;随后讲解了国产数据库的三层架构的逻辑。配置了大半天才弄好&#xff0c;放一张成功的图片&#xff0c;下面开始记录成功的步骤…

数据融合的超速引擎——SeaTunnel

概览 SeaTunnel是一个由Apache软件基金会孵化的数据集成工具&#xff0c;专为应对大规模数据的快速处理而设计。它以高效的数据处理能力和简洁的架构&#xff0c;帮助企业在数据仓库构建、实时数据处理和数据迁移等场景下&#xff0c;实现数据流的无缝整合。SeaTunnel的设计理…

LDO工作原理与仿真

LDO工作原理与仿真 目录 LDO工作原理与仿真一、LDO内部电路组成1. 基准电压源&#xff08;Reference Voltage Source&#xff09;2. 误差放大器&#xff08;Error Amplifier&#xff09;3. 功率调整元件&#xff08;Power Adjustment Element&#xff09;4. 分压取样电路&#…

用于不平衡分类的 Bagging 和随机森林

用于不平衡分类的 Bagging 和随机森林 Bagging 是一种集成算法&#xff0c;它在训练数据集的不同子集上拟合多个模型&#xff0c;然后结合所有模型的预测。 [随机森林]是 bagging 的扩展&#xff0c;它也会随机选择每个数据样本中使用的特征子集。bagging 和随机森林都已被证…

【Word与WPS如何冻结首行首列及窗口】

1.Word如何冻结首行首列及窗口 microsoft word 中锁定表头是一项实用的功能&#xff0c;可让您在滚动文档时保持表头可见。这在处理大型文档或包含大量数据的表格时非常有用。php小编柚子将为您详细介绍 word 锁定表头位置的方法&#xff0c;帮助您轻松掌握这项实用技巧。 1.…

实体书商城小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;小说分类管理&#xff0c;小说信息管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;小说信息&#xff0c;小说资讯&#xff0…

Qt_两种创建组件的方式-通过图形化-通过代码

文章目录 一、通过图形化的方式&#xff0c;在界面上创建一个控件&#xff0c;显示hello world1.打开UI设计界⾯2.拖拽控件⾄ ui 界⾯窗⼝并修改内容3.构建并运行 二、通过代码的方式&#xff0c;通过编写代码&#xff0c;在界面上创建控件&#xff0c;显示hello world在Widget…

手撕python之基本数据类型以及变量

​​​​​​1.基础概念 python就是将不同的数据划分成了不同的类型 就像我们生活中的数据有数字、字符等数据一样 小知识点&#xff1a; 注释&#xff1a;# 全体注释&#xff1a;AltF3 取消注释&#xff1a;AltF4 2.数值类型 数值类型概括 数值类型分为三种&#xff…

Cesium 展示——动态洪水淹没效果

文章目录 需求分析1. 引入插件2. 定义变量3. 开始绘制3.1 绘制点3.2 绘制线3.3 绘制面3.4 开始分析(第一种)3.5 开始分析(第二种)3.6 方法调用4. 整体代码其他需求 从低处到高处实现洪水淹没效果 分析 本篇文章对方法进行单独抽离,因此支持拿来即用,注意传参就可 1. …

宠物系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商品信息管理&#xff0c;店主管理&#xff0c;猫狗查询管理&#xff0c;猫狗宠物社区&#xff0c;管理员管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&…

宝塔 出现 请使用正确的入口登录面板

目录 前言1. 问题所示2. 原理分析3. 解决方法 前言 记录实战中所有的问题导向、原理分析以及解决方法 1. 问题所示 在登录宝塔的时候&#xff0c;出现如下问题 请使用正确的入口登录面板 错误原因&#xff1a;当前新安装的已经开启了安全入口登录&#xff0c;新装机器都会随…

使用redis模拟cookie-session,例子:实现验证码功能

目录 在前后端分离架构中不建议使用cookie-session机制实现端状态识别 所以我们可以使用redis来模拟session-cookie机制 下面我们通过实现验证码的功能来举例 第一步&#xff1a;了解前端要我们返回的数据变量名字&#xff0c;变量类型 1.封装code,data成一个result类&…