这是我参与18月更文挑战的第24天,活动详情查看:2021最后一次更文挑战
在我们编程过程中例如我们在使用消息队列rabbitmq时可能就会涉及到生产者消费者问题 今天我想从操作系统的角度来分享生产者消费者问题
1. 描述 在系统中有一组生产者进程和一组消费者进程,生产者进程每次生产一个产品放入缓冲区,消费者每次从缓冲区取一个产品使用,(缓冲区没满时生产者才能生产 否则生产者需要等待;当缓冲区不为空时消费者才才能去取产品 否则需要等待,在这个过程中生产者和消费者都可以使用缓冲区但是不能同时使用 只能互斥访问。)
在上述的描述过程中我们要抓住的点是:缓冲区是否为空 以及缓冲区是否满了这两个问题对生产者和消费者会有影响 其次就是使用缓冲区的时间(这也是所谓的同步与互斥的关系)
我们采用PV操作来实现消费者生产者问题
semaphore mutex = 1; //互斥信号量 因为缓冲区只有一个 设置值为1
semaphore empty = n; //假设缓冲区有n个大小 初始化是空的为n
semaphore full = 0; //初始化为0
//生产者 在使用缓冲区之前要判断缓冲区是否满的 若未满就要独占缓冲区
p(empty); //消耗一个缓冲区
p(mutex);
...将产品放入缓冲区
v(mutex);
v(full); //增加一个产品
//消费者 在使用缓冲区前要判断缓冲区是否有产品 有则独占缓冲区
p(full);
p(mutex);
...将产品从缓冲区取出
v(mutex);
v(empty)
现在又一个多生产者多消费者问题,题目:桌子上有一个盘子,每次只能放一个水果,妈妈放苹果,爸爸放橘子,儿子只吃苹果 女儿只吃橘子,根据他们四人的关系写pv操作 其实结合上面生产者消费者问题我们发现 其实问题是一样的 只是生产者变为2个消费者变为两个,而实质没变,就是盘子是否有水果以及盘子有水果儿子女儿如何去取的问题
semaphore mutex = 1; //盘子要互斥使用
semaphore apple = 0;
semapthore orange = 0;
妈妈:
p(mutex);
放一个苹果
v(apple);
儿子:
p(apple);
吃苹果
v(mutex);
//父亲女儿的操作和母亲儿子一样 只是放水果不同