> 编者按
为什么要了解CPU内部缓存结构?只有了解了CPU内部缓存的结构,在程序开发的过程中遇到问题才能找到方向,特别是在并发编程开发中,所以我们有必要掌握CPU内部的缓存结构及其读写策略
## 一、CPU内部缓存结构图
<img src="https://aris-site.obs.cn-east-3.myhuaweicloud.com/pics/cache/image-20220620225350298.png" alt="CPU内部缓存结构图" style="zoom:160%;" align="left"/>
<pre>
</pre>
### CPU缓存结构
CPU缓存是由很多个缓存块(Cache Line)组成的。读取数据时,是以一小块一小块来读取的
<img src="https://aris-site.obs.cn-east-3.myhuaweicloud.com/pics/cache/image-20220620222229299.png" alt="Cache Line" style="zoom:100%;"/>
<pre>
</pre>
### 使用CPU-Z工具查看CPU缓存情况
<img src="https://aris-site.obs.cn-east-3.myhuaweicloud.com/pics/cache/image-20220620215356422.png" alt="CPU-Z工具查看本机缓存" style="zoom:120%;"/>
## 二、CPU缓存读写策略
### 读取策略
假如要加载一个 int array[100] 的数组,int需要占用 4 个字节,不足 Cache Line规定的64个字节大小,所以CPU会顺序加载数组元素 array[0] 到 array[15],从而保持64个字节对齐,也就是CPU读取数据是一次性加载64个字节的数据。
### 写入策略
有两种写入策略
#### 1. 写直达(Write Through)
把数据同时写入缓存与内存中
**优点**:思路简单
**缺点**:无论数据是否在缓存中,每次写操作都会写入到内存,耗费时间从而影响性能
<img src="https://aris-site.obs.cn-east-3.myhuaweicloud.com/pics/cache/v2-2497b560317815e1d91fc32a5be26417_r.jpg" alt="写直达策略" style="zoom:80%;"/>
#### 2. 写回(Write Back)
为了解决写直达的性能问题,提出了写回的策略
**写回策略**:发生写操作,新数据只会被写入CPU的缓存块中,只有当修改过的缓存块被替换时才需要写到内存中,从而减少了数据写回内存的频率,进而提高了系统的性能
执行过程分析:
- 如果发生写操作能够命中缓存,就把数据更新到缓存块,并将存储该数据的缓存块标记为脏的
- 如果发生写操作时,发现数据所在的缓存块存放的是别的内存地址的数据,此时就会检查这个缓存块里的数据是不是脏的
如果是脏的,就将该缓存块数据写回内存,然后将当前新数据写到该缓存块中
如果不是脏的,就直接将当前新数据写到该缓存块中,然后再将缓存块标记为脏的
**优点**:如果发现大量操作能够命中缓存,就不需要读取内存,直接从缓存中读取,从而提升了性能
<img src="https://aris-site.obs.cn-east-3.myhuaweicloud.com/pics/cache/v2-ceaa77d58a3e014767c1c218435a9de9_r.jpg" alt="写回策略" style="zoom:80%;"/>
CPU内部缓存结构与缓存读写策略