二值信号量和互斥锁到底有什么区别?

2023-05-16

原文链接:https://www.cnblogs.com/codescrew/p/8970514.html

在说明之前我先抛出结论:互斥锁和二值信号量在使用上非常相似,但是互斥锁解决了优先级翻转的问题

 

 

假定我们现在有三个任务,task1,task2,task3,任务优先级task1最高,然后依次降低。我们知道在系统调度的时候当两个任务同时处于就绪态的时候,系统会优先执行优先级高的任务

好了,让我们来看两个案例

优先级翻转分析(使用信号量)


 在例子中,我们使用pend()函数来表示获取信号量,用post()函数来表示释放信号量

如上图所示,过程分下面几步

1.一开始task3开始运行,先获取到信号量

2.task1开始运行尝试去获取信号量失败被阻塞等待task3执行完

3.task3运行过程中,task2被触发,由于其优先级高于task3,task2被运行,浪费了大量时间

4.继续运行task3,运行完后释放信号量

5.task1继续运行

看到这里我们可以得知,本应该优先级最高的task1结果居然是最后开始运行的,这就是优先级反转现象。这明显是不利的。比如如果有安装看门狗,task1在长时间没有得到执行,就会触发看门狗,导致系统的重启。

 

改进分析(使用互斥锁)


  在例子中,我们使用lock()函数来表示获取互斥锁,用unlock()函数来表示释放互斥锁

如上图所示,过程分下面几步

1.一开始task3开始运行,先获取到互斥锁

2.task1开始运行尝试去获取互斥锁失败被阻塞等待task3执行完,但是此时提升task3的优先级,让其优先级跟自己一样

3.task3运行过程中,task2被触发,由于其优先级低于task3(第2步被提升过),task2等待运行

4.继续运行task3,运行完后释放互斥锁

5.task1继续运行

6.task1执行完,执行task2

所以过程跟前面的虽然一样,但是互斥锁多做了一个步骤就是将task3的优先级提升到task1的级别,防止task2中途出来搅局浪费大量时间。

 

生活中的实例类比


 

使用信号量的情况:

领导在台上讲话。场内三个角色,领导,组长,小兵。

小兵先拿起话筒说话,领导要讲话发现没有话筒,就等待小兵讲完。

组长要讲话,由于他比较野蛮,不需要话筒,并制止了小兵说话,自己开始说。

组长讲完,小兵接着讲

小兵讲完,把话筒给领导,领导讲完

 

使用互斥锁的情况:

领导在台上讲话。场内三个角色,领导,组长,小兵。

小兵先拿起话筒说话,领导要讲话发现没有话筒,就等待小兵讲完,并且跟小兵说,现在你就是领导的身份

组长要讲话,但是他发现领导已经赋予了小兵比自己更高的权限,自己没有权力打断,只好作罢

小兵讲完,把话筒给领导,领导讲完

这时候组长才开始讲话

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

