【JMM内存模型-4】JMM内存模型之CPU缓存策略

简介: 【JMM内存模型-4】JMM内存模型之CPU缓存策略

CPU缓存策略原理

缓存概述

CPU为了提升执行效率,减少CPU与内存的交互(交互影响CPU效率),一般在CPU上集成了多级缓存架构

cpu缓存策略图

image-befe0fe78f34497ca8d0883a0097c939.png

cpu读取数据时, 会先从自己的寄存器当中读取.如果没有再从Cache当中读取数据.如果Cache当中也没能.再从内存当中获取.然后再依次缓存

多核CPU结构图

image-41ad077489cd4cc382685eed9fd2489d.png

三级缓存

L1 Cache
 分为数据缓存和指令缓存,逻辑核独占
  CPU所有操作的数据全部在寄存器当中完成
 寄存器比L1要快
 离CPU内核最近
 内核独享
 L1一种存指令,一种存数据
L2 Cache
 内核独享
L3 Cache
 所有内核共享

缓存读取时间

Registers(寄存器组)   `<1ns`
L1 cache (一级缓存)   `约1ns`
L2 cache(二级缓存)  `约3ns`
L3cache(三级缓存)   `约15ns`
主内存(最终存储地址) `约80ns`

缓存行Cache Line概念

1. 缓存是由最小的存储区块缓存行Cache Line组成

2. 计算机当中为了让效率更高,在读取数据时,是一块一块进行读取的

3. cache Line能够读取的大小是64个字节

image-acb999cd38884866a58d805bb9780d3d.png

cpu缓存一致性问题

假设cpu1从主内存当中读取一个共享数据i = 1,读取到cache当中 进行数据的修改,把i修改为2

image-7506ee0aef2e458987efcfdaa51512a8.png

一、同时同一个cpu也从内存当中读取数据

  1. 此时读取的结构可能是1也可能是2
  2. 如果cpu1把写的结果写到到内存中, cpu2读取的就是2
  3. 如果cpu1没有把结果写回到主内存当中,cpu2读取的就是1

cpu缓存一致性解决方案

1.总线加锁

cpu1在读取的时候不允许其它cpu进行读取
 弊端: 降低了cpu的吞吐量

2.缓存上的一致性协议MESI

后续再说MESI先有个印象

程序的局部性原理

问题

构建数组

image-92a962030ac04dc28a13f8324a01faed.png

创建一个大的二维数组

image-369cb435868d402b8643357a192a4973.png

任务:两种方式所有元素进行求和

请自行根据图片将代码执行查看效果

image-35007e0902c54f25814077770d7b4ae9.png

image-96cf2b153def48acb0bf1df98b8df0a0.png

image-beb85e7801b84f9a908fc49ba7480a13.png

思考问题

为什么会产生这么多时间呢? 如何进行读取的呢?

分析原理

上面一种连续按行读取

image-a2e7c1bfd7d54868b0fa6e7995200292.png

下面一种是按列读取

image-93f026caf277448d94de76ec620d4963.png

经过上面的问题牵扯出一个叫局部性原理的问题

一、什么是局部性原理

  1. 在CPU访问寄存器时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理
  2. 当读到某一个数据的时候,可能很快就会用到和它相邻的值,此时就会把它相邻的值也一起读取,来提高程序的效率
  3. 局部性原理有些像概率问题,被使用过的数据:在时间上,大概率会被多次使用;在空间上,其附近的位置“大概率”也会被引用

空间局部性

如果一个存储器的位置被引用,那么将来他附近的位置也会被引用

时间局部性

被引用过一次的存储器位置在未来会被多次引用那么在近期它很可能还会被再次访问
相关文章
|
9天前
|
机器学习/深度学习 计算机视觉
RT-DETR改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用
RT-DETR改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用
49 13
RT-DETR改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用
|
12天前
|
机器学习/深度学习 编解码 BI
YOLOv11改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用
YOLOv11改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用
38 3
YOLOv11改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用
|
8天前
|
机器学习/深度学习 编解码 BI
RT-DETR改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用
RT-DETR改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用
21 0
RT-DETR改进策略【Conv和Transformer】| CVPR-2023 BiFormer 稀疏自注意力,减少内存占用
|
12天前
|
机器学习/深度学习 计算机视觉
YOLOv11改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用
YOLOv11改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用
23 0
YOLOv11改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用
|
2月前
|
算法 Java
堆内存分配策略解密
本文深入探讨了Java虚拟机中堆内存的分配策略,包括新生代(Eden区和Survivor区)与老年代的分配机制。新生代对象优先分配在Eden区,当空间不足时执行Minor GC并将存活对象移至Survivor区;老年代则用于存放长期存活或大对象,避免频繁内存拷贝。通过动态对象年龄判定优化晋升策略,并介绍Full GC触发条件。理解这些策略有助于提高程序性能和稳定性。
|
2月前
|
NoSQL 算法 Redis
redis内存淘汰策略
Redis支持8种内存淘汰策略,包括noeviction、volatile-ttl、allkeys-random、volatile-random、allkeys-lru、volatile-lru、allkeys-lfu和volatile-lfu。这些策略分别针对所有键或仅设置TTL的键,采用随机、LRU(最近最久未使用)或LFU(最少频率使用)等算法进行淘汰。
74 5
|
2月前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
239 7
|
3月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
643 1
|
2月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
3月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80