信号量原理及其应用

news2024/11/26 22:41:31

一、信号量定义

信号量是一种用于保护临界资源的同步机制。它可以用来控制对共享资源的访问,以避免并发访问导致的数据不一致或竞争条件。信号量的PV操作是原子操作,即不可被中断的操作。
在信号量的操作中,P操作(也称为wait操作)用于申请资源,V操作(也称为signal操作)用于释放资源。P操作会检查信号量的值,如果大于0,则将信号量的值减1,并继续执行;如果等于0,则进入等待状态,直到有其他线程释放资源。V操作会将信号量的值加1,表示资源已经被释放。
当信号量的值为0时,表示该信号量此时不能被申请、被等待了,只有等其他的信号量释放了之后,才能够再次获取。

二、信号量API函数

在UCOSIII中,可以使用信号量API函数来操作信号量。这些函数包括:
1、OS_SEM:定义一个信号量。

OS_SEM    MySem;              //定义一个信号量

2、OS_SEM_CREATE:创建一个信号量。


void  OSSemCreate (
OS_SEM      *p_sem,  //信号量:MySem
CPU_CHAR    *p_name, //信号量名字:自定义
OS_SEM_CTR   cnt,   //信号量的值:自定义
OS_ERR      *p_err     //返回值,记录错误信号
)     

3、OS_SEM_PEND:请求/等待一个信号量,如果信号量的值为0,则任务会进入阻塞状态。

OS_SEM_CTR  OSSemPend (
OS_SEM   *p_sem,        //信号量:MySem
OS_TICK   timeout,     //超时时间,设置为0则一直等待                       		
OS_OPT    opt,          //设置是否阻塞等待这个信号量
CPU_TS   *p_ts,        //记录请求到信号量时的时间(时间戳),为空则不需要时间戳
OS_ERR   *p_err        //返回值,记录错误信号
)

4、OS_SEM_POST:释放/发送一个信号量,告知任务某个事件发生

了,任务取得信号量便被唤醒去执行对应的操作。
OS_SEM_CTR  OSSemPost (
OS_SEM  *p_sem,      //信号量:MySem        
OS_OPT   opt,        //决定发送模式,信号量发送模式有三种
OS_ERR  *p_err
)

信号量发送模式有三种
OS_OPT_POST_1表示只给最高优先级的任务发(等待信号量的优先级最高的)
OS_OPT_POST_ALL表示给所有等待信号量的任务发
OS_OPT_POST_NO_SCHED 表示不任务调度。这个参数可以和上面2个参数位或

三、信号量作用

任务同步

信号量的初值为0,每当任务1发送一次信号量是ctr+1=1,每当任务2请求到一次信号量时ctr-1=0。当ctr=0时,任务2阻塞等待任务1发送信号量,只有任务1发送了信号量时,任务2才会请求到一次信号量,任务2才会执行一次。这样完成任务同步。

//创建一个信号量
	OSSemCreate ((OS_SEM*	)&SYNC_SEM,
                 (CPU_CHAR*	)"SYNC_SEM",
                 (OS_SEM_CTR)0,		
                 (OS_ERR*	)&err);
//任务1的任务函数
void task1_task(void *p_arg)
{
	u8 key;
	OS_ERR err;
	while(1)
	{
		key = KEY_Scan(0);  //扫描按键
		if(key==WKUP_PRES)	
		{
			OSSemPost(&SYNC_SEM,OS_OPT_POST_1,&err);//发送信号量
			LCD_ShowxNum(150,111,SYNC_SEM.Ctr,3,16,0);	//显示信号量值
		}
		OSTimeDlyHMSM(0,0,0,10,OS_OPT_TIME_PERIODIC,&err);   //延时10ms
	}
}

//任务2的任务函数
void task2_task(void *p_arg)
{	
	u8 num;
	OS_ERR err;
	while(1)
	{
//请求信号量
	OSSemPend(&SYNC_SEM,0,OS_OPT_PEND_BLOCKING,0,&err); 		 num++;
		LCD_ShowxNum(150,111,SYNC_SEM.Ctr,3,16,0);					 		LCD_Fill(6,131,233,313,lcd_discolor[num%14]);		//刷屏
		LED1 = ~LED1;
		OSTimeDlyHMSM(0,0,1,0,OS_OPT_TIME_PERIODIC,&err);   //延时1s
	}
}

四、优先级翻转

优先级翻转是在实时系统中使用信号量时可能产生的一个严重的问题。
优先级翻转是当一个高优先级任务通过信号量机制访问共享资源时,该信号量已被一低优先级任务占有,因此造成高优先级任务被许多具有较低优先级任务阻塞,实时性难以得到保证。
优先级翻转在可剥夺内核中是非常常见的,在实时系统中不允许出现这种现象,这样会破坏任务的预期顺序,可能会导致严重的后果,如下历史:
在1997年7月4号火星探路者号(Mars Pathfinder)发射后,在开始搜集气象数据之后没几天,系统(无故)重启了。】 后来,被相关技术人员找到问题根源,就是,这个优先级翻转所导致的。

