SylixOS信号量(二进制信号量、 计数型信号量、 互斥信号量(简称互斥量)、 读写信号量)

2023-05-16

 

目录

二进制信号量

互斥信号量

计数器信号量

读写信号量


SylixOS 信号量

多个线程在读写某个共享数据(全局变量等)时必须通过某种方法实现共享数据的互斥访问或者同步访问(例如线程 B 等待线程 A 的结果以继续运行)。其中,信号量是一种最常见的方法。

SylixOS 信号量包括四种类型:

  • 二进制信号量、
  • 计数型信号量、
  • 互斥信号量(简称互斥量)、
  • 读写信号量。

信号量是一种约定机制:在共享资源的互斥访问中,它约定当一个线程获得信号量(Wait)后,其他线程不可以再次获得该信号量直到信号量被释放(Give);在同步机制中,它约定等待信号量(Take)的线程(或者说等待信号更确切)在收到信号量之前应该处于阻塞状态,直到其他线程发送该信号量(Post)。
 

二进制信号量:最快的最常用的信号量,可用于同步或互斥。

互斥信号量:为了解决内在的互斥问题如优先级继承、删除安全和递归等情况而最优化的特殊的二进制信号量。

计数信号量:类似于二进制信号量,但是随信号量释放的次数改变而改变。

关于取值,二进制信号量的取值限定于 FALSE 和 TRUE;而计数型信号量的最小取值为 0,最大取值在创建计数型信号量时决定。

二进制信号量

二进制信号量能够满足任务间的互斥和同步,需要的系统开销最小,因此也称快速信号量。二进制信号量可以看成一个标志,对应资源是可用还是不可用。当一个任务请求一个信号量时,如果此时信号量可用,信号量会被清零,并且任务立即继续执行;如果信号量不可用,任务会被阻塞来等待信号量。

当一个任务释放一个二进制信号量时。如果信号量已经可用,释放信号量不会产生任何影响;如果信号量不可用并且没有任务等待使用该信号量,信号量只是被简单地置为可用;如果信号量不可用并且有一个或多个任务等待该信号量,最高优先级的任务被解阻塞,信号量仍为不可用。

互斥:

当两个以上的任务共享使用同一块内存缓冲区或同一个I/O设备之类的资源时,可能会发生竞争状态。

二进制信号量可以通过对共享资源上锁,实现高效的互斥访问,不象禁止中断或禁止抢占,二进制信号量将互斥仅仅限于对与之联系的资源的访问,并且比禁止中断和禁止抢占提供更精确的互斥粒度。使用时创建用于保护资源的二进制信号量,初始时信号量可用。

当任务需要访问这个资源时,首先取得这个信号量,所有其它想要访问这个资源的任务将被阻塞。当任务完成了对该资源的访问时,释放该信号量,允许其他任务使用该资源。因此所有对一个需要互斥访问资源的操作由semTake ()和semGive ()对一起来实现。

同步:

信号量另一种通常的用法是用于任务间的同步机制。在这种情况下,信号量代表一个任务所等待的条件或事件。最初,信号量是不可用的。一个任务或中断处理程序释放该信号量来通知这个事件的发生。等待该信号量的任务将被阻塞直到事件发生、该信号量可用。一旦被解阻塞,任务就执行恰当的事件处理程序。信号量在任务同步中的应用对于将中断服务程序从冗长的事件处理中解放出来以缩短中断响应时间是很有用的。

互斥信号量

互斥信号量是一种特殊的二进制信号量,互斥信号量用于共享资源需要互斥访问的场合,可以理解为初始值为 TRUE 的带优先级天花板和优先级继承机制(意在解决优先级反转问题)的二进制信号量,只有拥有互斥信号量的线程才有权释放互斥信号量。一般用于解决具有内在的互斥问题:优先级继承、删除安全和对资源的递归访问等情况。

