天天看點

多處理器系統下的僞共享(false sharing)問題

1. 背景介紹         首先簡單說一下計算機中處理器-記憶體體系結構。由于CPU速度遠大于記憶體通路速度,現代CPU設計中都引入了緩存(cache)作為CPU和記憶體兩者之間交流的緩沖中介。緩存的速度也介于兩者之間。緩存中存放了最經常被通路的記憶體資料,CPU在很大程度上隻需要通路高速緩存,大大提高了系統性能。系統對緩存進行讀寫的機關被稱作緩存行(cache line)。大家知道系統對記憶體的操作機關一般是word,如果對緩存操作也用word作機關,就顯得太小,缺乏效率,是以一般cache line大概是8個word,這是緩存與記憶體溝通的最小機關。         在可以預見的幾年内,計算機系統會逐漸向多核心CPU或者多CPU結構過渡,出現多個處理核心共享記憶體的局面。一個很自然的問題馬上出現,那就是多個處理核心對單一記憶體資源的通路沖突。這個沖突本來不難解決,隻要給記憶體通路加鎖就可以了。但是,當把緩存納入考慮範圍時,情況就複雜了。緩存是內建在每個CPU内部的小記憶體,除了這個CPU,其他CPU不能通路。而按照單CPU系統的簡單緩存設計,緩存并不能察覺除本CPU以外的外部因素對記憶體内容的修改。是以,假設出現下面的情況:處理器A将記憶體中某塊内容C讀入自己的緩存,并在緩存中修改了該内容,然後處理器B也将記憶體中這塊内容C讀入自己的緩存,那麼,B看到的隻是原始版本的内容,而看不到存在于A緩存中的更新的内容,這就産生了内容不一緻的問題。多處理器系統一般是設計控制協定來協調各個CPU緩存讀寫,保證内容一緻,以解決這種沖突。   2. 僞共享         顧名思義,“僞共享”就是“其實不是共享”。那什麼是“共享”?多CPU同時通路同一塊記憶體區域就是“共享”,就會産生沖突,需要控制協定來協調通路。會引起“共享”的最小記憶體區域大小就是一個cache line。是以,當兩個以上CPU都要通路同一個cache line大小的記憶體區域時,就會引起沖突,這種情況就叫“共享”。但是,這種情況裡面又包含了“其實不是共享”的“僞共享”情況。比如,兩個處理器各要通路一個word,這兩個word卻存在于同一個cache line大小的區域裡,這時,從應用邏輯層面說,這兩個處理器并沒有共享記憶體,因為他們通路的是不同的内容(不同的word)。但是因為cache line的存在和限制,這兩個CPU要通路這兩個不同的word時,卻一定要通路同一個cache line塊,産生了事實上的“共享”。顯然,由于cache line大小限制帶來的這種“僞共享”是我們不想要的,會浪費系統資源。         舉例來說,當多程序程式操作同一個int型數組int a[100]時,如果程序0隻通路a[0],程序1隻通路a[1],程序2隻通路a[2],... 那麼,實際上每個程序不應該發生資料共享。但是,一般cache line可以包含幾個int,是以通路同一個cache line内int數組元素的幾個程序就需要系統花費額外資源和時間運用控制協定來協調,這是不必要的。在這種情況下,把每個數組元素單獨放在一個cache line大小的記憶體區域裡在時間上是最有效率的,然而空間上就變成最沒效率的了。       計算機設計就是處理沖突的藝術

程式示範 http://blog.csdn.net/sy8111/archive/2010/09/15/5886866.aspx