[FreeRTOS 基础知识] 信号量 概念

news2024/9/21 4:26:41

文章目录

    • 信号量定义
    • 信号量特性


信号量定义

信号量是一个抽象的数据类型,通常包含一个整数值以及一个等待该值变为正数的任务列表(也称为等待队列)。信号量的整数值代表了系统中某种资源的可用数量。 在操作系统中信号量用于控制对共享资源访问的同步机制。它最初由荷兰计算机科学家Edsger Dijkstra提出,用于解决并发系统中的互斥和同步问题。
简而言之,信号量是用来表示资源的个数。信号量核心就是个计数值。

假如银行能办理业务的窗口只有5个,这里资源数count 指的就是窗口个数5。
在这里插入图片描述

  • 当窗口没有人办理业务时,count =5 空闲资源;
  • 当窗口一有人办理业务,其他窗口没有人办理时,count = count -1 =4 空闲资源;
  • 以此类推;
  • 当窗口都有人办理时,count =0 ;
  • 当窗口都有人办理的同时,入口还有1个人要办理业务,此时该客户处于等待休眠的状态。count = -1 值为负数表示有一个客户在等待;
  • 以此类推;
  • 当窗口都有人办理的同时,入口有5个人要办理业务,此时这些客户都处于等待休眠的状态。count = -5 值为负数表示有五个客户在等待;
  • 当窗口终于有客户办理完业务离开时,count = count +1 = -4,并且唤醒下一位客户到窗口来办理业务。(这里count = -4表明有4个客户在等待)
  • 以此类推;

我们通过上面的例子,了解到信号量count的整个过程。使用代码表示上面的过程

int count;

void Enter(void)    // 入口函数
{
    if( count > 0 )  // 判断信号量是否大于0
    {
        // 有资源
        count--;     // 信号量-1 
        处理业务    
    }
    else
    {
        // 没有资源
        休眠    
    }
}

void Exit(void)    // 出口函数
{
    if( count >= 0 )  // 判断信号量是否大于0
    {
        // 没有客户等待
        count++;     // 信号量+1 
    }
    else
    {
        // count值为负数,有客户在等待
        唤醒客户
        count++}
}

这里count值为全局变量,所有的函数都可以共享。这时系统运行多个任务都要操作count值,就会出现异常。因此在处理函数中不仅需要休眠和唤醒任务,还需要保护count值。


信号量特性

信号量是一种用于多任务环境中协调任务和同步共享资源访问的机制。以下是信号量的主要特性:
1、原子性(Atomicity):
信号量的操作(P操作和V操作)必须是不可分割的,即在执行过程中不能被其他任务中断。这是通过使用原子操作或中断禁用来保证的。

2、有界性(Boundedness):
计数信号量的值不能无限增长,它必须有一个上限,这个上限通常等于系统中某种资源的总数。这可以防止产生无效的资源请求。

3、限制性(Limitation):
信号量的值不能小于0。如果信号量的值已经为0,任何试图执行P操作的任务都将被阻塞,直到信号量的值变为正数。

4、互斥性(Mutual Exclusion):
信号量可用于确保多个任务不会同时访问同一资源。这是通过二值信号量实现的,其值在0和1之间切换,表示资源是否被占用。

5、同步性(Synchronization):
信号量允许任务之间的协调,使得任务可以按照特定的顺序执行。例如,在生产者-消费者问题中,信号量可以用来同步生产者生产数据和消费者消费数据的速率。

6、优先级继承(Priority Inheritance):
为了防止优先级反转问题,当一个低优先级的任务持有信号量而一个高优先级的任务需要该信号量时,低优先级任务可能会临时继承高优先级任务的优先级。

7、死锁避免(Deadlock Avoidance):
信号量的设计和使用需要考虑到死锁的可能性。死锁发生在两个或多个任务无限期地等待对方释放资源。通过适当的设计,如资源分配图算法,可以避免死锁。

8、资源分配策略(Resource Allocation Strategy):
信号量的实现可能包括特定的资源分配策略,如先进先出(FIFO)或优先级队列,以决定唤醒等待资源的任务的顺序。

