操作系统 day16(生产者-消费者问题、多生产者-消费者问题、吸烟者问题)

2023-12-23 22:33:47

生产者-消费者问题

  1. 分析
    在这里插入图片描述
  • “前V后P”,这里的P可以看作-1,这里的V可以看作+1 。
  • 由于full初值为0,每放进一个临界资源就+1,所以在消费者消费之前,要先看看缓冲区里有没有临界资源,full能不能-1,即先P(full)。在消费者消费之后,就对empty+1,即V(empty)
  • 由于empty的初值为n,每放进一个临界资源就-1,所以在生产者生产之前,要先看看缓冲区里有没有空位,empty能不能-1,即先P(empty) 。在生产者生产之后,就对full+1,即V(full)
  • 互斥信号量的初值一般为1,同步信号量的初值要看对应资源的初值是多少
  1. 代码实现
    在这里插入图片描述
  • 实现互斥是在同一进程中进行一对PV操作。实现同步是在一个进程中执行P,另一个进程中执行V。
  1. 能否改变相邻的P、V操作顺序
    在这里插入图片描述
  • 实现互斥P操作一定要在实现同步的P操作之后,即P(mutex)一定要在另一个P的后面。这是由于P操作会导致阻塞,所以对顺序有要求
  • V操作不会导致阻塞,只会唤醒,所以两个V操作的顺序可以交换
  • 由于临界区的代码要尽可能短,否则会对系统的效能有一定的影响,所以红框中的代码就不放到PV操作之间了

多生产者-消费者问题

  1. 分析
    在这里插入图片描述
  2. 代码实现
    在这里插入图片描述
  3. 注意点:
    在这里插入图片描述
  • 即使不设置专门的互斥变量mutex,也不会出现多个进程同时访问盘子的现象。
  • 原因在于:本题中的缓冲区大小为1,在任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1,因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利进入到临界区
  • 如果缓冲区的大小为2,就会出现数据覆盖的情况,如下:
    在这里插入图片描述
  • 重点:不能从单个进程行为的角度来区分同步关系,这样会生成多个重复的信号量,应该要从“事件”的角度来考虑。
  • 即女儿吃完苹果会导致父亲放入苹果,女儿吃完苹果会导致母亲放入橘子,儿子吃完橘子会导致父亲放入苹果,儿子吃完橘子会导致母亲放入橘子,这样会有四对同步关系,但如果我们这样看:吃完水果导致放入水果,那么就只有一对同步关系,只用设置一个同步信号量,如下:
    在这里插入图片描述

吸烟者问题

  1. 分析
    在这里插入图片描述
    在这里插入图片描述
  2. 实现
    在这里插入图片描述
  • 或者可以设置互斥信号量,并设P(plate) = 1,在生产者处进行多次判断P(plate),也可以实现轮流抽烟的效果,如下:
    在这里插入图片描述

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