今天看go的sync.pool的代码,发现了一个比较陌生的名词 false sharing , 之前没听说过,就去查了下,瞬间学到了
type poolLocal struct {
poolLocalInternal
// Prevents false sharing on widespread platforms with
// 128 mod (cache line size) = 0 .
pad [128 - unsafe.Sizeof(poolLocalInternal{})%128]byte
}
什么是false sharing
这里需要解决这几个问题
(1)什么是cpu缓存行
(2)什么是内存屏障
(3)什么是伪共享
(4)如何避免伪共享
CPU缓存架构
cpu是计算机的心脏,所有运算和程序最终都要由他来执行。
主内存RAM是数据存在的地方,CPU和主内存之间有好几级缓存,因为即使直接访问主内存相对来说也是非常慢的。
如果对一块数据做相同的运算多次,那么在执行运算的时候把它加载到离CPU很近的地方就有意义了,比如一个循环计数,你不想每次循环都到主内存中去取这个数据来增长它吧。
越靠近CPU的缓存越快也越小
所以L1缓存很小但很快,并且紧靠着在使用它的CPU内核。
L2大一些,但也慢一些