二值信号量和互斥锁到底有什么区别? 的相关文章

  • octet和byte

    在看BLE协议时 xff0c 看到了数据包格式的定义 packet format xff0c 定义如下 xff1a Preamble 1 octet Access Address 4 octets PDU 2 to 257 octets C
  • 如何解决SSL/TLS握手过程中失败的错误?

    Fixes for the SSL TLS Handshake Failed error for both internet users and site owners It s time for another technical art
  • 学校人力资源管理系统——逻辑结构设计

    E R 图向关系模型的转换 第一步 把六个实体类型转化成五个模式 xff1a 教职工 职工编号 xff0c 姓名 xff0c 性别 xff0c 出生年份 xff0c 学历 xff0c 民族 xff0c 婚姻状态 xff0c 政治面貌 xff
  • 无线持续攻击(wireless duration attack)

    抓空口包时发现一种奇怪的ack帧 duration位长度是32767us 看到omnipeek将它定义为wireless duration attack 看起来是路由器回复设备的ack 而设备也是发了一个奇怪的pspoll帧 节能位置1 乱
  • .bashrc文件在哪?

    linux的bashrc文件在 home目录下 xff0c 但是是一个隐藏bai文件 xff0c 在文件管理器里面du按Ctrl 43 H即可显示 显示为 bashrc xff0c 前zhi面小点儿表示隐藏文件 xff09 也可以直接利用t
  • Cotex-M内核双堆栈指针MSP和PSP

    MSP和PSP 的含义是Main Stack Pointer 和Process Stack Pointer 在逻辑地址上他们都是R13 xff1b 权威手册上说的很清楚PSP主要是在Handler的模式下使用 xff0c MSP主要在线程模
  • TCP/IP协议栈之LwIP-pbuf

    pbuf结构体就是一个描述协议栈中数据包的数据结构 xff1a Main packet buffer struct struct pbuf next pbuf in singly linked pbuf chain struct pbuf
  • Linux使用wpa_supplicant手动配置连接WiFi

    wpa supplicant是Linux BSD Mac OSX和Windows的WPA的服务 支持WPA和WPA2 IEEE 802 11i RSN xff0c 它适用于台式机 笔记本和嵌入式系统 xff0c Supplicant是在客户
  • 使用python快速将主机字节序转为网络字节序

    1 进入python环境 这里以win10自带的wsl win10子系统为操作环境进入Python命令行 2 引入网络字节序标准库 这里使用Python自带的socket库 3 将待转换的主机数据使用socket htons 或者socke
  • ∏这个是什么符号?

    是各项连乘的运算符号 读大写的 xff08 pai xff09 例如 xff1a i 61 1 xff08 符号下面 xff09 n xff08 符号上面 xff09 ai 符号右面 表示a1 a2 an 符号下面表示右面式子可变参量的下限
  • python获取图片的颜色信息

    span class pun style font family none font size 14px span h1 style font family none font size 24px padding 5px margin 5p
  • Python:TypeError: 'int' object is not callable

    一个函数的部分代码如下 xff1a python view plain copy def loadData len 61 dataSet len trainingSet extend dataSet len 3 4 testSet exte
  • FreeRTOS — 消息队列

    以下内容转载自安富莱电子 xff1a http forum armfly com forum php FreeRTOS 的一个重要的通信机制 消息队列 xff0c 消息队列在实际项目中应用较多 1 消息队列 1 1 消息队列的概念及其作用
  • 学校人力资源管理系统——物理结构设计

    新 建学校人力资源管理系统 数据库 1 创建相关表 1 1 创建部门信息表 部门信息表的创建代码如下 xff0c 部门信息表在SQL中的信息显示如图6 1所示 create table 部门信息表 部门编号 char 6 not null
  • python 安装serial模块

    想用Python来实现对串口的控制 xff0c 写好了脚本 xff0c 现在将这个脚本拿到另外一个电脑上去运行 xff1b 运行时提示错误 xff0c 说是没有安装serial模块 xff0c 于是乎安装 pip install seria
  • Doxygen使用教程(个人总结)

    简介Doxygen 一 xff0e 什么是Doxygen Doxygen 是一个程序的文件产生工具 xff0c 可将程序中的特定批注转换成为说明文件 通常我们在写程序时 xff0c 或多或少都会写上批注 xff0c 但是对于其它人而言 xf
  • STM32F401 I2S(full duplex)全双工示例代码

    USER CODE BEGIN Header 64 file main c 64 brief Main program body This notice applies to any and all portions of this fil
  • 一、认识与学习Linux中的BASH 之 1.1 什么是bash

    1 1 什么是bash 1 1 1 什么是bash bash全称为The Bourne Again shell xff0c 是Bourne Shell的扩展 xff0c 是基于GUN构架发展出来的语言 xff0c 有很灵活和强大的编程接口