对于一般的操作系统,一般互斥信号量就是二值信号量,但VxWoks中有非同寻常的意义。另外一个典型就是,Linux内核也单独设立了互斥信号量。

  • 优先级继承:

优先级倒置发生在一个高优先级的任务被迫等待一段不确定时间,等待一个低优先级任务完成。优先级继承协议确保拥有资源的任务以阻塞在该资源上的所有任务中优先级最高的任务的优先级执行,直到它释放所拥有的所有信号量,然后该任务返回到正常状态。因此这个“继承的高优先级”任务受到不会被任何中间优先级任务抢占的保护。

  • 删除安全:

另一个互斥问题涉及到任务删除。在一个受信号量保护的临界区,经常需要保护在临界区执行的任务不会被意外地删除。删除一个在临界区执行的任务可能引起意想不到的后果,造成保护资源的信号量不可用,可能导致资源处于破坏状态,也就导致了其他要访问该资源的所有任务无法得到满足。

  • 递归资源访问:

互斥信号量能够被递归地获得。这意味着信号量能够被一个拥有该信号量的任务在该信号量最终被释放之前多次获取。递归对于满足一些子程序即要求能够相互调用但是也要求互斥访问一个资源非常有用。这种情形是可能的,因为系统需要跟踪哪一个任务当前拥有信号量。

计数器信号量

计数器信号量是实现任务同步和互斥的另一种手段,在具体实现上有点差异。计数器信号量除了像二进制信号量那样工作外,还保持对信号量释放次数的跟踪。与二进制信号量不同的时,计数型信号量每次释放,计数器加一;每次获取,计数器减一,当信号量减到0 时,试图获取该信号量的任务被阻塞。

正如二进制信号量,当计数信号量释放时,如果有任务阻塞在该信号量阻塞队列上,那么任务解除阻塞;但是如果信号量释放时,没有任务阻塞在该信号量阻塞队列上,那么计数器加一。

读写信号量

POSIX 读写锁中介绍的情形,当出现多个读者,单个写者的情况时,单纯地使用互斥信号量将极大地减弱多线程操作系统的处理性能。为了满足这种高并发的处理速度问题,SylixOS 引入了读写信号量,它的应用场景类似于 POSIX 读写锁。

