自己写论文的时候,引用了一篇SIGCOM的文献,里面有谈到Cache Coherency(缓存一致性)和False Shareing(伪共享)的问题。那么什么是缓存一致性呢?这个问题困扰了我很久,今天在网上看博文的时候发现很详细的解释了这个问题,这也解决了我心中的困惑。
缓存一致性(Cache Coherency):我们现有的CPU的Cache是有多层结构的,一般每个CPU会有一个私有的L1和L2级Cache,然后多个核心CPU共享一个L3级缓存。但是这样一来有个问题,就是多个CPU的私有Cache之间需要同步。比如说,CPU1上的线程对全局变量global_counter进行了加1操作,这个被写入的新值存到CPU1的私有缓存里,而CPU2上的线程想要读global_counter的时候,而CPU2的私有Cache里的global_counter的值还是旧值,怎么办呢?这个任务就交给Cache Coherency来完成了。Cache Coherency是一种Cache之间的同步协议,它其实就是保证对某一个地址的读操作返回的的值一定是那个地址的最新值,而这个值可能是该线程所处CPU写的,也肯能是另外一个CPU上的线程写的。
问题到这里看起来似乎得到了圆满的解决,但是当多个CPU对同一内存地址线上的不同数据进行操作时,Cache Coherency机制会将整个地址线上的数据拷贝到各个CPU的私有Cache中去了,这样每个线程在读取自己数据的时候也把别人的数据读进去了,更新的时候Cache Coherency为了保持数据的一致性,不同CPU的Cache之间要进行同步,这个会导致严重的性能问题,即所谓的False Shareing,在维基百科上给出了详细的解释。解决方案很简单,说是通过把每个数据凑齐Cache Line的长度,实现隔离。
参考文献:
[1]
Wiki:Cache Coherency[2]
Wiki:False Shareing[3]
False sharing问题及其解决方法[4]
为什么程序员需要关心顺序一致性(Sequential Consistency)而不是Cache一致性(Cache Coherence?)