經過這麼多篇文章的介紹,我們應該已經對cache有乙個比較清晰的認識。cache會面臨哪些問題,我們該怎麼處理這些問題。現在我們討論多核cache一致性問題。在摩爾定律不太適用的今天,人們試圖增加cpu核數以提公升系統整體效能。這類系統稱之為多核系統(簡稱mp,multi-processor)。我們知道每個cpu都有乙個私有的l1 cache(不細分icache和dcache)。假設乙個2核的系統,我們將會有2個l1 cache。這就引入了乙個問題,不同cpu之間的l1 cache如何保證一致性呢?首先看下什麼是多核cache一致性問題。
首先我們假設2個cpu的系統,並且l1 cache的cache line大小是64 bytes。兩個cpu都讀取0x40位址資料,導致0x40開始的64 bytes內容分別載入到cpu0和cpu1的私有的cache line。
cpu0執行寫操作,寫入值0x01。cpu0私有的l1 cache更新cache line的值。然後,cpu1讀取0x40資料,cpu1發現命中cache,然後返回0x00值,並不是cpu0寫入的0x01。這就造成了cpu0和cpu1私有l1 cache資料不一致現象。
按照正確的處理流程,我們應該需要以下方法保證多核cache一致性:
以上問題就是乙個簡單的不一致性現象。我們需要保證多核一致性,就需要辦法維護一致性。可以有2種方法維護一致性,分別是軟體和硬體。軟體維護一致性的方法,現在基本沒有採用。因為軟體維護成本太高,由於維護一致性帶來的效能損失抵消一部分cache帶來的效能提公升。所以現在的硬體會幫我們維護多核cache一致性,並且對軟體是透明的。感興趣的朋友可以繼續往下了解硬體是如何維護多核cache一致性。
繼續以上面的例子說明bus snooping的工作機制。當cpu0修改自己私有的cache時,硬體就會廣播通知到匯流排上其他所有的cpu。對於每個cpu來說會有特殊的硬體監聽廣播事件,並檢查是否有相同的資料被快取在自己的cpu,這裡是指cpu1。如果cpu1私有cache已經快取即將修改的資料,那麼cpu1的私有cache也需要更新對應的cache line。這個過程就稱作bus snooping。如下圖所示,我們只考慮l1 dcache之間的一致性。
這種bus snooping方法簡單,但要需要每時每刻監聽匯流排上的一切活動。我們需要明白的乙個問題是不管別的cpu私有cache是否快取相同的資料,都需要發出一次廣播事件。這在一定程度上加重了匯流排負載,也增加了讀寫延遲。針對該問題,提出了一種狀態機機制降低頻寬壓力。這就是mesi protocol(協議)。
mesi是現在一種使用廣泛的協議,用來維護多核cache一致性。我們可以將mesi看做是狀態機。我們將每乙個cache line標記狀態,並且維護狀態的切換。cache line的狀態可以像tag,modify等類似儲存。繼續以上面的例子說明問題。
當cpu0讀取0x40資料,資料被快取到cpu0私有cache,此時cpu1沒有快取0x40資料,所以我們標記cache line狀態為exclusive。exclusive代表cache line對應的資料僅在資料只在乙個cpu的私有cache中快取,並且其在快取中的內容與主存的內容一致。
然後cpu1讀取0x40資料,傳送訊息給其他cpu,發現資料被快取到cpu0私有cache,資料從cpu0 cache返回給cpu1。此時cpu0和cpu1同時快取0x40資料,此時cache line狀態從exclusive切換到shared狀態。shared代表cache line對應的資料在"多"個cpu私有cache中被快取,並且其在快取中的內容與主存的內容一致。
繼續cpu0修改0x40位址資料,發現0x40內容所在cache line狀態是shared。cpu0發出invalid訊息傳遞到其他cpu,這裡是cpu1。cpu1接收到invalid訊息。將0x40所在的cache line置為invalid狀態。invalid狀態表示表明當前cache line無效。然後cpu0收到cpu1已經invalid的訊息,修改0x40所在的cache line中資料。並更新cache line狀態為modified。modified表明cache line對應的資料僅在乙個cpu私有cache中被快取,並且其在快取中的內容與主存的內容不一致,代表資料被修改。
如果cpu0繼續修改0x40資料,此時發現其對應的cache line的狀態是modified。因此cpu0不需要向其他cpu傳送訊息,直接更新資料即可。
如果0x40所在的cache line需要替換,發現cache line狀態是modified。所以資料應該先寫回主存。
以上是cache line狀態改變的舉例。我們可以知道cache line具有4中狀態,分別是modified、exclusive、shared和invalid。取其首字母簡稱mesi。當cache line狀態是modified或者exclusive狀態時,修改其資料不需要傳送訊息給其他cpu,這在一定程度上減輕了頻寬壓力。
cache之間資料和狀態同步溝通,是通過傳送message同步和溝通。mesi主要涉及一下幾種message。
繼續以上的例子,我們有5個步驟。現在加上這些message,看看訊息是怎麼傳遞的。
cpu0發出read訊息。主存返回read response訊息,訊息包含位址0x40的資料。
cpu1發出read訊息,cpu0返回read response訊息,訊息包含位址0x40資料。
cpu0發出invalidate訊息,cpu1接到訊息後,返回invalidate acknowledge訊息。
不需要傳送任何訊息。
傳送writeback訊息。
多核cache一致性由硬體保證,對軟體來說是透明的。因此我們不用再考慮多核cache一致性問題。另外,現在cpu硬體採用的一致性協議一般是mesi的變種。例如arm64架構採用的moesi protocol。多一種owned狀態。多出來的狀態也是為了更好的優化效能。
主存和cache每一塊相等 cache基本原理
在學習linux kernel的過程,經常會cache的概念,從軟體層面的page buffer cache 再到硬體層面中cpu的l1 l2 l3 cache tlb,磁碟內部的硬體cache 以及程式設計時的cacheline對齊,slab著色等等。cache是我們始終繞不開的乙個主題,本文主要...
謹慎投資每一塊錢
十五世紀,哥倫布開闢了橫渡大西洋到美洲的航路。哥倫布的出海得到了西班牙女王伊莎貝拉的支援,後人推算,女王大約資助了3萬美元,哥倫布與女王簽下乙個投資方案,哥倫布獲得航海探險收益的10 和5 的 剩餘歸女王所有。四百多年後的1962年,股神 巴菲特在其合夥人公司的年報中為伊莎貝女王重新算了一筆賬,粗略...
乙個完整的url每一塊的作用
解析鏈結 完成客戶端和伺服器端互動的過程 資料的傳輸 類似於快遞公司 資料互動 1.客戶端向伺服器傳送資料 2.伺服器上客戶端傳送資料 3.兩台伺服器之間也可以相互傳送資料 https 比http更加安全,http 超文字傳輸協議 ftp 往伺服器上上傳專案的 購買的是一級網域名稱 qq.com 二...