缓存写策略 #
写回和写直达 #
当 CPU 修改了缓存中的数据后,这些修改什么时候能传播到主存?解决这个问题有两种策略: 写回(Write-Back)和 写直达(Write-Through)。
- 写回策略对缓存的修改不会立刻传播到主存,只有当缓存块被替换时,这些被修改的缓存块,才会写回并覆盖内存中过时的数据;
- 写直达策略缓存中任何一个字节的修改,都会立刻传播到内存,这种做法就像穿透了缓存一样,所以用英文单词“Through”来命名。
写更新与写无效 #
当某个 CPU 的缓存中执行写操作,修改其中的某个值时,其他 CPU 的缓存所保有该数据副本的更新策略也有两种:写更新(Write Update)和写无效(Write Invalidate)。
- 写更新策略每次它的缓存写入新的值,该 CPU 都必须发起一次总线请求,通知其他 CPU 将它们的缓存值更新为刚写入的值,所以写更新会很占用总线带宽。
- 写无效如果在一个 CPU 修改缓存时,将其他 CPU 中的缓存全部设置为无效,这种策略叫做写无效。这意味着,当其他 CPU 再次访问该缓存副本时,会发现这一部分缓存已经失效,此时 CPU 就会从内存中重新载入最新的数据。
在具体的实现中,绝大多数 CPU 都会采用写无效策略。这是因为多次写操作只需要发起一次总线事件即可,第一次写已经将其他缓存的值置为无效,之后的写不必再更新状态,这样可以有效地节省 CPU 核间总线带宽。
写分配与写不分配 #
当前要写入的数据不在缓存中时,根据是否要先将数据加载到缓存中,写策略又分为两种:写分配(Write Allocate)和写不分配(Not Write Allocate)。
- 写分配在写入数据前将数据读入缓存,这是写分配策略。当缓存块中的数据在未来读写概率较高,也就是程序空间局部性较好时,写分配的效率较好;
- 写不分配在写入数据时,直接将要写入的数据传播内存,而并不将数据块读入缓存,这是写不分配策略。当数据块中的数据在未来使用的概率较低时,写不分配性能较好。
如果缓存块的大小比较大,该缓存块未来被多次访问的概率也会增加,这种情况下,写分配的策略性能要优于写不分配。