Cache的写策略
Cache的写策略
内存的数据被加载到Cache后,在某个时刻其要被写回内存,对于这个时刻的选取,有如下几个不同的策略。
通用策略
直写(write-through)
策略:直写指在处理器对Cache写入的同时,将数据写入到内存中
优点:这种策略保证了在任何时刻,内存的数据和Cache中的数据都是同步的,这种方式简单、可靠。
缺点:但由于处理器每次对Cache更新时都要对内存进行写操作,因此总线工作繁忙,内存的带宽被大大占用,因此运行速度会受到影响。
假设一段程序在频繁地修改一个局部变量,尽管这个局部变量的生命周期很短,而且其他进程/线程也用不到它,CPU依然会频繁地在Cache和内存之间交换数据,造成不必要的带宽损失。
回写(write-back)
策略:回写系统通过将Cache line的标志位字段添加一个Dirty标志位。当处理器在改写了某个Cache line后,并不是马上把其写回内存,而是将该Cache line的Dirty标志设置为1。
当处理器再次修改该Cache line并且写回到Cache中,查表发现该Dirty位已经为1,则先将Cache line内容写回到内存中相应的位置,再将新数据写到Cache中。优点:回写相对于直写而言是一种高效的方法。直写不仅浪费时间,而且有时是不必要的,比如上文提到的局部变量的例子。
缺点:其实,回写策略在多核系统中会引起Cache一致性的问题。设想有两个处理器核心都需要对某个内存块进行读写,其中一个核心已经修改了该数据块,并且写回到Cache中,设置了Dirty位;这时另外一个核心也完成了该内存块的修改,并且准备写入到Cache中,这时才发现该Cache line是“脏”的。
在这种情况下,Cache如何处理呢?之后的章节我们会继续这个话题。
总结、比较
回写相较于直写,简而言之就是:
- 修改Cache的行为是不变的,改变的是与此同时往内存进行同步的频率
- 频率低则高效,但更容易引发资源竞争冲突
特殊的地址空间策略
除了上述这两种写策略,还有WC(write-combining)和UC(uncacheable)。这两种策略都是针对特殊的地址空间来使用的。
WC(write-combining,集合写)
场景:针对于具体设备内存(如显卡的RAM)的一种优化处理策略。
对于这些设备来说,数据从Cache到内存转移的开销比直接访问相应的内存的开销还要高得多,所以应该尽量避免过多的数据转移。
例如:试想,如果一个Cache line里的字被改写了,处理器将其写回内存,紧接着又一个字被改写了,处理器又将该Cache line写回内存,这样就显得低效。
例如:符合这种情况的一个例子就是显示屏上水平相连的像素点数据。
策略:顾名思义,这种策略就是当一个Cache line里的数据一个字一个字地都被改写完了之后,才将该Cache line写回到内存中。
UC(uncacheable,不可缓存的)
场景:uncacheable内存是一部分特殊的内存
例如:比如PCI设备的I/O空间通过MMIO方式被映射成内存来访问。这种内存是不能缓存在Cache中的,因为设备驱动在修改这种内存时,总是期望这种改变能够尽快通过总线写回到设备内部,从而驱动设备做出相应的动作。如果放在Cache中,硬件就无法收到指令。