5.3. CPU多级缓存
5.3.1. CPU缓存基本介绍
1)CPU缓存出现的原因
CPU的频率太快,快到主存跟不上,这样在处理器时钟周期内,CPU经常需要等待主存,浪费资源。所以缓存的出现,是为了缓解CPU和内存间速度的不匹配问题。(结论:CPU>缓存>主存)
2)CPU缓存的意义
1)时间局部性:如果某个数据被访问,那么在不久的将来它很有可能会被再次访问。
2)空间局部性:如果某个数据被访问,那么与它相邻的数据很快也能被访问。
3)多核系统中的缓存设置意义
在典型的多核系统中,每一个核心都会有自己的缓存来共享主存总线,每一个CPU都会发出读写请求,而缓存的目的就是为了减少CPU读写共享主存的次数。
5.3.2. 缓存行
1)缓存行的定义
缓存是由缓存行组成的,CPU读取缓存都是以缓存行的形式读取,通常是 64 字节(常用处理器的缓存行是 64 字节的,比较旧的处理器缓存行是 32 字节),并且它有效地引用主内存中的一块地址。在程序运行的过程中,缓存每次更新都从主内存中加载连续的 64 个字节。因此,如果访问一个 long 类型的数组时,当数组中的一个值被加载到缓存中时,另外 7 个元素也会被加载到缓存中。
注:a. 一个 Java 的 long 类型是 8 字节,因此在一个缓存行中可以存 8 个 long 类型的变量。b.如果使用的数据结构中的项在内存中不是彼此相邻的,比如链表,那么将得不到免费缓存加载带来的好处。
2)伪共享问题
a.定义:当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享问题。
b.样例介绍:设想如果有个 long 类型的变量 a,它不是数组的一部分,而是一个单独的变量,并且还有另外一个 long 类型的变量 b 紧挨着它,那么当加载 a