生产者消费者问题-第三十天

发布时间:2024年01月02日

目录

生产者消费者问题?

PV操作题目分析步骤

能否改变相邻P、V操作的顺序?

结论


生产者消费者问题?

进程同步:令各并发进程按要求有序的推进(让本来异步并发的进程互相配合,有序推进)

问题描述:系统中有一组生产者进程和消费者进程,生产者进程每次生产一个产品(某种数据)放入缓冲区,消费者进程每次从缓冲区中取出一个产品(某种数据)并使用

问题分析:

  1. 生产者、消费者共享一个初始为空、大小为n的缓冲区
  2. 只有缓冲区未满时,生产者才产品放入缓冲区,否则必须等待(同步关系)
  3. 只有缓冲区不空时,消费者才能从中取出产品,否则必须等待(同步关系)
  4. 缓冲区是临界资源,各进程必须互斥地访问(互斥关系)

PV操作题目分析步骤

1、关系分析:找出题目中描述的各个进程,分析它们之间的同步、互斥关系

2、整理思路:根据各进程的操作流程确定P、V操作的大致顺序

3、设置信号量:根据题目条件确定信号量初值(互斥信号量mutex初值一般为1,同步信号量的初值要看对应资源的初始值是多少)?

semaphore mutex = 1;   //互斥信号量,实现对缓冲区的互斥访问
semaphore empty = n;   //同步信号量,表示空闲缓冲区的数量
semaphore full = 0;    //同步信号量,表示产品的数量,也即非空缓冲区的数量

4、实现代码

//生产者
procucer()
{
    while(1)
    {
        生产一个产品的代码段;
        P(empty); //消耗一个空闲缓冲区  
        P(mutex); //实现互斥操作
        把产品放入缓冲区的代码段;
        V(mutex); /实现互斥操作
        V(full);  //增加一个产品
    }
}

//消费者
consumer()
{
    while(1)
    {
        P(full); //消耗一个产品(非空缓冲区)  
        P(mutex); //实现互斥操作
        把产品放入缓冲区的代码段;
        V(mutex); /实现互斥操作
        V(full);  //增加一个空闲缓冲区
    }
}

实现互斥是在同一进程中进行一对PV操作,实现两进程同步是在两进程中分别执行PV操作

能否改变相邻P、V操作的顺序?

????????若此时缓冲区内已放满产品(empty=0,full=n,mutex=1),则生产者进程执行①使mutex--为0,再执行②,由于已没有空闲缓冲区,因此生产者被阻塞(忙等)。由于生产者阻塞,因此切换回消费者进程(时间片转换)消费者进程执行③,由于mutex为0,即生产者还没释放对临界资源的“锁”,因此消费者也被阻塞(忙等)

????????这就造成了生产者等待消费者释放空闲缓冲区,而消费者又等待生产者释放临界区的情况,生产者和消费者循环等待被对方唤醒,出现“死锁“,而V操作不会导致进程阻塞,因此两个V操作顺序可以交换但是会引起效率的降低不建议

?对于PV操作的代码内容遗忘的可以查看:http://t.csdnimg.cn/1juXR?

结论

实现互斥的P操作一定要实现同步的P操作之后

生产者消费者问题是一个互斥、同步的综合问题

~over~

文章来源:https://blog.csdn.net/m0_73975164/article/details/135338251
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。