编者按
为什么要了解CPU内部缓存结构?只有了解了CPU内部缓存的结构,在程序开发的过程中遇到问题才能找到方向,特别是在并发编程开发中,所以我们有必要掌握CPU内部的缓存结构及其读写策略

一、CPU内部缓存结构图

CPU内部缓存结构图

CPU缓存结构

CPU缓存是由很多个缓存块(Cache Line)组成的。读取数据时,是以一小块一小块来读取的

Cache Line

使用CPU-Z工具查看CPU缓存情况

CPU-Z工具查看本机缓存

二、CPU缓存读写策略

读取策略

假如要加载一个 int array[100] 的数组,int需要占用 4 个字节,不足 Cache Line规定的64个字节大小,所以CPU会顺序加载数组元素 array[0] 到 array[15],从而保持64个字节对齐,也就是CPU读取数据是一次性加载64个字节的数据。

写入策略

有两种写入策略

1. 写直达(Write Through)

把数据同时写入缓存与内存中

优点:思路简单

缺点:无论数据是否在缓存中,每次写操作都会写入到内存,耗费时间从而影响性能

写直达策略

2. 写回(Write Back)

为了解决写直达的性能问题,提出了写回的策略

写回策略:发生写操作,新数据只会被写入CPU的缓存块中,只有当修改过的缓存块被替换时才需要写到内存中,从而减少了数据写回内存的频率,进而提高了系统的性能

执行过程分析:

  • 如果发生写操作能够命中缓存,就把数据更新到缓存块,并将存储该数据的缓存块标记为脏的

  • 如果发生写操作时,发现数据所在的缓存块存放的是别的内存地址的数据,此时就会检查这个缓存块里的数据是不是脏的

    如果是脏的,就将该缓存块数据写回内存,然后将当前新数据写到该缓存块中

    如果不是脏的,就直接将当前新数据写到该缓存块中,然后再将缓存块标记为脏的

优点:如果发现大量操作能够命中缓存,就不需要读取内存,直接从缓存中读取,从而提升了性能

写回策略