IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> PV操作的本质:以生产者—消费者问题为例 -> 正文阅读

[Java知识库]PV操作的本质:以生产者—消费者问题为例

1.对于问题的描述:

  1. 系统中有一组生产者进程和一组消费者进程
  2. 生产者和消费者共享一个初始为空、大小为n的缓存区
  3. 生产者进程每次生产一个进程放入缓存区,消费者进程每次从缓存区取出一个进程并使用
  4. 只有缓存区没满时,生产者才可以把产品放入缓存区,否则必须等待
  5. 只有缓冲区不空时,消费者才可以从缓冲区取出产品,否则必须等待
  6. 缓冲区是临界资源,各进程必须互斥的访问

2.对于问题的解释(不抽象的说法):

我们可以把生产者—消费者问题创造成一个模型:厂家——超市——客户:

  1. 厂家每次只能生产一个产品,并且需要立刻送到超市,并且占用超市的一个空间,当超市的空间被占满时,厂家无法再生产产品,并且只能等待客户购买产品之后再生产产品。
  2. 超市的空间是有限的,厂家每送来一个产品,都需要占用超市的一个空间。
  3. 客户只能在超市有产品时购买产品,不然需要等待厂家生产并运输产品到超市。
  4. 超市只有一个通道,厂家和客户不能同时对超市进行操作。

3.对于上述模型中信号量的引入:

  1. 厂家就是问题中的生产者(producer),超市是缓存区(buffer),客户是消费者(consumer)
  2. 问题中,缓存区的大小为n,可以设置如下信号量:
    somaphore empty = n //表示超市(缓存区)的空间为n;
    somaphore full = 0 //表示超市目前的产品数量为0;
  3. 针对超市的一个通道,即厂家和客户不能同时操作,引入信号量mutex(互斥信号量),当互斥信号量为0时,无法操作,需要等待信号量被释放为1
    somaphore mutex = 1

4.PV操作的含义:

1. P操作可以理解为,使用掉请求的一个资源,如: P(empty) = empty-1
2. V操作可以理解为,释放(增加)请求的一个资源,如:V(empty) = empty+1

3. 有时也会使用 wait() 和 signal() ,在实际作用上分别等价于 P() 和 V()

5.生产者——消费者问题PV操作的实现:

对于生产者来说:

他需要先向超市请求一个位置,P(empty)
发现超市有空位并且被他消耗掉之后,再向超市请求使用通道操作,P(mutex)
将产品放入超市之后
让出通道,告诉超市自己操作完了,V(mutex)
超市的产品数+1,V(full)

producer(){
	while(1){
		P(empty);
		P(mutex);
		//把产品放入buffer
		V(mutex);
		V(full);
	}
}

对于消费者来说:

他需要先向超市请求一个产品,P(full)
发现超市有产品,自己要过去使用,向超市请求使用通道,P(mutex)
使用完之后
让出通道,V(mutex)
使用了超市的一个产品,那么超市的空间+1,V(empty)

consumer(){
	while(1){
		P(full);
		P(mutex);
		//把产品从buffer拿出来
		V(mutex);
		V(empty);
	}
}

在这里插入图片描述

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-20 22:54:28  更:2022-06-20 22:56:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:06:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码