资讯动态

操作系统笔记-2.3.5.1.1生产者-消费者问题

发布时间:2026/9/2 17:06:54 来源:尧图企业网站定制
王道操作系统笔记视频链接2.3.5.1.1生产者-消费者问题问题描述问题描述系统中有一组生产者进程和一组消费者进程生产者进程每次生产一个产品放入缓冲区消费者进程每次从缓冲区中取出一个产品并使用。注这里的“产品”理解为某种数据生产者、消费者共享一个初始为空、大小为n的缓冲区。只有缓冲区没满即存在空位置的缓冲区时生产者才能把产品放入缓冲区否则必须等待。缓冲区没满→生产者生产缓冲区满时生产者必须等待只有缓冲区不空即存在有数据的缓冲区时消费者才能从中取出产品否则必须等待。缓冲区没空→消费者消费缓冲区空时消费者必须等待缓冲区是临界资源各进程必须互斥地访问。互斥关系如果不互斥访问可能出现不同生产者进程互相覆盖缓冲区的问题PV操作步骤分析关系分析。找出题目中描述的各个进程分析它们之间的同步、互斥关系。整理思路。根据各进程的操作流程确定P、V操作的大致顺序。设置信号量。并根据题目条件确定信号量初值。互斥信号量初值一般为1同步信号量的初值要看对应资源的初始值是多少缓冲区没空→消费者消费设定信号量full缓冲区没满→生产者生产设定信号量empty互斥信号量设定为mutex代码实现// 信号量声明semaphore mutex1;//互斥信号量实现对缓冲区的互斥访问semaphore emptyn;//同步信号量表示空闲缓冲区的数量semaphore full0;//同步信号量表示产品的数量也即非空缓冲区的数量// 生产者进程producer(){while(1){生产一个产品;P(empty);// 消耗一个空闲缓冲区P(mutex);// 实现互斥是在同一进程中进行一对PV操作把产品放入缓冲区;V(mutex);V(full);// 增加一个产品}}// 消费者进程consumer(){while(1){P(full);// 消耗一个产品非空缓冲区P(mutex);从缓冲区取出一个产品;V(mutex);V(empty);// 增加一个空闲缓冲区使用产品;}}// 实现两进程的同步关系是在其中一个进程中执行P另一进程中执行V// 即代码块中的P(full)和V(full)部分思考能否改变相邻的P操作或者V操作的顺序比如交换P(full)和P(mutex)如下代码所示若此时缓冲区内已经放满产品则 empty0 fulln。则生产者进程执行①使mutex变为0再执行②由于已没有空闲缓冲区因此生产者被阻塞。由于生产者阻塞因此切换回消费者进程。消费者进程执行③由于mutex为0即生产者还没释放对临界资源的“锁”因此消费者也被阻塞。这就造成了生产者等待消费者释放空闲缓冲区而消费者又等待生产者释放临界区的情况生产者和消费者循环等待被对方唤醒出现“死锁”。同样的若缓冲区中没有产品即full0emptyn按③④①的顺序执行就会发生死锁。因此实现互斥的P操作一定要在实现同步的P操作之后。其实就是可能导致应该后实现的进程占据了互斥锁但是又需要等待应该先实现的进程但是先实现的进程拿不到互斥锁也就运行不了。V操作不会导致进程阻塞因此两个V操作顺序可以交换。代码producer(){while(1){生产一个产品;P(mutex);// ①P(empty);// ②把产品放入缓冲区;V(mutex);V(full);}}consumer(){while(1){P(mutex);// ③P(full);// ④从缓冲区取出一个产品;V(mutex);V(empty);使用产品;}}生产产品和使用产品的代码是否可以放到PV操作之间逻辑上可以但是会让临界区代码变长进程对临界区上锁的时间也会增长这不利于各个进程交替使用临界区资源所以不建议这么做临界区的代码需要尽可能短。知识回顾与重要考点生产者消费者问题是一个互斥、同步的综合问题。对于初学者来说最难的是发现题目中隐含的两对同步关系。有时候是消费者需要等待生产者生产有时候是生产者要等待消费者消费这是两个不同的“一前一后问题”因此也需要设置两个同步信号量。易错点实现互斥和实现同步的两个P操作的先后顺序死锁问题图

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价