随机推荐

  • 阿里云ECS服务器环境搭建(1) —— ubuntu 16.04 图形界面的安装

    阿里云ECS服务器环境搭建 xff08 1 xff09 ubuntu 16 04 图形界面的安装 1 背景 在我们购买阿里云ECS服务器之后 xff0c 默认的系统环境是很干净的 xff0c 我购买的是ubuntu16 04 xff0c 远
  • Python+pandas+每天股票涨了多少

    第一步 xff1a 得到某支股票历年来的交易数据 方法见 xff1a https blog csdn net zwy 0309 article details 108217342 在此 xff0c 我使用以下脚本得到股票 xff08 代码
  • 2021-06-02

    在ROS中仿真模型中添加gps传感器 获取gps传感器模型包为自己的机器人添加gps传感器将gps之中的经度纬度坐标转化为自己地图中的坐标 1 获取gps传感器模型包 link http wiki ros org hector gazebo
  • Dockerfile如何编写(指令详解)

    本文个人博客地址 xff1a https www leafage top posts detail 21525V8AP Dockerfile Dockerfile 描述了组装镜像的步骤 xff0c 其中每条指令都是单独执行的 除了FROM指
  • 关于Home Lab的搭建——硬件选择篇(迷你主机)(一)

    关于Home Lab 这个名词出自哪里 xff0c 我也不清楚 不过 xff0c 可以这样来理解Home Lab xff0c Home Lab是一台作为实验使用的电脑 xff0c 试验的内容多数是关于计算机网络的搭建 系统安装 测试 xff
  • Adaboost基本二分类算法

    最早类型的Adaboost是由Yoav Freund和Robert E Schapire提出的 xff0c 一种用于二分类的boosting集成学习方法 也是李航 统计学习方法 中所介绍的Adaboost 它将一系列弱分类器的线性组合 xf
  • Springboot 项目金蝶中间件AAS-9.0启动报错 javax.persistence.Table.indexes()[Ljavax/persistence/Index 问题解决

    Springboot 项目金蝶中间件AAS 9 0启动报错 java lang NoSuchMethodError javax persistence Table indexes Ljavax persistence Index问题解决方法
  • CMakeLists配置(常用的)

    一 xff1a 最小组成 cmake 最小版本需求 cmake minimum required VERSION 2 8 project 名字 project MyEsp32AllCode 可执行文件生成 add executable PR
  • SLAM学习笔记(四)定位

    原创博客 xff1a http blog csdn net renshengrumenglibing viewmode 61 contents 机器人定位的目的是为了知道 自己在什么地方 xff0c 目前 xff0c 机器人定位的方法可以分
  • SLAM实习岗位面经

    一 地平线 一面主要是在问关于SLAM岗位的技术问题 xff0c 然后还问了一些比较简单的C 43 43 基础知识 其实总体而言 xff0c 面试的问题都比较基础 xff0c 比较考验SLAM基本功 xff0c 如果只知道一些SLAM皮毛的
  • Canal数据库监听

    1 什么是canal canal是用java开发的基于数据库增量日志解析 xff0c 提供增量数据订阅 amp 消费的中间件 目前 xff0c canal主要支持了MySQL的binlog解析 xff0c 解析完成后才利用canal cli
  • linux下安裝mitmproxy 详解傻瓜式文档

    前言 xff1a mitmproxy 就是用于 MITM 的 proxy xff0c MITM 即中间人攻击 xff08 Man in the middle attack xff09 用于中间人攻击的代理首先会向正常的代理一样转发请求 xf
  • ROS学习笔记(2)——ROS架构

    ROS学习笔记 xff08 2 xff09 ROS架构 0 学习来源1 ROS架构2 文件系统级2 1 工作空间 3 计算图级4 ROS开源社区级4 1 发行版 xff08 Distribution xff09 4 2 软件库 xff08
  • STM32_中断

    STM32 中断 一 介绍 1 1解释 打断CPU执行正常的程序 xff0c 转而处理紧急程序 xff0c 然后返回原暂停的程序继续运行 xff0c 就叫中断 1 2作用和意义 作用 xff1a 实时控制 xff1a 在确定时间内对相应事件
  • Oracle创建用户并授权

    很多时候 xff0c 我们不需要用系统原始的sys xff0c sysdba等系统账户 xff0c 需要创建个性化的用户并授权 xff0c 那就需要我们首先登录到dba账户 xff0c 然后通过dba账户进行用户创建并授权 1 用dba权限
  • 【Linux】vim 中批量添加注释

    本期主题 xff1a vim 中批量添加注释博客主页 xff1a 小峰同学分享小编的在Linux中学习到的知识和遇到的问题小编的能力有限 xff0c 出现错误希望大家不吝赐 此文主要介绍两种方法 xff1a 方法一 xff1a 块选择模式
  • 对gazebo启动后黑屏或者没有模型的解决

    1 问题 卡在加载模型界面 xff1b 加载太慢或者黑屏 xff1a 报错信息如下 xff1a 图1 打开界面 xff1a 图2 2 解决办法 直接下载所有模型到用户的根目录下的 gazebo models 下 xff1a 方法1 xff1
  • 【Python与机器学习】5.K-Means聚类

    聚类 xff08 clustering xff09 什么是聚类 聚类属于无监督学习 xff08 unsupervised learning xff09 xff0c 即无类别标记 是数据挖掘经典算法之一 算法接收参数k xff1b 然后将样本
  • 穿过已知点画平滑曲线(3次贝塞尔曲线)

    为了把一串点连成光滑的曲线 xff0c 先研究贝塞尔曲线 xff0c 又搞B样条插值 都没有成功 数学没那么强 后来在 翻译 AGG 之贝塞尔插值 http liyiwen javaeye com blog 705489 看到一种比较好的方
  • 二值信号量和互斥锁到底有什么区别?

    原文链接 xff1a https www cnblogs com codescrew p 8970514 html 在说明之前我先抛出结论 xff1a 互斥锁和二值信号量在使用上非常相似 xff0c 但是互斥锁解决了优先级翻转的问题 假定我