嵌入式基础知识-信号量,PV原语与前趋图
本篇来介绍信号量与PV原语的一些知识,并介绍其在前趋图上的应用分析。本篇的知识属于操作系统部分的通用知识,在嵌入式软件开发中,同样会用到这些知识。
1 信号量
信号量是最早出现的用来解决进程同步与互斥问题的机制(可以把信号量视为一个加锁标志位,实现对临界资源互斥的访问)。
信号量是一个整数:
- 当信号量S>=0时,代表可供并发使用的资源数量
- 当信号量S<0时,代表已经没有可用资源,S的绝对值表示当前等待该资源的进程数
利用信号量可以实现进程的互斥与同步
2 PV原语
2.1 P原语(wait)
P原语(申请资源,相当于wait,阻塞进程)操作的动作是:
- sem减1
- 若sem减1后仍>=0,则执行P操作的进程继续执行
- 若sem减1后<0,则执行P操作的进程被阻塞后进入与该信号相对应的队列中,然后转进程调度
2.2 V原语(signl)
V原语(释放资源,相当于signal,激活进行)操作的动作是:
- sem加1
- 若sem加1后>0,则执行V操作继续执行
- 若sem加1后仍<=0(表明有进程阻塞在该类资源上),则从该信号的等待队列中唤醒一等待进程,然后再返回原进程继续执行或转进程调度
注意:PV操作对于每一个进程来说,都只能进行一次,而且必须成对使用。在PV原语执行期间不允许有中断的发生。

2.3 P、V操作
PV原语的执行顺序:
- 执行P操作,信号量减一
- 然后进行对共享资源的访问
- V操作,信号量加一
PV操作中关于信号量的计算:
某系统有n个进程,共享资源R,R是可用数为m,其中n>=m。若采用PV操作,则信号量S的取值范围是多少?
分析:
- 信号量的最大值,即可用资源的数据,即m
- 信号量的最小值,即最多能阻塞的进程数量,然后取负数,本例中,最大阻塞数为n-m
- 所以,信号量S的取值范围是 -(n-m)~m
3 信号量与PV操作的应用
3.1 实现进程互斥
为使多个进程互斥的访问某临界资源(例如一台打印机):
- 须为该资源设置一个互斥信号量mutex,并设其初值为1
- 然后各进程访问资源的临界区CS置于wait(mutx)和signal(mutex)之间即可
semaphore mtuex = 1; //表示打印机(互斥/共享资源)void process1() //进程1
{//...wait(mutx); //P操作,信号量-1//使用打印机signal(mutex); //V操作,信号量+1//...
}void process2() //进程2
{//...wait(mutx);//P操作,信号量-1//使用打印机signal(mutex);//V操作,信号量+1//...
}
这里简单分析一下
-
只有一台打印机,所以信号量初值是1
-
wait(mutx),即P操作,信号量减1,例如:
- 当第一个进程使用打印机时,信号量减为0,没有进程阻塞
- 当第二个进程也使用打印机时,信号量再减1变为-1,小于0了,说明有进程阻塞(就是第二个进程阻塞)
- 当第三个进程也使用打印机时,信号量再减1变为-2,也小于0了,说明有进程阻塞(就是第三个进程阻塞)
-
signal(mutex),即V操作,信号量加1,例如:
- 当第一个进程使用打印机完毕时,信号量加1变为-1,仍小于0,说明激活一个进程后,仍有进程阻塞(例如第二个进程可以使用打印机了,第三个进程仍在等待)
- 当第二个进程使用打印机完毕时,信号量加1变为0,说明激活一个进程后,没有进程阻塞(第二个进程可以使用打印机了)
- 当第三个进程使用打印机完毕时,信号量加1变为1
3.2 实现前趋关系(前趋图)
这里先简单介绍下前趋图:
前趋图是为了描述一个程序的各部分间的依赖关系,或者是一个大的计算的各个子任务间的因果关系的图示。
前趋图中的每个结点可以表示一条语句、一个程序段或一个进程
结点间的有向边表示两个结点之间存在的偏序(Partial Order)或前趋关系
3.2.1 例子1
进程P1P5的前趋图如下所示,若用PV操作控制进程P1P5并发执行的过程,需要设置5个信号量S1~S5,且信号量的初值都是0。
根据以上描述,下图中的a~e处分别该填什么:

