操作系统——生产者、消费者问题——2.11

继续盘一盘进程互斥中生产者和消费者的问题😎

1.问题描述

有三个对象

  1. 生产者进程
  2. 缓冲区
  3. 消费者进程

规则

  1. 缓冲区为满,挂起生产者进程(同步关系)
  2. 缓冲区为空, 挂起消费者进程 (同步关系)

问题

  1. 存在 多个生产者同时向同一缓冲区的 同一位置写入数据的问题,所以需要互斥的区访问这个同一缓冲区位置 (互斥关系)

2.实现过程

定义三个信号量

semaphore mutext = 1; // 互斥信号量,实现对缓冲区的互斥访问
semaphore empty = n; // 同步信号量,表示空闲缓冲区的数量
semaphore full = 0; // 同步信号量,表示非空闲区缓冲区的数量
producer(){
	while(1){
		生产一个产品;
		P(empty); // 消耗一个 空闲缓冲区
		
		P(mutex);
		把产品放入缓冲区;
		V(mutex);
		
		V(full); // 增加一个产品
	}
}
consumer(){
	while(1){
		P(full); // 消耗一个产品
		
		P(mutex); 
		从缓冲区取出一个产品;
		V(mutex);
		
		V(empty); // 增加一个空闲缓冲区
		使用产品;
	}
}

注意 实现互斥的p操作 一定要在 实现同步的p操作之后,不然会发生 死锁

3.图解

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值