① CPU Cache
概述:
为什么需要CPU Cache?
CPU频率太快,主存跟不上,CPU往往要等待主存响应,造成资源浪费,Cache的出现就是为了缓和CPU和主存速度的问题。
描述:CPU高速缓存 是用于减少处理器访问内存所需平均时间的部件。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近处理器的频率。
作用:当处理器发出内存访问请求时,会先查看缓存内是否有请求数据。如果存在(命中),则不再访问内存直接返回该数据;如果不存在(失效),则要先把内存中的相应数据载入缓存,再将其返回处理器。
原理:缓存之所以有效,主要是因为程序运行时对内存的访问呈现局部性(Locality)特征。这种局部性既包括空间局部性(Spatial Locality),也包括时间局部性(Temporal Locality)。有效利用这种局部性,缓存可以达到极高的命中率。
局部性原理:
时间局部性:如果某个数据被访问,那么在不久的将来它很可能被再次访问。
空间局部性:如果某个数据被访问,那么与它临近的数据也很可能将被访问。—— From: Wikipedia
Cache 与寄存器的差异:寄存器保存的是CPU正在处理的数据,而Cache保存的是与CPU处理的数据相关的数据
② CPU 多级缓存一致性(MESI协议)
Cache Line: Cache与内存交互的最小单位,它包括状态值,地址,数据三个部分,状态值即MESI,地址是在内存中的地址。通常是计算机系统位数(32、64)
概述:
Status | Description |
---|---|
M (Modified) | 与主存不一致,当前行数据是最新数据,其它CPU Cache Invalid |
E (Exclusive) | 与主存一致,当前行数据,Cache Line 只在当前CPU Cache 存在 |
S (Shared) | 与主存一致,当前行数据存在在多个CPU Cache 中 |
I (Invalid) | 当前行数据失效 |
对CPU Cache 的操作有:
Operate | Description |
---|---|
Local Read:LR | 当前内核读取 |
Local Write:LW | 当前内核写入 |
Remote Read:RR | 其它内核读取 |
Remote Write:RW | 其它内核写入 |
状态及操作的关系(MESI的本质):
Status | Operate | Description |
---|---|---|
M | LR | 当前CPU 读取Cache 当前Cache Line 依旧是最新数据,状态不变 |
LW | 当前CPU 写入Cache 当前Cache Line 依旧是最新数据,状态不变 | |
RR | 其它内核读取Cache 这行数据被写回到主存中,使其它核能使用到最新的数据,且多个CPU Cache共享,状态变成S | |
RW | 其它内核写入Cache 这行数据被写回到主存中,使其它核能使用到最新的数据,由于其它核对数据进行修改,当前Cache Line状态变成 I | |
E | LR | 当前CPU 读取Cache 当前Cache Line 依旧是最新数据,状态不变 |
LW | 当前CPU 写入Cache,数据发生改变,状态变为 M | |
RR | 其它内核读取Cache ,当前Cache Line 是与主存一致的,但是由独占变成了共享,状态变成S | |
RW | 其它内核写入Cache, 当前Cache Line 是与主存一致的,由于其它核对数据进行修改,当前Cache Line状态变成 I | |
S | LR | 当前CPU 读取Cache,状态不变 |
LW | 当前CPU 写入Cache 状态变为 M ,并通知其它CPU Cache 的当前Cache Line 状态变为 I | |
RR | 其它内核读取Cache ,当前行数据依旧是共享,状态不变 | |
RW | 其它内核写入Cache ,当前状态变为 I | |
I | LR | 如果其它Cache没有这份数据,本Cache从主存中取数据,Cache Line状态变成E; 如果其它Cache有这份数据,且状态为M,则将其它Cache数据更新到主存,本Cache再从内存中取数据,Cache Line状态都变成S; 如果其它Cache有这份数据,且状态为S或者E,本Cache从主存中取数据,这些Cache 的Cache Line状态都变成S |
LW | 如果其它Cache没有这份数据,本Cache从主存中取数据,Cache Line状态变成M; 如果其它Cache有这份数据,且状态为M,则将其它Cache数据更新到主存,本Cache再从主存中取数据,状态变为M,并通知其它Cache当前 Cache Line 状态改为 I 如果其它Cache有这份数据,且状态为S或者E,通知这些Cache 将当前Cache Line 状态改为 I | |
RR | 不变 | |
RW | 不变 |
③ CPU 多级缓存 乱序执行优化
处理器为了提高运算速度而做出违背代码原有执行顺序的优化
为了使得处理器内部的运算单元能尽量被充分利用,处理器可能会对输入代码进行乱序执行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果是一致的,但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致。因此,如果存在一个计算任务依赖另一个计算任务的中间结果,那么其顺序性并不能靠代码的先后顺序来保证。与处理器的乱序执行优化类似,Java虚拟机的即时编译器中也有类似的指令重排序(Instruction Reorder)优化