分析,根据文字描述,对照图中信息,可先将P(S1)和P(S3)在图中标注出来,进而可推出信号量S1和S3以及V操作V(S1)和V(S3)。
然后假设P1到P3使用的信号量S3,P3到P5使用的信号量S4,P4到P5使用的信号量S5,即可推导出剩余的PV操作。

3.2.2 例子2
进程P1P6的前趋图如下所示,若用PV操作控制进程P1P6进程同步与互斥的程序如下,则呈现中中的①~⑥处分别该填什么:

分析:根据程序中的描述,对照图中信息,可先将程序中已表示的PV操作标注出来,并标注出①~⑥在图中的位置。
然后假设P1到P2使用的信号量S1,P4到P6使用的信号量S7,P5到P6使用的信号量S8,即可推导出剩余的PV操作

4 总结
本篇介绍了信号量与PV原语的基础知识点,并介绍了PV操作的一些应用,实现进程互斥和实现前趋关系,前趋关系中使用前趋图来实例分析PV操作影响信号量变化的具体运行过程。
相关文章:
嵌入式基础知识-信号量,PV原语与前趋图
本篇来介绍信号量与PV原语的一些知识,并介绍其在前趋图上的应用分析。本篇的知识属于操作系统部分的通用知识,在嵌入式软件开发中,同样会用到这些知识。 1 信号量 信号量是最早出现的用来解决进程同步与互斥问题的机制(可以把信…...
代码遗产:探索祖传代码的历史、挑战与现代融合艺术
✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua,在这里我会分享我的知识和经验。&#x…...
Vue3:用vite创建Vue3项目
一、简介 vite是新一代前端构建工具,官网地址:https://vitejs.cn vite的优势如下: 轻量快速的热重载(HMR),能实现极速的服务启动。对 TypeScript、JSX、CSS 等支持开箱即用。真正的按需编译,不…...
STM32 (2)
1.stm32编程模型 将C语言程序烧录到芯片中会存储在单片机的flsah存储器中,给芯片上电后,Flash中的程序会逐条进入到CPU中去执行,进而CPU去控制各种模块(即外设)去实现各种功能。 2.寄存器和寄存器编程 CPU通过控制其…...
docker部署nginx+反向代理配置/代理宿主机网段服务器
1、安装docker,并运行 2、拉取nginx镜像 docker pull nginx3、运行nginx容器,将文件拷贝至本地,并将nginx容器删除 #运行nginx容器 docker run -id --name mynginx -p 8080:80 nginx#将配置文件从容器内拷贝至本地 docker cp 容器ID:/et…...
初识Hive
官网地址为: Design - Apache Hive - Apache Software Foundation 一、架构 先来看下官网给的图: 图上显示了Hive的主要组件及其与Hadoop的交互。Hive的主要组件有: UI: 用户向系统提交查询和其他操作的用户界面。截至2011年&…...
Google发布Genie硬杠Sora:通过大量无监督视频训练最终生成可交互虚拟世界
前言 Sora 问世才不到两个星期,谷歌的世界模型也来了,能力看似更强大:它生成的虚拟世界自主可控 第一部分 首个基础世界模型Genie 1.1 Genie是什么 Genie是第一个以无监督方式从未标记的互联网视频中训练的生成式交互环境(the first gener…...
全球首台!未磁科技256通道无液氦脑磁图仪及芯片化原子磁力计正式发布
2024年2月3日,由北京未磁科技有限公司牵头的国家重点研发计划诊疗装备与生物医用材料重点专项“新型无液氦脑磁图系统研发”项目2023年度总结会暨2024年推进会顺利召开。会上发布了项目取得的重大成果——全球首台256通道无液氦脑磁图仪Marvel MEG Pro。此项重磅成果…...
openssl3.2 - exp - 内存操作(建立,写入,读取)配置
文章目录 openssl3.2 - exp - 内存操作(建立,写入,读取)配置概述笔记调试细节运行效果测试工程实现main.cppCMyOsslConfig.hCMyOsslConfig.cppEND openssl3.2 - exp - 内存操作(建立,写入,读取)配置 概述 我的应用的配置文件是落地加密的, 无法直接用openssl配置接口载入读取…...
前端食堂技术周刊第 114 期:Interop 2024、TS 5.4 RC、2 月登陆浏览器的新功能、JSR、AI SDK 3.0
美味值:🌟🌟🌟🌟🌟 口味:凉拌鸡架 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 大家好,我是童欧巴。欢迎来到前端食堂技术周刊,我们先来看下…...
#QT(信号与槽)
1.IDE:QTCreator 2.实验:自动添加槽函数,手动添加槽函数 3.记录 (1)自动添加 a.拖拽widget.ui,放置push-button组件,并且自动生成槽函数 b.发现widget.cpp和widget.h中出现添加的槽函数,注意w…...
go 设置滚动日志
方案 通过 log/slog 实现结构化日志生成,这是go1.21中推出的新特性;通过 lumberjack 实现日志文件分割。 示例 package mainimport ("gopkg.in/natefinch/lumberjack.v2""log/slog""os""path/filepath" )fun…...
Rollup入门学习:前端开发的构建利器
在前端开发领域,构建工具对于优化项目结构和提升代码效率扮演着至关重要的角色。Rollup作为一款轻量级且功能强大的JavaScript模块打包器,近年来备受开发者青睐。本文将带你走进Rollup的世界,帮助你快速入门并掌握其核心用法。 一、Rollup简介…...
游戏寻路之A*算法(GUI演示)
一、A*算法介绍 A*算法是一种路径搜索算法,用于在图形网络中找到最短路径。它结合了Dijkstra算法和启发式搜索的思想,通过综合利用已知的最短路径和估计的最短路径来优化搜索过程。在游戏自动寻路得到广泛应用。 二、A*算法的基本思想 在图形网络中选择一个起点和终点。维护…...
软件工程顶会——ICSE '24 论文清单、摘要
1、A Comprehensive Study of Learning-based Android Malware Detectors under Challenging Environments 近年来,学习型Android恶意软件检测器不断增多。这些检测器可以分为三种类型:基于字符串、基于图像和基于图形。它们大多在理想情况下取得了良好的…...
Vue点击复制到剪切板
一、Vue2写法 安装 (官网地址) npm install --save vue-clipboard2 使用 //main.js import VueClipboard from vue-clipboard2 Vue.use(VueClipboard)//页面使用 <button type"button"v-clipboard:copy"message"v-clipboard:su…...
链路负载均衡之DNS透明代理
一、DNS透明代理 一般来说,企业的客户端上都只能配置一个运营商的DNS服务器地址,DNS服务器通常会将域名解析成自己所在ISP内的Web服务器地址,这将导致内网用户的上网流量都集中在一个ISP的链路上转发,最终可能会造成链路拥塞&…...
2024大语言模型LLM基础|语义搜索Semantic_Search全解
目录 语义搜索Semantic_Search代码详解 为甚麽用Pinecone做向量索引?优点是什么? 有哪些常见向量索引方法? Pinecone做向量索引怎么用? 向量索引全解:含原理解析: 语义搜索Semantic_Search代码详解 1…...
vue中使用echarts实现人体动态图
最近一直处于开发大屏的项目,在开发中遇到了一个小知识点,在大屏中如何实现人体动态图。然后看了下echarts官方文档,根据文档中的示例调整出来自己想要的效果。 根据文档上发现 series 中 type 类型设置为 象形柱形图,象形柱图是…...
结构化思维助力Prompt创作:专业化技术讲解和实践案例
结构化思维助力Prompt创作:专业化技术讲解和实践案例 最早接触 Prompt engineering 时, 学到的 Prompt 技巧都是: 你是一个 XX 角色… 你是一个有着 X 年经验的 XX 角色… 你会 XX, 不要 YY.. 对于你不会的东西, 不要瞎说!…对比什么技巧都不用, 直接像使用搜索引…...
技术人的收入结构优化:工资、副业、投资的三支柱模型
在软件测试的世界里,我们熟知一个真理:没有任何单一测试策略能保证系统的绝对健壮。一个高质量的系统,必然建立在单元测试、集成测试、系统测试和验收测试所构成的稳固金字塔上。同样的逻辑,也适用于我们技术人的财务健康。过度依…...
14100开源难题解榜141期:5道前沿技术难题完整收录|后续五期分步保姆级落地开源方案
开源难题解榜141期:5道前沿技术难题完整收录|后续五期分步保姆级落地开源方案 摘要 本文完整原样提取黄大年茶思屋难题解榜第141期全部五道硬核技术原题、技术背景、现存痛点、当前技术成果与详细技术诉求,不作内容删减与修改。本篇定为题目抽…...
手语识别实战:CNN-LSTM混合架构与轻量化部署指南
1. 项目概述:手语识别不是“翻译”,而是构建一座可触摸的沟通桥梁手语识别这件事,我从2019年第一次在残联康复中心做志愿者时就盯上了。当时一位老师傅用双手比划“苹果”“医院”“谢谢”,而旁边的年轻人盯着手机里刚装的某款APP…...
【设计模式 14】责任链:谁来拍板
这一课讲责任链模式。什么在变:处理链路经常调整,审批层级和条件经常变。怎么挡:处理者串成链,每个只决定"签还是传"。那张采购申请单在三个部门之间转了十七天。 十七天。买的东西是一批进口检测设备,总价两…...
Flink架构与集群部署(一)
Apache Flink架构Flink组件栈在Flink的整个软件架构体系中,同样遵循这分层的架构设计理念,在降低系统耦合度的同时,也为上层用户构建Flink应用提供了丰富且友好的接口。上图是Flink基本组件栈,从上图可以看出整个Flink的架构体系可…...
怎么区分储能PACK线源头工厂和中间商?
在储能 PACK 自动化产线行业深耕多年,我见过不少新能源企业踩了中间商的坑。有的客户花了高于市场价两成的预算,拿到的却是套用通用模板的产线,防静电、防爆设计不到位,投产没多久就频繁故障;还有的后期出问题…...
Linux字符设备驱动开发:从内核注册到/dev节点创建的完整实践
1. 项目概述:从零到一,理解Linux内核的“门牌号”管理在Linux的世界里,一切皆文件。这个哲学理念不仅体现在我们熟悉的普通文件上,更深刻地内嵌于设备管理中。当你敲下ls -l /dev命令,看到那些tty、null、random等文件…...
Midscene.js技术深度解析:视觉驱动UI自动化的架构演进与实践路径
Midscene.js技术深度解析:视觉驱动UI自动化的架构演进与实践路径 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 在传统UI自动化测试领域,…...
DOM 基础全面解析
系列文章目录 《JavaScript 基础与进阶笔记》(前期偏基础巩固与常见面试点,后续进入闭包、异步、工程化等进阶主题) 第 01 篇:数据类型与类型判断第 02 篇:变量声明与作用域第 03 篇:闭包与高阶函数第 04…...
Windows Defender彻底移除指南:3步释放30%系统性能的终极方案
Windows Defender彻底移除指南:3步释放30%系统性能的终极方案 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https://gitcode.com/gh_mirr…...
