首页 > 其他分享 >缓存行Cache Line

缓存行Cache Line

时间:2022-12-06 07:55:05浏览次数:34  
标签:缓存 读取 Cache CacheLine 线程 L3 Line CPU

Cache Line :顾名思义叫做缓存行

缓存行越大,局部空间效率越高,读取时间越慢!

缓存行越小,局部空间效率越低,读取时间越快!

众所周知,计算机将数据从主存读入Cache时,是把要读取数据附近的一部分数据都读取进来,这样一次读取的一组数据就叫做CacheLine,每一级缓存中都能放很多的CacheLine

Mysql里面的存储引擎也是有磁盘预读的效果,比如innodb默认读16kb为一页,多余的数据读出来会保存住,因为下次读取它们的概率会比较大!

多核CPU下 每个CPU可单独处理一个线程,每个核拥有L1、L2、L3 高速缓存Cache,每个核共用L3

以近代CPU的视角来说,三级缓存(包括L1一级缓存、L2二级缓存、L3三级缓存)都是集成在CPU内的缓存,它们的作用都是作为CPU与主内存之间的高速数据缓冲区,L1最靠近CPU核心;L2其次;L3再次。运行速度方面:L1最快、L2次快、L3最慢;容量大小方面:L1最小、L2较大、L3最大。CPU会先在最快的L1中寻找需要的数据,找不到再去找次快的L2,还找不到再去找L3,L3都没有那就只能去内存找了

Volatile可见性

 

 1.x被标记了volatile
 2.两个线程运算时是将缓存中要被运算数所在的整条CacheLine复制到线程自己的存储,并进行运算,运算之后写回缓存
 3.假设线程1修改了x并写回,但是线程2中的x还是未修改的x
 4.由于x被标记了volatile,在线程1写回x缓存时,线程1会通知线程2重新读取缓存中的x
伪共享状态:,当x,y在同一块cacheLine中,两个线程分别修改,会频繁互相通知同步修改x,y的状态,不断读取消耗性能!

多线程会有上面的伪共享问题,但如果x,和y分别在不同的cacheLine中进行修改读取,双方就不会一直发生同步了,因为另一个线程根本就没有这个数据

如何让两个数据处于不同的CacheLine呢?方法就是Cache Line对齐?

第一种方法:在一般的x86环境下一个CacheLine是64字节,也就是8个Long,我们可以把x定义为Long,并同时定义7个没有用的Long变量,这样这8个数就在同一个CacheLine中
之后再定义y,y自然也就在下一个CacheLine中,这就叫CacheLine对齐,这样两线程就不会出现伪共享的现象了
第二种方法:如果在java1.8中的是可以通过给这个变量加注解的方式Contended,使他们都在单独的缓存行中,注:需要增加运行选项才会生效(在VM options中:-XX:RestrictContended)

 本文有部分内容转载详情查阅:https://blog.csdn.net/jiohfgj/article/details/122336293

标签:缓存,读取,Cache,CacheLine,线程,L3,Line,CPU
From: https://www.cnblogs.com/codingFan/p/16954157.html

相关文章

  • System.CommandLine参数Argument
    前两篇说到Command和Option,这篇说说Argument。Argument的用法和Option很像,只是他的构造和属性有些差别,再就是在运行输入时有区别,接下来看看实现。一个参数//创......
  • System.CommandLine参数Argument
    前两篇说到Command和Option,这篇说说Argument。Argument的用法和Option很像,只是他的构造和属性有些差别,再就是在运行输入时有区别,接下来看看实现。一个参数//创......
  • System.CommandLine选项Option
    前一篇简单看了一下CommandLine命令的使用,其实在一个命令行工具中,还有一个重要的点,那就是选项——Option,选项是为命提供参数,就好像C#中方法,Command就像方法,Option就像......
  • 【Linux】Jenkins之Pipeline的使用(五)
    概念是一套运行在Jenkins上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。优势代码:Pipeline......
  • 看看《System.CommandLine》
    记得之前出过几篇.nettool工具的文章,当时的做法是所有工具的语法分析全部自己解释,自己执行,语法的解释占了大部分时间,反而工具的功能被弱化了。其实微软有一个Com......
  • 看看《System.CommandLine》
    记得之前出过几篇.nettool工具的文章,当时的做法是所有工具的语法分析全部自己解释,自己执行,语法的解释占了大部分时间,反而工具的功能被弱化了。其实微软有一个Com......
  • System.CommandLine选项Option
    前一篇简单看了一下CommandLine命令的使用,其实在一个命令行工具中,还有一个重要的点,那就是选项——Option,选项是为命提供参数,就好像C#中方法,Command就像方法,Option就像......
  • react-native 渐变组件 react-native-linear-gradient
    react-native渐变组件react-native-linear-gradient安装linkyarnaddreact-native-linear-gradientreact-nativelinkreact-native-linear-gradientlink......
  • 缓存
    为什么会用到缓存?不同设备的速度不同,磁盘,内存,网络在什么地方用缓存?用户不会修改的:状态的数字与名字的对应,前端缓存地址码->国家,省市区的名字,nginx缓存,key:api+参数,va......
  • 用Java实现分布式缓存(1)——缓存淘汰
    本文代码https://github.com/weloe/Java-Distributed-Cache/tree/main/src/main/java/com/weloe/cache/outstrategyhttps://github.com/weloe/Java-Distributed-Cache/tr......