优先级翻转的例子

在这里插入图片描述

创建 3 个任务 Task1,Task2 和 Task3,优先级分别为 3,2,1。也就是 Task1 的优先级最高。
任务 Task1 和 Task3 互斥访问串口打印 printf,采用二值信号实现互斥访问。
起初 Task3 通过二值信号量正在调用 printf,被任务 Task1 抢占,开始执行任务 Task1,也就是上图的起始位置。
运行过程描述如下:
任务 Task1 运行的过程需要调用函数 printf,发现任务 Task3 正在调用,任务 Task1 会被挂起,等待 Task3 释放函数 printf。
在调度器的作用下,任务 Task3 得到运行,Task3 运行的过程中,由于任务 Task2 就绪,抢占了 Task3的运行。从任务执行的现象上看,任务 Task1 需要等待 Task2 执行完毕才有机会得到执行,正常情况下应该是高优先级任务抢占低优先级任务的执行,这里成了高优先级任务 Task1 等待低优先级任务 Task2 完成。所以这种情况被称之为优先级翻转问题。
任务 Task2 执行完毕后,任务 Task3 恢复执行,Task3 释放互斥资源后,任务 Task1 得到互斥资源,从而可以继续执行。

解决优先级翻转

解决优先级翻转有2种方法:一种被称作优先级继承(priority inheritance);另一种被称作优先级天花板(priority ceilings)。
优先级继承(priority inheritance) :
优先级继承是指将低优先级任务的优先级提升到等待它所占有的资源的最高优先级任务的优先级。当高优先级任务由于等待资源而被阻塞时,此时资源的拥有者的优先级将会临时自动被提升,以使该任务不被其他任务所打断,从而能尽快的使用完共享资源并释放,再恢复该任务原来的优先级别。
优先级天花板(priority ceilings): 优先级天花板是指将申请某资源的任务的优先级提升到可能访问该资源的所有任务中最高优先级任务的优先级。(这个优先级称为该资源的优先级天花板) 。这种方法简单易行, 不必进行复杂的判断, 不管任务是否阻塞了高优先级任务的运行, 只要任务访问共享资源都会提升任务的优先级。

五、互斥信号量(解决优先级翻转)

互斥信号量就是通过优先级继承的方式来解决优先级反转问题的。
低优先级任务 Task1 执行过程中先获得互斥资源执行。此时任务 Task2 抢占了任务 Task1的执行,任务 Task1 被挂起。任务 Task2 得到执行。
任务 Task2 执行过程中也需要调用互斥资源,但是发现任务 Task1 正在访问,此时任务 Task1 的优先级会被提升到与 Task2 同一个优先级,也就是优先级 3,这个就是所谓的优先级继承(Priority inheritance),这样就有效地防止了优先级翻转问题。任务 Task2 被挂起,任务 Task1 有新的优先级继续执行。
任务 Task1 执行完毕并释放互斥资源后,优先级恢复到原来的水平。由于互斥资源可以使用,任务Task2 获得互斥资源后开始执行。

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

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

相关文章

imgaug库指南(四):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的…

AIGC实战——自回归模型(Autoregressive Model)

