操作系统 day16(生产者-消费者问题、多生产者-消费者问题、吸烟者问题)
2023-12-23 22:33:47
生产者-消费者问题
- 分析
- “前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,同步信号量的初值要看对应资源的初值是多少
- 代码实现
- 实现互斥是在同一进程中进行一对PV操作。实现同步是在一个进程中执行P,另一个进程中执行V。
- 能否改变相邻的P、V操作顺序
- 实现互斥P操作一定要在实现同步的P操作之后,即P(mutex)一定要在另一个P的后面。这是由于P操作会导致阻塞,所以对顺序有要求
- V操作不会导致阻塞,只会唤醒,所以两个V操作的顺序可以交换
- 由于临界区的代码要尽可能短,否则会对系统的效能有一定的影响,所以红框中的代码就不放到PV操作之间了
多生产者-消费者问题
- 分析
- 代码实现
- 注意点:
- 即使不设置专门的互斥变量mutex,也不会出现多个进程同时访问盘子的现象。
- 原因在于:本题中的缓冲区大小为1,在任何时刻,apple、orange、plate三个同步信号量中最多只有一个是1,因此在任何时刻,最多只有一个进程的P操作不会被阻塞,并顺利进入到临界区
- 如果缓冲区的大小为2,就会出现数据覆盖的情况,如下:
- 重点:不能从单个进程行为的角度来区分同步关系,这样会生成多个重复的信号量,应该要从“事件”的角度来考虑。
- 即女儿吃完苹果会导致父亲放入苹果,女儿吃完苹果会导致母亲放入橘子,儿子吃完橘子会导致父亲放入苹果,儿子吃完橘子会导致母亲放入橘子,这样会有四对同步关系,但如果我们这样看:吃完水果导致放入水果,那么就只有一对同步关系,只用设置一个同步信号量,如下:
吸烟者问题
- 分析
- 实现
- 或者可以设置互斥信号量,并设P(plate) = 1,在生产者处进行多次判断P(plate),也可以实现轮流抽烟的效果,如下:
文章来源:https://blog.csdn.net/u011453680/article/details/135168588
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!