9、系统调用(System Call):
信号量操作通常通过系统调用实现,这些调用提供了与操作系统内核交互的接口,允许用户空间的任务执行信号量操作。

10、任务调度(Task Scheduling):
信号量与任务调度紧密相关。当一个任务释放信号量时,操作系统的调度器可能需要决定哪个任务应该获得CPU以继续执行。

11、可重入性(Reentrancy):
信号量机制本身应该是可重入的,即一个任务可以多次请求同一信号量,只要它在每次请求之间正确地释放信号量。

12、错误处理(Error Handling):
信号量操作可能需要错误处理机制,以处理如信号量不存在或资源不可用等异常情况。

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

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

相关文章

【Solr 学习笔记】Solr 源码启动教程

Solr 源码启动教程 本教程记录了如何通过 IDEA 启动并调试 Solr 源码,从 Solr9 开始 Solr 项目已由 ant 方式改成了 gradle 构建方式,本教程将以 Solr 9 为例进行演示,IDE 选择使用 IntelliJ IDEA。 Solr github 地址:https://gi…

技术干货|使用机器学习进行大数据信用评分实战演练

利用数据进行客户分类是当前金融信用风险、电商精准营销等的主流方法。那么,如何实现轻松实现客户分类呢?下面就为您介绍RapidMiner是如何快速实现客户分类的数据处理和可视化的。 例如,我们手上有某银行8000多名客户的贷款还款记录&#xff…

保姆级 | Windows 复古风格终端样式设置

0x00 前言 前段时间有朋友询问我 Windows 终端的样式是如何设置的,我也进行了一些简单的回复。在之前的 Windows 11 版本中,系统提供了一个界面按钮,可以直接将终端样式设置为复古风格。然而,系统更新之后,这个按钮好像…

对比A100和4090:两者的区别以及适用点

自2022年年末英伟达发布4090芯片以来,这款产品凭借着其优异的性能迅速在科技界占据了一席之地。现如今,不论是在游戏体验、内容创作能力方面还是模型精度提升方面,4090都是一个绕不过去的名字。而A100作为早些发布的产品,其优异的…

LLama 3的各种微调:拿我司七月的paper-review数据集微调LLama 3

前言 llama 3出来后,为了通过paper-review的数据集微调3,有以下各种方式 不用任何框架 工具 技术,直接微调原生的llama 3,毕竟也有8k长度了 效果不期望有多高,纯作为baseline通过PI,把llama 3的8K长度扩展…

标准立项 | 温室气体排放核算与报告要求 废油资源化企业

国内由于现有的废油再生企业规模较小,承担社会责任能力不强,在技术创新尤其是需要通过工程基础研究解决关键科技问题的创新积极性不高,由于经济成本的原因,多采用较落后的加工工艺,没有对废油中的特征污染物及毒害组分…

Vue和React总结

数据的更改更为简单,不需要进行逻辑代码的修改,只需要操作数据就能完成相关操作 (5)虚拟dom 不再使用原生的dom操作节点,极大解放dom操作,但具体操作的还是dom不过是换了另一种方式 (6)各种指令;过滤器 v-text主要用来更新textContent,可以等同于JS的text属性。 v-…

browerify介绍和简单实用,github的这个作者运用的太妙了

官方代码仓库:https://github.com/browserify/browserify 在github闲逛的时候,发现了一个很神奇的项目,这个项目的特点就是实用纯vue和js代码实现了直播间消息的获取,获取的方式就是建立websocket连接,然后接收消息&a…

Redis队列自研组件

背景 年初的时候设计实践过一个课题:SpringBootRedis实现不重复消费的队列,并用它开发了一个年夜饭下单和制作的服务。不知道大家还有没有印象。完成这个课题后,我兴致勃勃的把它运用到了项目里面,可谁曾想,运行不久后…

1992-2019年全球实际国内生产总值数据集

国内生产总值(GDP),可以有效评价居民的经济状况和生活水平,在各项研究中都非常常用!然而目前在全球不少国家中,对GDP统计存在着统计方法不当、蓄意操纵的行为,导致官方GDP统计数据难以真正反映出真实的经济发展水平。 …

