嵌入式基础知识-信号量,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.. 对于你不会的东西, 不要瞎说!…对比什么技巧都不用, 直接像使用搜索引…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Angular微前端架构:Module Federation + ngx-build-plus (Webpack)
以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。 🛠️ 项目结构 angular-mf/ ├── shell-app/ # 主应用&…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...