目录
前言
问题描述
PV操作的应用
含义
需要的准备
生产者消费者的具体过程
结束语
前言
今天是坚持写博客的第14天,也是第二周的最后一天,非常高兴自己可以坚持两周,大概不算三分钟热度吧,也希望可以继续努力,在创作的路上往更远的地方走。
我们今天继续看操作系统当中的常见问题——PV操作之生产者消费者问题。
生产者消费者问题是一个典型的并发问题,用于说明如何在多道程序环境下有效地管理共享资源,防止并发访问导致的数据不一致性或死锁。
问题描述
有一组生产者负责相关的生产,一组消费者负责消耗,二者中间有一块共享区域用来放置数据。用一个简单的例子,张三(生产者)制作(生产)了一个汉堡(数据),放在柜台,李四(消费者)从柜台拿汉堡吃(消费数据),就属于典型的生产者消费者问题。
下图是一个示例:
PV操作的应用
含义
- P操作表示申请资源的操作,用于减少信号量的值。
- V表示释放资源的操作,用于增加信号量的值。
PV操作确保了生产者和消费者之间的正确同步和互斥,有效解决了生产者消费者问题,避免了死锁等问题的出现。
需要的准备
因此我们需要引入几个信号量来解决此问题:
- mutex表示是否一张门票,即是否可以进入。一般初始化值为1。
- empty表示是否有空位,即“柜台”上面还有没有空间给“张三”放“汉堡”。一般初始化值为1或者n(根据题意来看,也可以是2,3……)。表示至少有1个空位。
- full表示是否有产品,表示“张三”有没有放“汉堡”。一般初始化值为0,表示还没放东西。
生产者消费者的具体过程
结合上面的变量,我们可以对生产者消费者问题总结出以下解题思路:
生产者:
- 生产者先进行申请操作,申请空空间P(empty)
- 生产者再进行申请操作,申请一张“门票”P(mutex)
- 生产者生产资源,进行“放汉堡”的操作。
- 生产者释放资源,将“门票归还”V(mutex)
- 生产者再次释放资源,告诉消费者已经“放好汉堡”了,V(full)
消费者:
- 消费者在知道“有汉堡”之后,申请“拿取汉堡”P(full)
- 消费者需要一张门票来“拿汉堡”,P(mutex)
- 消费者消耗资源,进行“拿汉堡”的操作。
- 消费者释放资源,“归还门票”V(mutex)
- 消费者释放空空间,表示已经消费掉了“汉堡”,此时有空位了V(empty)
此时最简单的生产者消费者问题已经解决了,即一个消费者一个生产者。
如果出现两个消费者一个生产者的问题或一个消费者两个生产者甚至两个消费者两个生产者的问题,我们只需要向上述思路添加ifelse进行判断即可,判断具体是哪个消费者或生产者在进行生产或消费的动作。
我们把思路写在纸上,可以下图:
技术总结:由上图我们可以发现,P V操作一一对应,一次P操作必然对应一次V操作,一次申请肯定会有一次释放,一次释放也肯定又一次申请。但是需要注意empty和mutex在申请时不能反过来申请,一定是empty在前mutex在后,否则会造成死锁。
结束语
今天对操作系统中的生产者消费者问题就到这里,希望对大家有所帮助。如果对您有帮助,希望您可以留下点赞或关注,收藏或评论也可,这对我真的很重要,谢谢!