自己寫論文的時候,引用了一篇SIGCOM的文獻,里面有談到Cache Coherency(緩存一致性)和False Shareing(偽共享)的問題。那么什么是緩存一致性呢?這個問題困擾了我很久,今天在網(wǎng)上看博文的時候發(fā)現(xiàn)很詳細的解釋了這個問題,這也解決了我心中的困惑。
緩存一致性(Cache Coherency):我們現(xiàn)有的CPU的Cache是有多層結(jié)構(gòu)的,一般每個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之間的同步協(xié)議,它其實就是保證對某一個地址的讀操作返回的的值一定是那個地址的最新值,而這個值可能是該線程所處CPU寫的,也肯能是另外一個CPU上的線程寫的。
問題到這里看起來似乎得到了圓滿的解決,但是當多個CPU對同一內(nèi)存地址線上的不同數(shù)據(jù)進行操作時,Cache Coherency機制會將整個地址線上的數(shù)據(jù)拷貝到各個CPU的私有Cache中去了,這樣每個線程在讀取自己數(shù)據(jù)的時候也把別人的數(shù)據(jù)讀進去了,更新的時候Cache Coherency為了保持數(shù)據(jù)的一致性,不同CPU的Cache之間要進行同步,這個會導致嚴重的性能問題,即所謂的False Shareing,在維基百科上給出了詳細的解釋。解決方案很簡單,說是通過把每個數(shù)據(jù)湊齊Cache Line的長度,實現(xiàn)隔離。
參考文獻:
[1]
Wiki:Cache Coherency[2]
Wiki:False Shareing[3]
False sharing問題及其解決方法[4]
為什么程序員需要關(guān)心順序一致性(Sequential Consistency)而不是Cache一致性(Cache Coherence?)