【操作系统】利用PV操作实现进程同步 考点频率★★★★★下午题必考选择题常考难度⭐⭐⭐⭐建议理解同步信号量初值为0的含义掌握前趋图中P/V操作的填法1️⃣ 回顾互斥与同步的区别上两篇文章我们讲了互斥——多个进程争抢同一个资源用初值为1的信号量实现。互斥解决的问题是“资源能不能用”信号量初值 1一把锁。同步解决的是另一个问题“顺序对不对”——事件A必须先发生事件B才能发生信号量初值 0。为了直观理解两者的区别互斥就像两个人要用同一台打印机谁先拿到谁用另一个人等着同步就像做菜——必须先洗菜才能切菜必须先切菜才能下锅。顺序错了就做不成2️⃣ 同步信号量的初值为什么是0当信号量初值为1时第一个执行P(S)的进程会成功S从1→0这适合互斥场景谁先到谁先用。当信号量初值为0时第一个执行P(S)的进程会被阻塞S从0→-1因为还没有人V(S)释放“许可”。这正好满足同步场景后执行的进程必须先等一等。同步模式的执行逻辑进程A先执行 执行某些操作; V(sync); // 释放信号量通知“我已完成” 进程B后执行 P(sync); // 申请信号量若A还没V则阻塞等待 执行后续操作; // 等待A完成后才能执行执行时序分析如果进程B先运行到P(sync)sync0 → sync变成-1进程B阻塞。直到进程A执行V(sync)sync从-1变0唤醒进程B。如果进程A先运行到V(sync)sync从0变1。后续进程B执行P(sync)时sync从1变0立即通过不需要等待。3️⃣ 同步信号量值的含义sync值含义0前驱操作尚未完成后驱进程若执行P操作会被阻塞1前驱操作已完成后驱进程可以顺利通过P操作-n有n个后驱进程在等待前驱操作完成即多个进程在等同一个条件4️⃣ 示例两进程同步一个简单的前驱关系场景进程P1从键盘读入数据进程P2对数据进行计算。P1必须先完成读入P2才能开始计算。semaphore ready 0; // 同步信号量初值为0 P1输入进程 从键盘读入数据到缓冲区; V(ready); // 通知P2数据准备好了 P2计算进程 P(ready); // 等待P1的V操作 从缓冲区读取数据进行计算;关键点P1的V(ready)和P2的P(ready)必须成对出现。这里的信号量不表示资源的数量而是表示事件是否发生。5️⃣ 常用同步场景缓冲区同步场景生产者往缓冲区放数据消费者从缓冲区取数据。缓冲区只能容纳1个数据。semaphore empty 1; // 空位数量初值1 semaphore full 0; // 已有数据量初值0 生产者 P(empty); // 检查是否有空位没有则等待 把数据放入缓冲区; V(full); // 通知消费者有数据了 消费者 P(full); // 检查是否有数据没有则等待 从缓冲区取出数据; V(empty); // 通知生产者有空位了这个例子同时涉及了两个信号量empty和full。其中empty的初值为1有1个空位full的初值为0还没有数据。两个信号量分别控制生产者和消费者的进度让它们交替执行。6️⃣ 前趋图中的PV操作重点软考下午题常给出一张前趋图有向无环图要求填写信号量的P/V操作。前趋图示例┌───┐ │ S1│ └─┬─┘ │ ┌──┴──┐ │ │ ▼ ▼ ┌───┐ ┌───┐ │S2 │ │S3 │ └─┬─┘ └─┬─┘ │ │ └──┬──┘ │ ▼ ┌───┐ │ S4│ └───┘前趋图转换规则对于每条有向边前驱 → 后继分配一个信号量初值为0前驱进程在最后执行V(signal)后继进程在最开始执行P(signal)代码示例semaphore a12 0; // S1→S2 semaphore a13 0; // S1→S3 semaphore a24 0; // S2→S4 semaphore a34 0; // S3→S4 S1() { 执行S1的代码; V(a12); V(a13); } S2() { P(a12); 执行S2的代码; V(a24); } S3() { P(a13); 执行S3的代码; V(a34); } S4() { P(a24); P(a34); 执行S4的代码; }关键规则S1有两条出边 → 末尾有两个V操作S4有两条入边 → 开头有两个P操作且两个都完成才能执行S47️⃣ 同步与互斥对比表对比项同步前驱关系互斥临界资源信号量初值01P操作含义等待前驱事件完成申请进入临界区V操作含义通知后继“我完成了”释放临界区信号量负数含义等待该事件的后继进程数等待临界区的进程数典型应用前驱图、生产者-消费者多进程访问共享变量/设备8️⃣ 经典例题例题1若有三个进程P1、P2、P3要求执行顺序为P1先执行P2在P1之后执行P3在P2之后执行信号量s1、s2初值为0。下列选项中正确的同步方案是 。A.P1: V(s1) P2: P(s1) V(s2) P3: P(s2)B.P1: P(s1) P2: V(s1) P(s2) P3: V(s2)C.P1: P(s1) V(s2) P2: V(s1) P3: P(s2)D.P1: V(s1) V(s2) P2: P(s1) P3: P(s2)解析顺序P1→P2→P3需要两个信号量s1控制P1→P2s2控制P2→P3。P1完成时V(s1)P2开始时P(s1)、完成时V(s2)P3开始时P(s2)。选A。例题2前趋图中有4个进程P1、P2、P3、P4边为 P1→P2、P1→P3、P2→P4、P3→P4。信号量 a、b、c、d 初值为0其中a表示P1→P2b表示P1→P3c表示P2→P4d表示P3→P4。则以下哪个描述是正确的 。A. P1执行两个P操作P4执行两个V操作B. P1执行两个V操作P4执行两个P操作C. P1执行一个V操作P4执行两个P操作D. P1执行两个V操作P4执行一个P操作解析P1是前驱出边2条执行两个V操作P4是后继入边2条执行两个P操作。选B。9️⃣ 记忆口诀同步信号初值为0P等事件V通知。前驱出边打V后继入边打P。互斥锁用1同步用0两者千万别搞混。 小测验评论区对答案某系统中有4个进程P1、P2、P3、P4前驱关系为P1→P2P1→P3P2→P4P3→P4。若采用PV操作实现同步信号量s1、s2、s3、s4初值均为0其中s1用于P1→P2s2用于P1→P3s3用于P2→P4s4用于P3→P4。则P4的代码中应包含 。A. P(s1), P(s2)B. P(s3), P(s4)C. V(s1), V(s2)D. V(s3), V(s4)本专栏日更2篇点击头像 → 专栏《软考中级高频考点》订阅第一时间接收新内容#软考中级 #软件设计师 #PV操作 #进程同步 #前趋图 #操作系统