SylixOS 读写信号量满足写优先的原则,也就是说,如果已经存在写信号量,则不能再申请读信号量,直到写信号量被释放。但是当已经存在读信号量时,可以再次请求读信号量。这种机制满足了读的高并发性。

 

 

 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SylixOS信号量(二进制信号量、 计数型信号量、 互斥信号量(简称互斥量)、 读写信号量) 的相关文章

  • 解决方案No module named ‘sklearn.utils.linear_assignment_‘

    错误原因 xff1a linear assignment被弃用 xff0c 官方将scipy optimize linear sum assignment代替了sklearn utils linear assignment 方法一 xff1
  • pip使用豆瓣镜像源

    一 镜像源 清华镜像源 https pypi tuna tsinghua edu cn simple 豆瓣镜像源 http pypi douban com simple 阿里镜像源 http mirrors aliyun com pypi
  • 信息熵(ID3)、信息增益(C4.5)、基尼值和基尼指数

    1 信息熵 熵 Entropy 是 混乱 程度的量度 系统越有序 xff0c 熵值越低 xff1b 系统越混乱或者分散 xff0c 熵值越高 信息理论 xff1a 1 从信息的完整性上进行的描述 当系统的有序状态一致时 xff0c 数据越集
  • nvidia-smi 系列命令,查看gpu ,显存信息

    显卡包含gpu xff0c 显存 xff0c gpu不等于显存 nvidia smi 的定义 xff1a 基于 NVIDIA Management Library xff08 NVIDIA 管理库 xff09 xff0c 实现 NVIDIA
  • chown和chmod区别

    一 文件权限结构 ll查看某一个目录会得到一个7字段的列表 第一个字段是文件属性字段 xff08 eg drwxr xr x xff09 xff0c 文件属性字段总共10个字母 xff1a 第一个字符代表文件类型 xff1a xff1a 普
  • git常用命令大全

    目录 1 设置用户签名 2 初始化本地库 3 添加到暂存区 4 删除暂存区文件 xff0c 但是工作区仍存在 5 提交本地库 6 查看日志信息 7 修改文件 8 版本穿梭 参考文献 尚硅谷Git入门到精通全套教程 xff08 涵盖GitHu
  • 安装kalibr踩坑1:Could NOT find GTest (missing: GTEST_LIBRARY GTEST_MAIN_LIBRARY)

    Could NOT find GTest missing GTEST LIBRARY GTEST MAIN LIBRARY 因为GTest虽然安装过 xff0c 但是好像找不到头文件 sudo apt get install libgtes
  • 安装kalibr踩坑2:fatal error: ceres/rotation.h: No such file or directory #include “ceres/rotation.h“

    fatal error ceres rotation h No such file or directory include 34 ceres rotation h 34 ceres没有装好 xff0c 需要重装 xff0c 安装方法如下
  • 嵌入式数据结构以及算法(数据结构篇)

    数据结构可以说是嵌入式开发学习中比较重要的一个部分了 xff0c 而沉迷于基础硬件控制的我到现在才意识到这个东西的重要性可以说是比较迟钝了 xff0c 但是迟钝总比知道也不学来的好 xff08 自我安慰请忽略 xff09 下面总结一下经过几
  • ubuntu18.04安装kalibr疯狂踩坑记录

    1 安装ubuntu18 04对应的ros 我用的是镜像Docker Hub xff0c 该镜像包含vnc和ros docker pull tiryoh ros desktop vnc melodic 2 安装kalibr 1 安装依赖环境
  • CMakeList.txt写法

    ROS 创建并运行一个c 43 43 的demo xyzxyz576的博客 CSDN博客 目录 样例 解释如下 1 确定cmake最低版本需求 2 确定工程名 3 添加需要的库 4 添加需要的头文件 5 确定编译语言 6 设定变量 7 添加
  • 解决WSL2中Vmmem内存占用过大问题

    Vmmem介绍 Vmmem 进程是系统合成的一个虚拟进程 xff0c 用于表示虚拟机消耗的内存和 CPU 资源 换句话说 xff0c 如果您看到 Vmmem 消耗大量内存和 CPU 资源 xff0c 那么这意味着您的虚拟机正在消耗大量内存和
  • gnss、gps、imu、rtk、ins区分及含义

    gnss和gps区别 1 GPS xff08 全球卫星定位系统 xff09 是由美国国防部研制建立的一种具有全方位 全天候 全时段 高精度的卫星导航系统 xff1b 能为全球用户提供低成本 高精度的三维位置 速度和精确定时等导航信息 2 G
  • Windows下启动Docker容器遇到Error invoking remote method ‘docker-start-container‘: Error解决办法

    报错 xff1a Error invoking remote method 39 docker start container 39 Error HTTP code 500 server error Ports are not availa
  • java变量的定义

    JAVA数据类型 对于整型数据 xff0c 通常情况下使用int类型 但是如果表示极大的数据 xff0c 就需要long类型了 xff0c byte和short类型主要用于特定的应用场合 xff0c 例如 xff1a 底层的文件处理或者需要
  • java数据类型转换(强制转换)

    数据类型的转换 xff0c 分为自动转换和强制转换 自动转换是程序在执行过程中 无声 进行的转换 xff0c 不需要提前声明 xff0c 一般是从位数低的类型向位数高的类型转换 xff1b 强制转换则必须在代码中声明 xff0c 转换顺序不
  • 斗鱼直播与熊猫直播竞品分析

    引言 xff1a 目前国内直播平台虽然十分火爆 xff0c 但是直播的市场尚未成熟 xff0c 斗鱼等其他直播平台在利用自己用户的基础一直处在直播平台的主流市场 xff0c 而新晋直播平台开始大肆的宣传和吸引用户 xff0c 最终直播这块市
  • 知乎产品分析|知识社区何去何从

    一 引言 2017 年 2 月 xff0c 知乎月独立用户设备数再次回升 xff0c 相比 1 月上涨了 11 2 xff0c 达到了 1109 万台 1 1 目的 通过对知乎这款产品的分析 xff0c 锻炼自己的思维能力 xff0c 深化
  • 以CSDN为例解释尼尔森十大交互原则

    一 状态可见原则 用户在网页上的任何操作 xff0c 不论是单击 滚动还是按下键盘 xff0c 页面应即时给出反馈 即时 是指 xff0c 页面响应时间小于用户能忍受的等待时间 举例 xff1a CSDN上文章底部都会有一个 喜欢 按钮 x
  • Chapter007-FPGA学习之IIC总线EEPROM读取

    IIC总线是嵌入式领域较为重要的器件间通信总线 xff0c 同样 xff0c FPGA也能通过模块的形式实现IIC的功能 xff0c 其原理和STM32的模拟IIC总线一致 xff0c 就是控制每个时间点的SCL SDA总线电平 IIC总线

