Java多线程学习笔记之二缓存
1、高速缓存
由来:处理器处理能力原因大于主内存(DRAM)访问速率,为了弥补这个差距,引入了高速缓存。
高速缓存是一种存取速率远比主内存大而容量远比主内存小的存储部件,每一个处理器都有其高速缓存。在引入高速缓存之后,处理器执行读、写操作时就不直接操作主内存,而是通过高速缓存执行的。变量名相当于内存地址,变量值相当于相应内存空间中存储的数据。可以理解为,高速缓存为程序中的数据做了一份对应主内存的副本,但高速缓存的存储容量是非常小的,这些数据并不会一直被高速缓存存储。高速缓存在内部结构相当于一个拉链散列表,包含若干个桶,每个桶又包含若干个缓存条目。
缓存条目分为三个部分:Tag、Data Block和Flag。Data Block也叫做缓存行,是高速缓存和主内存之间数据交换的最小单元,用于存储从内存中读取的或者准备写入内存的数据。Tag包含了与缓存行中数据相对应的内存地址的部分信息。Flag用于表示相应缓存行的状态。一个缓存行可以存若干个变量的值。
处理器在执行访问操作时会将相应的内存地址解码为tag、index和offest三部分。index相当于桶编号,用来定位内存地址对应的桶;tag通过与缓存条目的Tag进行比较,定位一个具体的缓存条目;一个缓存条目中存储多个变量,offest是缓存行内的位置偏移,可以定位一个变量在缓存行中存储的起始位置。根据内存地址的解码结果,在高速缓存中找到相应的数据,并且所在缓存条目的Flag表示是有效的,那么这个内存操作就称为缓存命中,否则,则称为缓存未命中。缓存未命中是,处理器会从主内存中加载并存入相应的缓存行中。
处理器一般都具有多个层次的高速缓存,一级缓存、二级缓存、三级缓存等。越靠近处理器的缓存,存取速率越快,容量越小。Linux系统可有通过lscpu查看高速缓存层次。如下图
2、缓存一致性协议
当多处理器操作共享变量时就会存在读脏数据和丢失更新的问题,为了解决这个问题,引入里缓存一致性协议。
MESI(Modified-Exclusive-Shared-Invalid)协议就是一种缓存一致性协议,它实现缓存一致性的思想类似于读写锁,对于同一地址的读操作是并发的,对于同一地址的写操作是独占的。通过一组状态和消息来实现这种控制。
MESI状态:
- Modified(更改过的,M):该状态表示相应缓存行对包含相应内存地址所做的更新结果数据。因为MESI协议中对写操作的地址是独占的,所以同一时刻,多个处理器上的高速缓存中Tag值相同的缓存条目中,只可能有一个缓存条目处于该状态,且该状态缓存条目的数据一定与主内存中数据不一致。
- Exclusive(独占的,E):该状态表示相应缓存行包含相应内存地址所对应的副本数据。该状态的缓存行独占了相应内存地址的副本数据,其余处理器中的高速缓存都将不再保留该数据的有效副本,且此时缓存行中的数据和主内存中包含的数据应该是一致的。
- Shared(共享的,S):该状态表示相应缓存行包含相应内存地址所对应的副本数据。如果一个缓存条目处于该状态,且其他处理器上也存在Tag值与该缓存条目Tag值相同的缓存条目,那么这些缓存条目也一定处于Shared状态。该状态下缓存行中包含的数据与主内存中的数据一致。
- Invalid(无效的,I):该状态表示相应缓存行中不包含任何内存地址对应的有效副本数据。该状态是缓存条目的初始状态。
MESI消息如下表:
消息名 | 消息类型 | 描述 |
Read | 请求 | 通知其他处理器、主内存当前主内存准备读取某个数据。该消息包含待读取数据的内存地址。 |
Read Response | 相应 | 该消息包含被请求读取的数据。该消息可能是主内存提供的,也可能是其他高速缓存提供的。 |
Invalidate | 请求 | 通知其他处理器将其高速缓存中指定内存地址对应的缓存条目的状态设置为I,即删除相应内存地址的副本数据(更改其缓存条目的Flag值) |
Invalidate Acknowledge | 相应 | 接收到Invalidate消息的处理器必须回复该消息,以表示删除了其高速缓存上相应的副本数据。 |
Read Invalidate | 请求 | 该消息是又Read和Invalidate消息组合而成的,用于通知其他处理器当前处理器准备更新一个数据,并请求其他处理器删除其高速缓存中相应的副本数据。接收到该消息的处理器必须回复Read Response和Invalidate Acknowledge消息。 |
Writeback | 请求 |
该消息包含要写入主内存的数据及其相应的内存地址。 |
假设多处理器要对A地址的B数据进行操作,B数据为共享变量。
读操作(简略):
写操作(简略):
3、硬件缓冲区:写缓冲器与无效化队列
MESI协议在解决缓存一致性问题的同时也引入了等待回复MESI消息的延迟问题,为了减少这种延迟,引入了写缓冲器和无效化队列。
写缓冲器:是处理器内部一个容量比高速缓存还要小的高速存储部件,每个处理器都有其写缓冲器,其内部可包含若干条目。一个处理器无法读取另一个处理器的写缓冲器上的内容。
处理器进行写操作时,若缓存条目状态为S,则将写操作相关数据写入写缓冲器中,并发送Invalidate消息。若缓存条目状态为I,则为写未命中,将写操作相关数据写入写缓冲器中,并发送Read Invalidate消息。这样,处理器在将操作相关数据写入写缓冲器就可以认为写操作已完成,即不需等待消息回复就可执行其他指令。而当处理器接收到其他处理器回复的针对同一套缓存条目的所有Invalidate Acknowledge时,会将写缓冲器中相应地址的写操作的结果写入相应的缓存行中,此时写操作相对于本处理器之外的其他处理器而言才算是完成。
无效化队列:处理器在接收到Invalidate消息后,并不删除消息中指定地址的副本数据,而是将消息存入无效化队列后就回复Invalidate Acknowledge消息,减少了写操作处理器的等待时间。
写缓冲器和无效化队列又会带来内存重排序和可见性问题。
转载于:https://www.cnblogs.com/walkAlwaysInCode/p/9728760.html
Java多线程学习笔记之二缓存相关推荐
- java 多线程学习笔记(二) -- IO密集型任务
IO密集型是指对IO操作较多的任务.下面以查询一些股票价格任务为例: YahooFinance.java public class YahooFinance {public static double ...
- java多线程学习笔记。
java多线程学习笔记 线程的优缺点: 多线程的好处: 充分利用多处理核心,提高资源的利用率和吞吐量. 提高接口的响应效率,异步系统工作. 线程的风险: 安全危险(竞争条件):什么坏事都没有发生.在没 ...
- java丐帮_java多线程学习笔记(二)
上一节讲到多线程的创建,两种创建方式一种继承Thread类,一种实现Runnable接口: 常用的多线程函数: currentThread()方法 返回代码段正在被哪个线程调用的信息 i ...
- Java 多线程学习笔记(狂神)
学习视频参考链接:https://www.bilibili.com/video/BV1V4411p7EF?p=27 线程简介 线程的实现(重点) 线程状态 线程同步(重点) 线程通信问题 高级主题(重 ...
- Java多线程学习笔记一
一.关于多线程 Java中的多线程是一个同时执行多个线程的进程.线程是一个轻量级的子进程,是最小的处理单元.线程使用共享内存区域,不分配单独的内存区域以节省内存.Java多线程多用于游戏.动画方面. ...
- Java 多线程学习笔记
概念 进程 正在运行的程序,是系统进行资源分配和调用的独立单位 每一个进程都有它自己的内存空间和系统资源,一个进程包括由操作系统分配的内存空间,包含一个或多个线程 一个进程一直运行,直到所有的非守护线 ...
- java多线程学习笔记--一.多线程的基础知识
需要学习的知识 多线程基础知识讲解 参考索隆和jim的视频,以及自己做的笔记 导读 为了充分利用CPU资源,人们发明了线程和进程 进程 由来:在单核cpu的时期,为了方便操作把一系列的操作的指令写下来 ...
- Java后端学习笔记 -- JavaWeb(二):JavaScript
写在开头:本文是学习Java后端开发的个人笔记,便于自己复习.文章内容引用了尚硅谷的javaweb教学,有兴趣的朋友可以上B站搜索. JavaScript Ⅰ JavaScript介绍 ...
- 【JAVA多线程学习笔记】(1)实现线程的方式 线程生命周期 操作线程的方法
文章目录 两种方式实现线程 继承Thread类 模拟银行叫号的程序 Runnable接口 代码1:(与swing相结合创建gui程序) Thread类的⼏个常⽤⽅法 线程生命周期 操作线程的方法 代码 ...
最新文章
- ​50年来最具影响力的十大编程语言!
- djangorestframework源码分析1:generics中的view执行流程
- WWW 2022 | 弯道超车:基于纯MLP架构的序列推荐模型
- 深度学习(17)TensorFlow高阶操作六: 高阶OP
- Flink的Window
- Django - 模板相关
- 实现Windows直接远程访问Ubuntu桌面和解决VNC连接Ubuntu桌面灰色的问题解决
- Flutter PageView左右滑动切换视图
- 【英语学习】【WOTD】adjudicate 释义/词源/示例
- ubuntu20安装teamview15
- 图书馆管理系统5W1H分析
- virtualbox虚拟机安装win10详细教程
- 成都太升南路骗局揭秘
- android平台获取手机IMSI,IMEI ,序列号,和 手机号的方法
- Cathy推荐Java面试题
- workbench 左侧导航栏消失解决方案
- 最新(2014-09-22)中国IT互联网公司市值排名(单位:亿美元)
- python socket 获取目的ip getsockopt
- C++各种数据类型所占内存大小
- DayThirteen 笔记
热门文章
- 在开发流程中嵌入安全测试
- UITableView——reloadData与reloadSection性能比较
- ubuntu数据库安装配置
- 《看透SpringMVC》第十二章 HandlerMapping
- Java中实现多线程关键词整理
- 上海市国资大数据课题启动仪式暨数据资产技术及金融行业应用沙龙隆重开
- Django WSGI Error:class.__dict__ not accessible in restricted mode
- [COCI 2013/2014 ROUND 3] parovi
- AgentJob--修改操作系统时间对Job的影响
- 学vc,加油站(一)区域渐变