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

文章目录

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


信号量定义

信号量是一个抽象的数据类型,通常包含一个整数值以及一个等待该值变为正数的任务列表(也称为等待队列)。信号量的整数值代表了系统中某种资源的可用数量。 在操作系统中信号量用于控制对共享资源访问的同步机制。它最初由荷兰计算机科学家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.mzph.cn/diannao/34461.shtml

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

相关文章

提升办公效率的利器—OnlyOffice文档8.1深度体验

目录 1. 前言 2. 安装 3. 基本使用 3.1 文档编辑 3.2 表格处理 3.3 演示文稿 4. 个人评价 5. 总结 1. 前言 在当今信息化时代,办公软件已经成为我们日常工作中不可或缺的工具。无论是撰写文档、处理数据,还是制作演示文稿,办公软件的…

MySQL MVCC详解

目录 前言 MVCC实现原理 UndoLog版本链 ReadView MVCC是否可以解决不可重复读与幻读 隔离级别 READ UNCOMMITTED - 读未提交与脏读 READ COMMITTED - 读已提交与不可重复读 REPEATABLE READ - 可重复读与幻读 SERIALIZABLE - 串行化 小结 前言 为了提高数据库并发能力…

GNSS接收机的工作原理

GNSS接收机的工作原理如下: 信号接收:GNSS接收机通过天线接收来自卫星导航系统的信号,这些信号包含卫星的位置、时间和健康状态等信息。 信号处理:接收的信号首先经过前置放大器放大,然后经过滤波器滤除噪声。接收机会…

邂逅Three.js探秘图形世界之美

可能了解过three.js等大型的3D 图形库同学都知道啊,学习3D技术都需要有图形学、线性代数、webgl等基础知识,以前读书学的线性代数足够扎实的话听这节课也会更容易理解,这是shader课程,希望能帮助你理解着色器,也面向第…

图象去噪1-使用中值滤波与均值滤波

1、中值滤波 使用中值滤波去除图像的异常像素点,使用cv2.cv2.medianBlur(img, 3)表示再图像在中值滤波窗口3*3的范围内,从下到大排序,将当前值替换为排序中值(如下图所示)将56替换为(56,66,90,…

JeecgFlow并行网关概念及案例演示

概念讲解 并行网关能够在一个流程中用于进行并发建模处理,将单条线路拆分成多条路径并行执行,或者将多条路径合并处理。 在一个流程模型中引入并发最直接的网关就是并行网关,它基于进入和外出顺序流,有分支和合并两种行为&#xf…

想拥有一个独一无二的AI人物?Lora炼丹训练模型教程来啦

之前答应过大家放出来的Lora本地训练教程,终于写好啦。 会训练lora,代表着你可以生成属于你的独一无二的角色。 你可以让这个角色在各种不同背景的地方出现,可以让它摆出各种姿势,满足你的无限幻想。 还有的商家,用…

10分钟安装好torch的GPU版本(Windows)

pytorch-gpu 1. 确定cuda版本2. 确定Python版本3 开始下载-cu118-cp383.1 下载cuda3.2 下载torchvision 4.下载好了5.开始安装6. 开始验证 1. 确定cuda版本 nvcc -V 版本为11.8 , 一会下载的版本为cu118 2. 确定Python版本 确定python版本为为3.8,一会下载为cp38 3 …

Java包介绍

今天看jdk文档,顺便写一下java几个包的作用。 java.applet 主要用于创建java applet小应用程序,可以嵌入到网页中能够呈现出特殊的效果,现在基本已经被废弃,很少使用。 java.awt AWT 是Abstract Window ToolKit (抽象窗口工具包…

猫头虎分享已解决Bug: Illegal State Exception: java.lang.IllegalStateException

猫头虎分享已解决Bug: Illegal State Exception: java.lang.IllegalStateException 🐯 摘要 📄 大家好,我是猫头虎,一名专注于后端技术的博主。在日常开发中,我们经常会遇到各种各样的Bug,其中Illegal St…

Python基础教程(二十七):urllib模块

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

ssl证书90天过期?保姆级教程——使用acme.sh实现证书的自动续期

腾讯云相关文档相关参考-有的点不准确 前言 最近https到期了,想着手动更新一下https证书,结果发现证书现在的有效期只有90天,于是想找到一个自动更新证书的工具,发现了acme.sh,但是网上的文章质量参差不齐&#xff0…

数据结构——二分算法

二分查找 1. 在排序数组中查找元素的第一个和最后一个位置 代码实现&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/int binarySearch(int *nums, int numsSize, int target) {int l 0, r numsSize - 1; while (l <…

【面试题】前端 移动端自适应?_前端移动端适配面试题

设备像素比 设备像素比 (DevicePixelRatio) 指的是设备物理像素和逻辑像素的比例 。比如 iPhone6 的 DPR 是2。 设备像素比 物理像素 / 逻辑像素。可通过 window.devicePixelRatio 获取&#xff0c;CSS 媒体查询代码如下 media (-webkit-min-device-pixel-ratio: 3), (min-…

6.折半查找

折半查找 基本思路在有序表中,取中间元素作为比较对象,若给定值与中间元素的要查找的数相等,则查找成功;若给定值小于中间元素的要查找的数,则在中间元素的左半区继续查找;若给定值大于中间元素的要查找的数,则在中间元素的右半区继续查找。不断重复上述查找过 程,直到查找成功…

揭秘循环购:消费即收益,如何助力商家月销百万?

大家好&#xff0c;我是吴军&#xff0c;今天要和大家分享一种颠覆性的商业模式——循环购。你是否听说过“消费1000送2000”这样的促销活动&#xff1f;是不是觉得太不可思议&#xff0c;商家岂不是在“送钱”&#xff1f;别急&#xff0c;让我为你揭开这背后的秘密。 循环购&…

C和C++实现stack的对比

本篇文章&#xff0c;我们将对比C语言和C实现栈的不同来体会C的魅力&#xff01; 1.栈的介绍 栈&#xff08;Stack&#xff09;是一种常见的数据结构&#xff0c;它是一种特殊的线性表&#xff0c;只允许在一端进行数据的插入和删除操作。这一端通常被称为栈顶&#xff08;Top…

路由器ARP和ARP-proxy(华为)

#交换设备 路由器ARP和ARP-proxy(华为) 当一个广播域中的主机想要访问另外一个广播域的主机时&#xff0c;会广播ARP报文&#xff0c;询问目标IP地址所对应的MAC地址&#xff0c;默认情况下&#xff0c;arp记录是设备自动生成的&#xff0c;但是这样会容易受到ARP欺骗攻击&am…

python实训day4

1、查看数据库的版本 2、查看当前用户 3、查看当前数据库 4、计算表达式的结果; 任何一个数据库,无论大小,都首先是一个超级计算器 5、查看当前MySQL环境中所有的数据库; 系统数据库(只能看)和自定义数据库(任何操作) 6、先建数据库 gaoming 7、如果表已经存在,则创建不能成功 …

【ai】tx2 nx: jetson Triton Inference Server 运行YOLOv4

【ai】tx2 nx: jetson Triton Inference Server 部署YOLOv4 部署了服务端。需要对其测试【ai】tx2-nx 查看 jetpack 版本信息及对应的tritonserver【ai】tx2-nx:配置tritonserver2.17.0-jetpack4.6 环境并运行例子C++ Triton YoloV4 client 是基于 r21.05的 服务端的tensort 的…