推荐三款必备软件,个个五星好评,你一定不要错过

WiseCare365 WiseCare365是一款由WiseCleaner推出的综合性Windows系统优化和加速工具。它集成了多种功能,旨在帮助用户清理、优化和维护电脑系统,提升电脑性能和安全性。 WiseCare365的主要功能包括: 系统清理:它可以清理各种缓存…

【多模态】BEIT: BERT Pre-Training of Image Transformers

论文:BEIT: BERT Pre-Training of Image Transformers 链接:https://arxiv.org/pdf/2301.00184 Introduction BEIT(Bidirectional Encoder representation from Image Transformers)Motivation: 启发于BERT的自编码方式&#xf…

【网络协议】精讲TCP通信原理!图解超赞超详细!!!

亲爱的用户,打开微信,搜索公众号:“风云说通信”,即可免费阅读该文章~~ 目录 1. 建立连接 2. 数据传输 3. 断开连接 4. 抓包分析 前言 TCP 把连接作为最基本的对象,每一条 TCP 连接都有两个端点,这种端…

仓库管理系统03--设计登录页面

1、添加登录窗体 2、整体布局UI 1&#xff09;设计三个白底的边框&#xff0c;其中2个旋转角度&#xff0c;形成以下效果 3、设计登录控件 <Window x:Class"West.StoreMgr.Windows.LoginWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presenta…

【ETAS CP AUTOSAR基础软件】DCM模块详解(诊断)

文章包含了AUTOSAR基础软件&#xff08;BSW&#xff09;中DCM模块相关的内容详解。本文从ISO标准&#xff0c;AUTOSAR规范解析&#xff0c;ISOLAR-AB配置以及模块相关代码分析四个维度来帮读者清晰的认识和了解DCM这一基础软件模块。文中涉及的ISOLAR-AB配置以及模块相关代码都…

JetBrains WebStorm 2024 mac/win版:效率至上,编码无忧

JetBrains WebStorm 2024 是一款专为前端开发者和全栈工程师打造的高 级集成开发环境(IDE)。它提供了对JavaScript、TypeScript、HTML5、CSS等技术的全面支持&#xff0c;帮助开发者更高效地进行前端开发。 WebStorm 2023 mac/win版获取 WebStorm 2024 拥有强大的智能代码补全…

SpringBoot+Vue集成富文本编辑器

1.引入 我们常常在各种网页软件中编写文档的时候&#xff0c;常常会有富文本编辑器&#xff0c;就比如csdn写博客的这个页面&#xff0c;包含了富文本编辑器&#xff0c;那么怎么实现呢&#xff1f;下面来详细的介绍&#xff01; 2.安装wangeditor插件 在Vue工程中&#xff0c;…

锐捷统一上网行为管理与审计系统 static_convert.php 前台RCE漏洞复现

0x01 产品简介 锐捷统一上网行为管理与审计RG-UAC系列是星网锐捷网络有限公司自主研发的上网行为管理与审计产品,具备的上网行为日志审计功能,能够全面、准确、细致的审计并记录多种上网行为日志,包括网页、搜索、外发文件、邮件、论坛、IM等等,并对日志数据进行统计分析,…

开发基于Java语言的SaaS(Software-as-a-Service,软件即服务)模式的HIS系统详解 HIS系统源码 支持二开

开发基于Java语言的SaaS&#xff08;Software-as-a-Service&#xff0c;软件即服务&#xff09;模式的HIS系统详解 HIS系统源码 支持二开 开发基于Java语言的SaaS&#xff08;Software-as-a-Service&#xff0c;软件即服务&#xff09;模式的HIS&#xff08;Hospital Informat…

深入探索Jetpack数据绑定(DataBinding)

Jetpack的数据绑定&#xff08;DataBinding&#xff09;库为我们提供了一个强大而灵活的工具&#xff0c;用于将UI组件与数据源绑定在一起。本文将深入探讨数据绑定的高级用法&#xff0c;包括双向绑定、自定义Binding Adapter、使用LiveData和ViewModel&#xff0c;以及如何处…