計算機設計就是處理矛盾的藝術

2021-05-21 22:30:16 字數 1389 閱讀 5901

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

首先簡單說一下計算機中處理器-記憶體體系結構。由於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大小的記憶體區域裡在時間上是最有效率的,然而空間上就變成最沒效率的了。

計算機設計就是處理矛盾的藝術

我眼中的雲 雲就是網路,就是計算機

按照馮.諾依曼的計算機體系架構,計算機包括輸入,輸出,儲存,計算和控制五個部分,雖然到現在,計算機已經發展非常完善,但在體系結構方面,還是沒有超出馮.諾依曼的這種結構體系,至少,我們依然可以用這種體系思想去思考計算機,而不管他是並行的,還是序列的,是複雜指令的,還是簡單指令的等等。這個體系架構也非常...

全國計算機設計大賽參後感

在這次比賽中,最大的收穫就是讓我明白了,做東西不能太散。一定要專一的去研究乙個方向,否則就會多而不精,這是乙個致命的問題!參加比賽的時候,我們遇到了有做物聯網的,有做web開發的,有做演算法開發的。最讓我覺得有意義的就是乙個團隊開發的aloith 國一 一種新的程式語言,還有他們寫的編譯器,當時聽的...

計算機世界就是現實世界的延伸

作業系統排程演算法分為以下幾種 1 先來先服務,2 優先順序排程,3 短作業優先排程,4 輪轉法排程,5 高響應比優先排程。這五種演算法其實就是現實生活中的活生生的管理方法。1,大家都是平民,則先來的人先用公廁 先來先服務。2,如果來人中有乙個是市長呢,就要讓市長先上。這就是 優先順序排程。3,後面...