3 知識點摘記
3.2 編譯屏障和記憶體屏障
參考文獻
對於cache
、cache一致性
、記憶體一致性
、記憶體屏障
、原子操作等
話題,涉及到很多處理器體系結構的細節,比較難懂。本文不會系統的分析這些問題,一是水平有限,二是工作量太大,三是目前已經有相關的高質量書籍和網路資料。所以本文著力收集一些相關話題的高質量的資料,並分享出來。同時,在瀏覽相關資料時,對於部分知識點會做一些摘記。
perfbook
,經典書籍,無需多說。這本書全名為is parallel programming hard, and, if so, what can you do about it?,中文譯本為深入理解並行程式設計,如果英文閱讀有困難,可以參照中譯本看。
快取記憶體與一致性專欄索引。該專欄的系列文章對cache及相關話題的講解和分析非常好,並配有大量的圖示,強烈推薦!
不妨設32位位址線,物理頁的大小為4kb
,則將tag
選為實體地址的bit[31:12]
。現在程序1和程序2的虛擬位址a分別對映到不同的實體地址(說明虛擬位址a所在的虛擬頁分別對映到不同的物理頁):
不妨設物理頁為4kb
,cache採用多路組相聯的結構。
對於vipt cache,並不是總存在別名問題,先說不存在別名問題的情況:一路快取的大小不超過物理頁的大小。因為此時index
必然位於bit[11:0]
,這部分的實體地址和虛擬位址是相等的,即vi==pi
,進而vipt==pipt
,因此這種情況不存在別名問題。
那麼,為什麼一路快取的大小超過物理頁大小就會引發別名問題呢?我們用乙個具體的例子來說明:不妨設一路快取8kb
,共512組
,即每個cache line16位元組
。如下圖所示:
現在,有虛擬位址a和虛擬位址b,它們對映向相同的物理記憶體,也就是說a和b所在的虛擬頁對映向同乙個物理頁。由於實體地址相同,因此tag
是相同的。此時是否會產生別名問題,關鍵看index
,更確切的說,關鍵看index
的最高位,即虛擬位址的bit12
,具體用下圖說明:
現在,別名問題的產生搞清楚了。接下來就說一說如果採用vipt cache,且一路快取的大小超過物理頁的大小時,如何避免別名。其實從上圖就可以知道,這種情況不一定會產生別名,沒有別名的兩種情況很容易讓人聯想到乙個詞:對齊。沒錯了,解決方案就是分配位址時,返回的虛擬位址按照一路快取的大小對齊,對於本例來說就是按照8kb
對齊。此時,虛擬位址a和虛擬位址b的index
是相等的,又因為對映到相同的實體地址,所以tag
也是相等的,當然也就沒有別名問題了。
之前我寫過一篇關於編譯屏障和記憶體屏障的部落格:**c程式中的屏障。由於當時對這個話題的認識比較淺薄,因此部落格的內容也比較簡陋,特別是記憶體屏障部分。與記憶體屏障關係密切的話題是記憶體一致性模型,記憶體一致性模型有多種,它們向軟體開發者描述了硬體到底有著怎樣的亂序行為,可以指導軟體開發者正確的使用諸多屏障指令。有關記憶體一致性模型,這裡分享一些比較好的部落格:
同時,也分享一些關於編譯亂序和編譯屏障的部落格:
參考文獻即為上文中提到的書籍和網路資料。
Cache 快取一致性
就硬體而言,cpu 晶元 處理器 記憶體 匯流排 磁碟等等,構成了一台電腦,當電腦執行乙個程式的時候,需要從磁碟讀到主記憶體,主記憶體再到快取,最後交由cpu執行。隨著現在的多核處理器的發展,運算的速度是越來越快,但是在運算的同時,也要遇到快取一致性的問題,簡單來說,多核處理器,每個核上有個多個處理...
強一致性 弱一致性 最終一致性
這種方式在es等分布式系統中也有體現,可以設定主shard提交即返回成功,或者需要replica shard提交成功再返回。提到分布式架構就一定繞不開 一致性 問題,而 一致性 其實又包含了資料一致性和事務一致性兩種情況,本文主要討論資料一致性 事務一致性指acid 複製是導致出現資料一致性問題的唯...
Cache一致性協議之MESI
處理器上有一套完整的協議,來保證cache一致性。比較經典的cache一致性協議當屬mesi協議,奔騰處理器有使用它,很多其他的處理器都是使用它的變種。單核cache中每個cache line有2個標誌 dirty和valid標誌,它們很好的描述了cache和memory 記憶體 之間的資料關係 資...