当前位置: 首页 > news >正文

【操作系统】前趋图与PV操作(结合前趋图解题)

考点频率:★★★★★(下午题必考,选择题常考)
难度:⭐⭐⭐⭐
建议:掌握前趋图与PV操作的互转规则,这是下午题信号量填空的核心技能

1️⃣ 什么是前趋图?

前趋图是一个有向无环图(DAG),用于描述多个进程或程序段之间的执行顺序依赖关系

  • 节点:表示一个进程或程序段(用P1, P2, ...S1, S2, ...表示)
  • 有向边Pi → Pj表示Pi必须在Pj之前执行(PiPj的前驱)

生活类比:前趋图就像菜谱里的步骤依赖图——必须“先洗菜才能切菜,先切菜才能下锅”。每条有向边都代表一个“必须等上一步完成”的约束。

2️⃣ 前趋图与PV操作的关系

前趋图描述的是同步关系(谁先谁后),而PV操作是实现同步的工具。软考下午题的经典考法:

  • 给前趋图,补全PV操作代码中的信号量
  • 给PV操作代码,画出对应的前趋图

两者的转换有一套固定的规则:

转换规则:入边 → P,出边 → V

对于每个节点(进程/程序段):

规则说明
入边 → P操作有几条入边,开头就放几个P(信号量)(按顺序等待所有前驱)
出边 → V操作有几条出边,末尾就放几个V(信号量)(逐个通知所有后继)

3️⃣ 完整转换示例

给定前趋图

┌───┐ │ S1│ └─┬─┘ │ ┌────┴────┐ │ │ ▼ ▼ ┌───┐ ┌───┐ │S2 │ │S3 │ └─┬─┘ └─┬─┘ │ │ └────┬────┘ │ ▼ ┌───┐ │ S4│ └───┘

转换步骤

第1步:识别所有边,为每条边分配一个信号量

信号量名
S1 → S2a
S1 → S3b
S2 → S4c
S3 → S4d

所有信号量初值均为0(同步信号量)。

第2步:对每个节点,按“入边P、出边V”规则生成代码

节点入边数量出边数量需要写的PV操作
S102(→S2, →S3)末尾写V(a); V(b)
S21(S1→S2)1(S2→S4)开头P(a);末尾V(c)
S31(S1→S3)1(S3→S4)开头P(b);末尾V(d)
S42(S2→S4, S3→S4)0开头P(c); P(d)

第3步:写完整的代码框架

semaphore a=0;// S1→S2semaphore b=0;// S1→S3semaphore c=0;// S2→S4semaphore d=0;// S3→S4S1(){// S1的代码V(a);// 通知S2V(b);// 通知S3}S2(){P(a);// 等待S1完成// S2的代码V(c);// 通知S4}S3(){P(b);// 等待S1完成// S3的代码V(d);// 通知S4}S4(){P(c);// 等待S2完成P(d);// 等待S3完成// S4的代码}

4️⃣ 反过来:由PV操作画前趋图

如果题目给你PV操作代码,让你画前趋图,按以下步骤反推:

  1. 找出所有信号量:统计出现了哪些信号量,注意初值是否为0(同步信号量)或1(互斥信号量)。同步信号量(初值为0)才是用来表示前趋关系的。
  2. 确定边的方向:对每个同步信号量s,找到V(s)所在的位置和P(s)所在的位置:
    • 画一条从V(s)所在的节点 →P(s)所在的节点的有向边
  3. 确认节点:列出所有执行单元(函数/进程),按边画图。

示例:已知代码中有一个同步信号量s(初值0),S1中执行V(s)S2中执行P(s)→ 画出S1 → S2

5️⃣ 考试中的常见陷阱

陷阱正确做法
漏掉信号量初始化每个边对应的信号量必须初值 = 0(同步信号量)
P操作个数不匹配入边数量 = P操作数量,必须相等
V操作个数不匹配出边数量 = V操作数量,必须相等
把互斥信号量(初值1)混入前趋图前趋图中只涉及同步信号量(初值0);互斥信号量是另外加的
忘记写P操作的顺序一个节点有多个P操作时,顺序一般不重要(因为要全部完成才能继续),但应写全。前趋图中若某节点有多个前驱,必须所有P都通过才能执行,注意审题看信号量是“与”关系还是“或”关系。

6️⃣ 经典例题

例题1:某系统有3个进程P1、P2、P3,前趋关系为 P1→P2,P2→P3。信号量s1s2初值为0,补全代码:

P1() { // 代码 (1) ; // 空处填什么? } P2() { (2) ; // 代码 (3) ; } P3() { (4) ; // 代码 }

:边为 P1→P2 和 P2→P3。对应关系为:P1的V通知P2,P2先P后V通知P3。按规则填入即可。

答案

  • (1)V(s1)
  • (2)P(s1)
  • (3)V(s2)
  • (4)P(s2)

例题2(稍复杂):前趋图有4个节点S1、S2、S3、S4,边为:S1→S2,S1→S3,S2→S4,S3→S4。信号量 a,b,c,d 对应4条边,初值均为0。则S4中应写( )。

A.P(a); P(b)
B.P(c); P(d)
C.V(c); V(d)
D.V(a); V(b)

解析:S4的入边是 S2→S4 和 S3→S4,对应的信号量是 c 和 d。入边对应P操作,所以 S4 开头写P(c); P(d)。选B

7️⃣ 记忆口诀

前趋图有向无环,入边P来出边V。
每条边对应一信号,初值全部设为0。
V在末尾P在头,顺序执行靠它走。

8️⃣ 小测验(评论区对答案)

某系统有4个进程P1、P2、P3、P4,前趋图如下:P1→P2,P1→P3,P2→P4,P3→P4。信号量 s1、s2、s3、s4 分别对应4条边,初值均为0。则 P4 中需要写几个 P 操作?分别对应哪些信号量?

🔔本专栏日更2篇,点击头像 → 专栏《软考中级高频考点》订阅,第一时间接收新内容

#软考中级 #软件设计师 #前趋图 #PV操作 #进程同步 #操作系统

http://www.jsqmd.com/news/1088640/

相关文章:

  • Unlimiformer:突破Transformer长文本处理瓶颈的动态注意力机制
  • 软件工程核心实践:从面向对象到测试维护的实战解析
  • 在 Azure AI Search 中查询同一组关键词时,经常会遇到一个现象:searchMode=any 返回很多结果,改成 searchMode=all 后结果数量明显下降,甚至只剩很少几条。
  • AI助力关键词管理的SEO优化新思路
  • 纯JavaScript实现RSA加密库:从大数运算到PKCS#1填充
  • Early Stopping原理与实战:避免过拟合的关键训练干预机制
  • Claude Code Security:AI驱动的代码审计与漏洞挖掘实战指南
  • BetterNCM Installer:5分钟掌握Windows网易云插件自动化安装的终极方案
  • N_m3u8DL-RE:三个场景告诉你为什么需要现代流媒体下载工具
  • Gemini Study Notebooks 是什么:Google 把 AI 学习笔记做成了什么样
  • 终极指南:如何使用VMPDump高效破解VMProtect 3.x保护 - 完整动态脱壳教程
  • 大漠插件实战入门:从零到一的自动化脚本插件注册指南
  • 软考补贴申领全流程拆解(从报名到打款仅需17天!):含人社局内部审核逻辑与材料预审自查表
  • 5分钟快速上手:让Switch手柄在PC上完美工作的BetterJoy终极指南
  • 终极Wallpaper Engine资源提取解决方案:RePKG完全指南
  • 如何免费解锁网易云加密音乐:NCMDump终极转换指南
  • Java流程引擎CompileFlow测试实战:从单元到性能的完整方案
  • Red Panda Dev-C++:零配置的现代化C++开发环境终极指南
  • ROS软路由安全加固:从默认漏洞到进阶防护的5大实战要点
  • 基于双层优化的微电网系统规划设计方法(Matlab代码实现)
  • 如何用TlbbGmTool轻松管理游戏数据?这个强力工具让你告别繁琐操作
  • CCC数字钥匙的UWB PHY:从IEEE标准到汽车场景的定制化实现
  • 基于HarmonyOS 7.0 跨端开发的读书金句收藏页面实战
  • 嵌入式音视频技术深度解析:从比特到像素的硬核之旅
  • 路径遍历漏洞攻防实战:从原理到多层次防御体系构建
  • 5分钟掌握Ofd2Pdf:轻松解决OFD文件转换难题
  • 瑞萨RX MCU FAT文件系统开发实战:TFAT模块集成与优化指南
  • Web安全实战:40个漏洞挖掘清单与零信任攻防思维
  • 从星形到三角形:永磁同步电机FOC控制中SVPWM扇区判断与矢量合成的关键差异
  • ESP-Drone完全指南:如何快速搭建基于ESP32的开源无人机项目