随机推荐

  • 游戏化思维——核心驱动力

    游戏是一个令人着迷 xff0c 并且能够让人沉迷于此的东西 xff0c 而游戏之所以如此迷人 xff0c 不但是游戏的制作精良和剧情引人入胜 除此之外还有些其他原因 xff0c 激励人民玩游戏的原因是 xff1a 游戏能够触及到人性的核心驱
  • 从产品设计到用户设计

    从产品设计到用户设计 一说起产品设计 xff0c 人们往往想到两个方面 感官方面 功能方面 感官方面 xff1a 精心设计的产品能够给用户带来赏心悦目的感觉 xff0c 当然极大部分是属于触感方面 xff08 嗅觉和味觉因为局限问题无法在产
  • 十年寒窗,从高考到海盗,人的梦想是不会结束的

    其实这是讲述我是如何想要成为一名海盗的 又是一年高考时 我翻看着手机 xff0c 看着朋友圈里面各种高考热文一篇篇的出现 xff0c 心里难免有些感慨和一些自己的回忆 当年高考时也像现在一样 xff0c 看到了许多这样的文章 xff0c 看
  • 为体验设计——使用第一

    产品设计和用户体验设计有什么不同呢 xff1f 每个产品都是以用户是人类为前提而设计出来的 xff0c 而产品的每一次使用 xff0c 都会产生相应的体验 用户体验设计并完全不等同于产品设计 但是对于一个简单的情况下 xff0c 创建一个良
  • 用户体验和网站

    用户体验对于所有的产品和服务来讲 xff0c 都是至关重要的 现在讨论一种特殊产品的用户体验 xff1a 网站 xff08 这里的 网站 一词包括以内容为主的网站产品和以交互为主的网站应用 xff09 在网站上 xff0c 用户体验比任何一
  • UCOS II两个任务的模板

    芯片lm3s9b92 include lt includes h gt include 34 utils uartstdio h 34 Application tasks 优先级 define TASK2 PRIO 11 define ta
  • UCOSII 信号量和信号量集实例

    代码来自于书本光盘 嵌入式操作系统UCOSII原理及应用 实例1信号量 include 34 includes h 34 define TASK STK SIZE 512 任务堆栈长度 OS STK StartTaskStk TASK ST
  • 正点原子MiniFly V1.2学习笔记一

    之前看过原子哥的FreeRTOS开发手册 xff0c 但是对整个项目 怎么架构还不是很清楚 由于最近工作需要上FreeRTOS xff0c 所以决定通过MiniFly来学习一下FreeRTOS的架构 一 main 函数 int main s
  • 正点原子MiniFly V1.2学习笔记三---atkpRxAnlTask

    第5个任务 解析处理接收到的指令 xTaskCreate atkpRxAnlTask 34 ATKP RX ANL 34 300 NULL 6 NULL 上面第1个任务 xff0c 把串口接收到的数据解包后得到指令 xff0c 然后把指令发
  • 正点原子MiniFly V1.2学习笔记五---sensorsTask

    这里先学习第8个任务sensorsTask xff0c 2 xff0c 3 xff0c 6 xff0c 7任务后面再学 xff0c 先学重要的 xTaskCreate sensorsTask 34 SENSORS 34 450 NULL 4
  • 嵌入式项目管理学习——001重点明确和心态转换

    相信做嵌入式的码哥们在参与一定数量的产品设计和生产之后 xff0c 都会发现一个问题 xff0c 如果没有一个负责的产品经理 xff0c 就会陷入到产品延期 沟通缺失 目标不清晰 需求不明确等等的问题 xff0c 我目前也是达到了这样一个状
  • 正点原子MiniFly V1.2学习笔记六---stabilizerTask

    第9个任务 xff0c 优先级5 xTaskCreate stabilizerTask 34 STABILIZER 34 450 NULL 5 NULL 一 任务函数 使用绝对延时 xff0c 周期执行任务 二 传感器数据是怎么传到这个任务
  • 正点原子MiniFly V1.2学习笔记七---configParamTask

    第6个任务 xff0c 优先级1 xff0c 最低优先级 配置参数任务 xTaskCreate configParamTask 34 CONFIG TASK 34 150 NULL 1 NULL 一 全局参数configParam 1 参数
  • C++码农要读的经典

    刚大四 xff0c 还在忙着找工作 xff0c 读过的书不是很多 xff0c 还有一些好书在读 xff0c 还有一些书将来必读 C语言程序设计 谭浩强版本 这个版本一致被人说误导子弟 xff0c 当然还有很多人推崇 我觉得这本书不是什么好书
  • 解读gazebo_ros_control gazebo_ros

    本篇的目的是想解读gazebo ros control 以及 gazebo ros 因为gazebo本身是独立于ros的 通过教程Intermediate Control plugin 以及教程 Category Write a plugi
  • vtaskstartscheduler(); //开启任务调度语句不执行

    项目场景 xff1a FreeRTOS实时嵌入式操作系统开发 基于stm32 第一章移植代码 问题描述 xff1a 任务调度器执行到vtaskstartscheduler 开启任务调度语句不执行 span class token keywo
  • python3中定义类变量,并使用类函数修改类变量的值

    定义类变量的方式有两种 1 在 init 中定义self elements 其中self elements是类变量名 a是传入Difference类的参数名 xff0c 这里的 init 作用是定义了类变量名 xff0c 将外部参数a传给类
  • printf函数的内涵以及造成的严重内存问题

    问题的引出 xff1a 在某型号的核心网络交换机设备中 xff0c 为调试方便 xff0c 实现了一个把内存内容从终端打印的功能 xff0c 也就是dump memory xff0c 屏幕的左边显示十六进制 xff0c 右边以ASCII形式
  • 关于docker那点事儿——Dockerfile编写

    Dockerfile编写 前言一 Dockerfile创建镜像二 Dockerfile常用指令三 示例1 Dockerfile构建nginx镜像2 Dockerfile构建微服务 四 CMD与ENTRYPOINT比较 前言 Dockerfi
  • SylixOS信号量(二进制信号量、 计数型信号量、 互斥信号量(简称互斥量)、 读写信号量)

    目录 二进制信号量 互斥信号量 计数器信号量 读写信号量 SylixOS 信号量 多个线程在读写某个共享数据 xff08 全局变量等 xff09 时必须通过某种方法实现共享数据的互斥访问或者同步访问 xff08 例如线程 B 等待线程 A