CPU缓存
CPU的时钟频率非常的快,以至于运行效率与读写内存的效率存在着巨大的鸿沟,在读写内存过程中带来的等待浪费了很大的CPU算力。所以缓存的出现,是为了缓解CPU和内存之间速度的不匹配问题(cpu -> cache -> memory)。
时钟周期:CPU完成一个基本动作需要的时间周期。
向内存中写入数据,据权威资料,需要107个CPU时钟周期,即CPU的运行效率是写内存的107倍。如果CPU只执行写操作需要一个时钟周期,那CPU等待这个写完成需要等待106个时钟周期。
CPU缓存的容量远远小于主存,因此出现cache miss在所难免。缓存不能包含CPU所需要的所有数据,所以缓存存在的意义就在于局部性原理。局部性原理具体是指在CPU访问存储设备时,无论是存取数据还是存取指令,都趋于聚集在一片连续的区域中,主要包含时间与空间上的局部性。
- 时间局部性:如果某个数据被访问,那么在不久的将来它很可能被再次访问
- 空间局部性:如果某个数据被访问,那么与它相邻的数据很快也可能被访问
程序中,包含着很多连续创建的数组、对象,各种循环、递归、调用同一函数等,其实本质上符合了局部性原理。
高速缓存
有了这样的特性,就可以在CPU和内存之间添加高速缓存存储CPU经常访问的数据,缓解CPU和内存速度严重差异的问题。
CPU和cache之间进行数据/指令存取,而内存(主存)和高速缓存则通过系统总线来实现通信。程序以及数据被加载到内存中后,随后被加载到高速缓存,CPU执行完指令处理完数据将结果写回高速缓存中,最后高速缓存再写回内存。
然而,由于CPU的运算速度不断提升,很快超越了一级缓存的数据 I\O 能力,CPU厂商们又开始引入了多级的缓存结构。多核的CPU至少拥有着不止一个一级缓存,当高速缓存中拷贝了内存中同一个数据多个副本时,CPU操作的是每一个副本,利用缓存一致性的原则保证副本与副本之间,以及副本与主存的数据一致。
单核CPU cache结构
在单核CPU结构中,为了缓解CPU指令流水中cycle冲突,L1分成了指令(L1P)和数据(L1D)两部分,而L2则是指令和数据共存。
多核CPU cache结构
多核CPU的结构与单核相似,但是多了所有CPU共享的L3三级缓存。在多核CPU的结构中,L1和L2是CPU私有的,L3则是所有CPU核心共享的。
缓存一致性
用于保证多个CPU cache之间缓存共享数据的一致