AIGC实战——自回归模型 0. 前言1. 长短期记忆网络基本原理2. Recipes 数据集3. 处理文本数据3.1 文本与图像数据处理的差异3.2 文本数据处理步骤 4. 构建 LSTM 模型4.1 模型架构4.2 LSTM 计算流程4.3 训练 LSTM 5. LSTM 模型分析小结系列链接 0. 前言 自回归模型 (Autoregres…

基于gamma矫正的照片亮度调整(python和opencv实现)

import cv2 import numpy as npdef adjust_gamma(image, gamma1.0):invGamma 1.0 / gammatable np.array([((i / 255.0) ** invGamma) * 255 for i in np.arange(0, 256)]).astype("uint8")return cv2.LUT(image, table)# 读取图像 original cv2.imread("tes…

使用 SpringSecurity 发送POST请求出现 403

问题场景 在使用 SpringSecurity 时对一些访问权限进行了设置, 在用户请求资源时出现了403错误 , 通过检查代码发现请求权限是开放的, 并且切换成 GET 请求也是可以通过, 换成POST 请求就无法通过。 解决方法 在 SpringSecurity 中关闭 CSRF 因为 前端向后台发送 post 请求…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《考虑分布式资源交易的气电综合能源配网系统出清模型》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主的免费专栏栏目《论文与完整程序》 这个标题涉及到气电综合能源配网系统的出清模型,特别强调了对分布式资源交易的考虑。以下是对标题中关键术语的解读: 气电综合能…

java SSM体育器材租借管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM体育器材租借管理系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要…

Ubuntu不能挂载移动硬盘

我有一个2T 的移动硬盘,分了两个区 不知道为啥突然之间一个分区老无法挂载,万能的重启也无法解决。 经查资料,这种情况一般是在使用时(如看电影或者拷贝文件过程中)将移动硬盘异常拔出再插入时,就提示不能…

MySQL:约束主键唯一键

表的约束:表中一定有约束,通过约束让插入表中的数据是符号预期的 约束的本质是通过技术手段,倒逼程序员插入正确的数据 Null约束 这里的Null表示在插入的时候,该属性能否为空,如果是NO,则插入时候必须有数…

广义双曲分布、KS检验与抄底沪指

上一篇笔记我们抛出一个问题,沪指大跌 4%时,能不能抄底?今天的笔记,我们就通过 KS 检验,找出沪指的概率分布,进而回答这个问题。在后面的笔记中,我们还将换一个方法继续回答这个问题。 K-S 检验…

Xshell 上传文件到服务器

Liunx 上传文件 rz //回车,从本地选择文件上传 ll //查看文件 pwd //查看当前目录 mkdir filename //创建文件如果遇到错误信息“bash: rz: command not found” 安装 lrzsz sudo yum install lrzsz操作 mv //移动文件或目录 tar //解压文件vim //文本编辑器&am…

【技巧】一招让雷电模拟器快如闪电!

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 本教程默认你已经开启了Hyper-V功能了。如果没开启,那卡顿很正常。 1、打开雷电多开器 2、点击左下角设置 3、勾选这几项后保存 该配置只需设置一次,下次自动生效。 4、重新启动模拟器 5、…

Python-CSV文件的存储

CSV文件存储 CSV其文件以纯文本形式存储表格数据。CSV文件是一个字符序列,可以由任意数目的记录组成,各种记录由某种换行符分隔开。它比Excel文件更加简洁,XLS文本是电子表格,包含文本、数值、公式和格式等内容,CSV中则…

Qt中图片旋转缩放操作

在我们开发过程中,难免会遇到加载图片的问题,在上一个开发项目里我就遇到了图片缩放的问题,所以,我决定将这一部分好好研究,记录下来,希望对大家有帮助哟~ 在讲解之前,我们先看一看具体的展示效…

docker 部署来自Hugging Face下机器翻译模型

机器翻译模型(Hugging Face官网) 模型翻译api服务代码 # 离线翻译服务代码 # -*-coding:utf-8-*-import os import json import logging from logging.handlers import RotatingFileHandler from datetime import datetime from flask import Flask, request,jsonify from geve…

【LMM 009】MiniGPT-4:使用 Vicuna 增强视觉语言理解能力的多模态大模型

论文描述:MiniGPT-4: Enhancing Vision-Language Understanding with Advanced Large Language Models 论文作者:Deyao Zhu∗ Jun Chen∗ Xiaoqian Shen Xiang Li Mohamed Elhoseiny 作者单位:King Abdullah University of Science and Techn…

2023-我的CSDN创作之旅

1.博客内容与数量 2023年共发表博客59篇,内容主要集中在GIS,空间分析等领域 主要内容有: networkx学习 Geospatial Data Science Geocomputation ESDA in PySal SHAP Spatial Data Analysis BikeDNA 以下是对这几个章节主要内容的简…

行业模型与场景落地新样本,网易有道发布多款“子曰”教育大模型落地应用与产品

距离2023年7月正式发布教育大模型“子曰”不到半年时间,教育科技公司网易有道近日再次分享了“子曰”教育大模型创新和落地成果,宣布推出国内首个教育大模型“子曰”2.0版本,同时还发布了基于大模型研发的三大创新应用——AI家庭教师“小P老师…

快速、准确地检测和分类病毒序列分析工具 ViralCC的介绍和详细使用方法, 附带应用脚本

介绍 viralcc是一个基因组病毒分析工具,可以用于快速、准确地检测和分类病毒序列。 github:dyxstat/ViralCC: ViralCC: leveraging metagenomic proximity-ligation to retrieve complete viral genomes (github.com) Instruction of reproducing resul…

Gin 项目引入热加载

Gin 项目引入热加载 文章目录 Gin 项目引入热加载一、什么是热加载二、Air2.1 介绍2.2 特性特性:2.3 相关文档2.4 安装推荐使用 install.sh使用 go install 2.5 配置环境变量2.6 使用 三、Fresh3.1 介绍3.2 相关文档3.3 安装与使用 四、bee4.1 介绍4.2 相关文档4.3 …

2024年PMP考试新考纲-【人员领域】真题解析(3)

今天华研荟继续为您分享PMP新考纲下的【人员People领域】近年真题,帮助大家举一反三,一次性通过2024年的PMP考试。 这两天有读者朋友和我探讨,做机构提供的模拟题是否有必要。华研荟的态度是:完全没必要,做模拟题是浪费…