天天看点

《深入浅出DPDK》—第2章2.4节Cache的写策略

本节书摘来自华章出版社《深入浅出dpdk》一书中的第2章,第2.4节cache的写策略,作者朱河清,梁存铭,胡雪焜,曹水 等,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.4 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如何处理呢?之后的章节我们会继续这个话题。

除了上述这两种写策略,还有wc(write-combining)和uc(uncacheable)。这两种策略都是针对特殊的地址空间来使用的。

write-combining策略是针对于具体设备内存(如显卡的ram)的一种优化处理策略。对于这些设备来说,数据从cache到内存转移的开销比直接访问相应的内存的开销还要高得多,所以应该尽量避免过多的数据转移。试想,如果一个cache line里的字被改写了,处理器将其写回内存,紧接着又一个字被改写了,处理器又将该cache line写回内存,这样就显得低效,符合这种情况的一个例子就是显示屏上水平相连的像素点数据。write-combining策略的引入就是为了解决这种问题,顾名思义,这种策略就是当一个cache line里的数据一个字一个字地都被改写完了之后,才将该cache line写回到内存中。

uncacheable内存是一部分特殊的内存,比如pci设备的i/o空间通过mmio方式被映射成内存来访问。这种内存是不能缓存在cache中的,因为设备驱动在修改这种内存时,总是期望这种改变能够尽快通过总线写回到设备内部,从而驱动设备做出相应的动作。如果放在cache中,硬件就无法收到指令。