一、物理内存模型
1、物理缓存模型
2、缓存一致性
MESI 协议(intel cpu)
MESI为缓存一致性协议的一种(intel cpu)主要通过一块区域维护四种状态(Modified、Exclusive、Shared、Invalid)
1、Exclusive 当缓存独占时其他,状态为此状态
2、Modified 当线程更新时,内存位置标记为此状态
3、Shared 当其他线程已经读取是,当前线程再读取则为此状态
4、Invalid 当其他线程已经Modified,此时持有的为Invalid需要重新去加载
3、缓存行,伪共享
缓存行的概念,再缓存中读入内存数据时是按照最小行去读取,一行占有 64个字节512位
性能问题:
根据缓存一致性,如果两个CPU的缓存同时读取了一行,同时修改了一行的不同位置,都会导缓存行反复再缓存中加载的过程。(任意一个cup修改一行,都会导致缓存行出现Invaild状态,重新从L3或者内存缓存改行)
缓存行对齐
将可能导致缓存一致性问题的数据通过填充内存数据进行行对全,例如:X,Y两个8字节的数据会出现缓存一致性,为了提高缓存有效性可以在X前面增加56字节的占位。
java行对齐示例
private long p1,p2,p3,p4,p5,p6,p7;
private long x;
private long y;
补充
:java:
byte --> 1字节--->8bit
int --> 4字节--->32bit
short --> 2字节--->16bit
long --> 8字节--->64bit
float --> 4字节--->32bit
double --> 8字节--->64bit
5、CPU指令重排
1、读指令重排
读指令的重排,当CPU执行一条指令时,比如去内存读取数据(速度慢,慢cpu100倍)所以此时cpu会对后续的指令进行分析,对于与该指令无关的指令进行执行。
2、写指令合并
- WC(指令合并计算)
WC是一个类似于4个位置的高速BUFF,可以合并4个位置的写指令,提高写入缓存的效率