【操作系统】经典同步问题:生产者-消费者 考点频率★★★★★PV操作必考经典模型下午题高频难度⭐⭐⭐⭐建议理解 empty 和 full 两个同步信号量的作用掌握 P 操作的顺序1️⃣ 问题描述生产者-消费者问题是操作系统中最经典的同步问题描述如下若干个生产者进程往一个共享缓冲区中生产数据放入产品若干个消费者进程从同一个共享缓冲区中消费数据取出产品缓冲区有大小限制假设容量为 n核心约束缓冲区满时生产者必须等待不能继续放缓冲区空时消费者必须等待不能继续取同一时刻只能有一个进程访问缓冲区互斥这个问题的本质是同步 互斥的组合生产者和消费者之间是同步关系满则等、空则等多个生产者和多个消费者之间是互斥关系同时只能一人操作缓冲区。2️⃣ 信号量设计解决生产者-消费者问题需要三个信号量信号量初值作用emptyn缓冲区容量表示空位的数量。生产者每次放入前 P(empty)消费者每次取出后 V(empty)full0表示已有数据的数量。消费者每次取出前 P(full)生产者每次放入后 V(full)mutex1互斥信号量保证同一时刻只有一个进程操作缓冲区其中empty和full是同步信号量初值0或nmutex是互斥信号量初值1。3️⃣ 代码实现semaphore emptyn;// 空位数量初值为缓冲区大小 nsemaphore full0;// 已有数据数量初值为0semaphore mutex1;// 互斥信号量// 生产者进程Producer(){while(true){// 生产一个产品 itemP(empty);// 检查是否有空位没有则阻塞P(mutex);// 进入临界区// 将 item 放入缓冲区V(mutex);// 离开临界区V(full);// 通知消费者有数据了}}// 消费者进程Consumer(){while(true){P(full);// 检查是否有数据没有则阻塞P(mutex);// 进入临界区// 从缓冲区取出一个数据 itemV(mutex);// 离开临界区V(empty);// 通知生产者有空位了// 消费数据 item}}4️⃣ P操作顺序为什么不能颠倒在上面的代码中生产者先执行P(empty)再执行P(mutex)消费者先执行P(full)再执行P(mutex)。如果把顺序颠倒——先 P(mutex) 再 P(empty) 会怎样假设缓冲区已满empty 0生产者执行P(mutex)→ 成功进入临界区mutex从1→0生产者执行P(empty)→ empty0生产者被阻塞此时没有消费者能进入缓冲区因为 mutex0所有消费者被挡在P(mutex)外面生产者等着消费者来消费消费者却进不来这就是死锁。规则在PV操作中P操作的顺序是先申请“资源信号量”同步再申请“互斥信号量”。V操作的顺序可以反过来。5️⃣ 信号量值的动态变化以缓冲区容量 n3 为例观察信号量变化初始状态empty3, full0, mutex1缓冲区全空操作emptyfull含义初始30全空生产者放入1个21还有2个空位生产者再放1个12还有1个空位生产者再放1个03已满消费者取走1个12又有1个空位当empty0时生产者再执行P(empty)会被阻塞直到消费者取走数据后执行V(empty)唤醒。6️⃣ 多个生产者和多个消费者的情况上面的代码可以支持多个生产者进程和多个消费者进程同时运行生产者与生产者之间也需要互斥吗需要因为多个生产者可能同时往缓冲区放数据会破坏数据结构。mutex保证了生产者之间互斥消费者之间互斥生产者和消费者之间互斥也就是说同一时刻只有一个进程无论是生产者还是消费者在操作缓冲区。7️⃣ 经典例题例题1某系统有一个容量为10的缓冲区用PV操作实现生产者-消费者同步。信号量empty初值为10full初值为0。若当前empty3full7则表示 。A. 缓冲区中有3个数据7个空位B. 缓冲区中有7个数据3个空位C. 缓冲区已满D. 缓冲区为空解析empty表示空位数3full表示已有数据数7。缓冲区容量103710正常状态。选B。例题2在生产者-消费者问题中若将生产者代码中的P(empty)和P(mutex)交换顺序则可能导致 。A. 缓冲区数据丢失B. 死锁C. 消费者饥饿D. 数据不一致解析先 P(mutex) 再 P(empty) 时若缓冲区已满生产者会持有 mutex 锁并阻塞在 empty 上导致消费者无法进入临界区取数据造成死锁。选B。8️⃣ 与单缓冲区的区别对比项单缓冲区容量1多缓冲区容量nempty初值1n生产者等待条件缓冲区有数据时等待缓冲区满时等待消费者等待条件缓冲区空时等待缓冲区空时等待信号量数量2个full, mutex或2个empty, full3个empty, full, mutex9️⃣ 记忆口诀生产消费经典题三个信号量搞定。empty空位full数mutex互斥保唯一。先同步再互斥P操作顺序别颠倒。生产P空V满消费P满V空。 小测验评论区对答案某系统采用PV操作实现生产者-消费者同步缓冲区容量为8。当前信号量值为empty2, full6, mutex1。此时若生产者执行一次P(empty)操作则empty的值变为 。若接着消费者执行一次V(empty)操作则empty的值变为 。A. 1, 2B. 1, 1C. 2, 3D. 0, 1本专栏日更2篇点击头像 → 专栏《软考中级高频考点》订阅第一时间接收新内容#软考中级 #软件设计师 #生产者消费者 #PV操作 #进程同步 #操作系统