高速緩存一致性協議MESI與內存屏障


一、CPU高速緩存簡單介紹

  CPU高速緩存機制的引入,主要是為了解決CPU越來越快的運行速度與相對較慢的主存訪問速度的矛盾。CPU中的寄存器數量有限,在執行內存尋址指令時,經常需要從內存中讀取指令所需的數據或是將寄存器中的數據寫回內存。而CPU對內存的存取相對CPU自身的速度而言過於緩慢,在內存存取的過程中CPU只能等待,機器效率太低。

  為此,設計者在CPU與內存之間引入了高速緩存。CPU中寄存器的存儲容量小,訪問速度極快;內存存儲容量很大,但相對寄存器而言訪問速度很慢。而高速緩存的存儲大小和訪問速度都介於二者之間,作為一個緩沖橋梁來填補寄存器與主存間訪問速度過大的差異。

  引入高速緩存后,CPU在需要訪問主存中某一地址空間時,高速緩存會攔截所有對於內存的訪問,並判斷所需數據是否已經存在於高速緩存中。如果緩存命中,則直接將高速緩存中的數據交給CPU;如果緩存未命中,則進行常規的主存訪問,獲取數據交給CPU的同時也將數據存入高速緩存。但由於高速緩存容量遠小於內存,因此在高速緩存已滿而又需要存入新的內存映射數據時,需要通過某種算法選出一個緩存單元調度出高速緩存,進行替換。

  由於對內存中數據的訪問具有局部性,使用高速緩存能夠極大的提高CPU訪問存儲器的效率。

二、高速緩存一致性問題

高速緩存與內存的一致性問題

  高速緩存在命中時,意味着內存和高速緩存中擁有了同一份數據的兩份拷貝。CPU在執行修改內存數據的指令時如果高速緩存命中,只會修改高速緩存中的數據,此時便出現了高速緩存與內存中數據不一致的問題。

  這個不一致問題在早期單核CPU環境下似乎不是什么大問題,因為所有的內存操作都來自唯一的CPU。但即使是單核環境下,為了減輕CPU在I/O時的負載、提高I/O效率,先進的硬件設計都引入了DMA機制。DMA芯片在工作時會直接訪問內存,如果高速緩存首先被CPU修改和內存不一致,就會出現DMA實際寫回磁盤的內容和程序所需要寫入的內容不一致的問題。

  為了更好的理解多核CPU環境下工作的MESI協議,這里先簡單介紹單核環境下高速緩存被首先改寫而導致cache與主存不一致問題的解決方案,簡單來說有兩種方法:通寫法回寫法

通寫法(Write Through):

  即CPU在對cache寫入數據時,同時也直接寫入主存,這樣就能使得主存和cache中的數據始終保存一致。

  通寫法的優點是簡單,硬件上容易實現,同時在調度緩存單元時不會有臟數據,調度速度快;缺點是每次cache寫入操作時都增加了寫主存的等待時間,效率較低。

回寫法(Write Back):

  回寫法和通寫法的主要區別在於,回寫法在CPU寫cache時並不實時同步寫主存,而是在進行調度被覆蓋前整體的寫回主存。如果被調度出的cache單元並沒有被寫入過,則直接被覆蓋無需寫回主存。

  回寫法的優點是寫入cache時無需同步主存,總體效率比通寫法高。缺點是硬件實現較為復雜。

多核CPU高速緩存間的一致性問題

  隨着單核主頻速度的增長受到制約,CPU的發展由單核逐漸過度到了多核,目前主流的CPU都是多核心的。但隨着多核CPU提高計算機並發性能的同時,也帶來了一系列的問題,這其中就包括了多核CPU下的高速緩存一致性問題

  在多核CPU的架構下,通常每一個核心都擁有着自己獨有的高速緩存,每個核心能並發的讀寫自己的高速緩存。高速緩存可以有多個,但其對應的內存數據邏輯上卻只有一份,多核並發的修改其高速緩存中同一內存的映射數據就會出現高速緩存中的數據不一致的問題。如果不對多核CPU下的高速緩存並發訪問施加一定的約束,那么並發程序中對共享內存數據的存取就會出現問題,並發程序的正確性將無法得到有效保障

高速緩存一致的存儲系統定義

  在討論解決高速緩存一致性問題的方法前,我們需要更精確的定義什么是高速緩存一致性。

  內存系統的一個本質特征是:一個內存系統應該能提供一組保存值的存儲單元,當對一個存儲單元執行讀操作時,應該能返回“最近”一個對該存儲單元的寫操作所寫入的值。在串行程序中,程序員利用內存來將程序中某一點計算出來的值,傳遞到該值的使用點,實際上就是利用了上述基本性質。同樣,運行在單處理器上的多個進程或線程利用共享地址空間進行通信,實際上也是利用了內存系統的這個性質。

  一個讀操作應返回最近的向那個位置的寫操作所寫的值,而不管是哪個線程寫的。當所有的線程運行在同一個物理處理器上時,它們通過相同的高速緩存層次來看內存,因此在這種情況下,高速緩存不會引起問題。當在共享存儲的多處理器系統上運行一個具有多個線程的程序時,希望不管這些線程是運行在同一個處理器上,還是位於不同的處理器上,程序的運行結果都是相同的。

  上面摘抄自書上的概念描述有些晦澀,我個人的理解是:按照程序指令的運行順序,對於同一內存單元內容(變量值)能夠令后面的讀操作讀取到之前最近寫操作后的結果,保證程序邏輯序的正確性。這一順序性的保證在單核環境下不是問題,因為所有的指令順序都使用同一個高速緩存,但在多核多高速緩存副本的情況下運行某一程序的多個並發任務時就會出現問題,因為並沒有約定多個處理器核心對同一存儲單元並發操作時的全局順序,即“最近”這一概念是模糊、不明確的。

  因此,一個高速緩存一致的存儲系統其首先要滿足的一個條件便是:根據一個程序的任意一次執行結果,都能夠對每個內存單元的存取操作構造出邏輯上的全局串行序列(即使是多核體系下,對內存的存取邏輯上也要強制串行化)。這一全局邏輯串行序列還需要滿足額外的兩個條件:一是同一處理器所發出的程序內存存取指令順序(程序邏輯序),與在全局邏輯串行序列中的先后順序保持一致;二是每個讀操作的值,返回的是在全局邏輯串行序列中最近的寫操作之后的值。

  上述高速緩存一致性的定義隱含了在多核環境下的兩個重要性質:一是寫傳播,二是寫串行化

  寫傳播(Write Propagation):一個處理器對一個位置的所寫入的值,最終對其它處理器是可見的。

  寫串行化(Write Serialization):對同一內存單元的所有寫操作(無論是來自一個處理器還是多個處理器)都能串行化。換句話說,所有的處理器能以相同的次序看到這些寫操作。

三、MESI高速緩存一致性協議

  通常多核並行架構的CPU,每個核雖然都獨自工作,但與外部存儲器的交互依然是共用同一總線進行的。通過總線,每個核心都能夠監聽、接收到來自其它核心的消息通知,這一機制被稱為總線偵聽或是總線嗅探

基於總線偵聽的寫傳播:

  每個核心在對自己獨有的高速緩存行進行修改時,需要將修改通知送至總線進行廣播。其它核心在監聽到總線上來自其它核心的遠程寫通知時,需要查詢本地高速緩存中是否存在同樣內存位置的數據。如果存在,需要選擇將其設置為失效狀態或是更新為最新的值。

基於總線偵聽的寫串行化:

  總線上任意時間只能出現一個核的一個寫通知消息。多個核心並發的寫事件會通過總線仲裁機制將其轉換為串行化的寫事件序列(可以簡單理解為邏輯上的一個FIFO事件隊列),在每個寫事件廣播時,必須得到每個核心對事件的響應后,才進行下一個事件的處理,這一機制被稱作總線事務

  而本文的主角MESI協議便是基於總線偵聽機制,采用回寫法、寫傳播失效策略的高速緩存一致性協議,其另一個更精確的名稱是四態緩存寫回無效協議。

  下面介紹MESI協議是如何工作以實現多核間高速緩存一致性的。

MESI協議緩存行狀態介紹

  MESI四態緩存寫回無效協議,為高速緩存中的每個存儲單元行cache line賦予了一個狀態屬性,狀態類型共有4種:Modified(已被修改)、Exclusive(被獨占)、Shared(被共享)、Invalid(無效),這也是MESI這一名稱的由來。

  任意時刻每個緩存行都處於上述四種狀態的其中一種,並且可能會因為發生的緩存事件而遷移至另一種狀態。

Modified:

  緩存數據有效,在讀入緩存后曾經被當前CPU修改過卻沒有寫回,導致與內存中的對應數據不一致

  內存中對應的數據只在本地核心的高速緩存中存在,其它核的高速緩存中並沒有緩存這一內存數據。

  有效,本地cache獨占,與內存數據不一致(被修改 Modified)。

Exclusive:

  緩存數據有效,在讀入緩存后沒有被當前CPU修改過與內存中的對應數據保持一致

  內存中對應的數據只在本地核心的高速緩存中存在,其它核的高速緩存中並沒有緩存這一內存數據。

  有效,本地cache獨占,與內存數據一致(被獨占 Exclusive)。

Shared:

  緩存數據有效,在讀入緩存后沒有被當前CPU修改過與內存中的對應數據保持一致

  內存中對應的數據除了本地核心的高速緩存中存在,其它核的高速緩存中也緩存了這一內存數據

  有效,與其它cache共享,與內存數據一致(被共享 Shared)。

Invalid:

  緩存數據無效。無效的含義既代表着之前緩存行有效,卻因為某些事件變為無效;也代表着對應緩存行不存在。

  上述緩存行的共享/獨占狀態,指的是本地高速緩存中存在有效的對應存儲單元緩存行,而其它核的高速緩存中不存在對應單元的內容或是對應的緩存行是Invalid無效狀態。

  在MESI協議中不存在與Invalid無效可以視作是等價的

內存緩存行的穩定態與非穩定態

  了解了MESI的四種內存緩存行狀態后,下面引入緩存內存行穩定態與非穩定態的概念。緩存內存行的穩定態指的是多核下高速緩存中的對應內存中在所有高速緩存中數據是一致的;非穩定態是穩定態的反面,指的是多核高速緩存中對應內存中在所有的高速緩存中數據出現了不一致,有不同的副本值

  當處於穩定態的緩存行由於某些事件的發生轉向不穩定態時,MESI協議能夠采取一些措施令整個多核存儲系統重新回到穩定態(可以類比自平衡二叉樹在發生插入/刪除事件時,引起失衡后進行的重平衡操作)。

內存緩存行處於穩定態的幾種情況:

  1、對應內存行在所有核的高速緩存中都不存在。

  2、對應內存行有且僅在一個核的高速緩存中存在,其狀態可以是Exclusive也可以是Modified。

  3、對應內存行在一個以上核的高速緩存中存在,每個緩存行中的存儲的數據都和內存一致,其狀態都為Shared。

MESI協議緩存事件

  隨着多核CPU中並發程序的不斷運行,高速緩存被反復的讀寫,緩存內存行的狀態也會在MESI這四種狀態間反復變化。

  在MESI協議中,抽象出了四種會導致緩存內存行狀態的變化緩存事件:本地讀、本地寫、遠程讀以及遠程寫。緩存事件針對的是某一內存緩存行的事件。

本地讀(Local Read):

  本地讀事件指的是本地核心對自己的緩存行進行讀取。

本地寫(Local Write):

  本地寫事件指的是本地核心對自己的緩存行進行寫入。

遠程讀(Remote Read):

  遠程讀事件指的是總線上的其它核心對某一內存緩存行進行了讀取,當前核心監聽到的事件。

  某一個核心的本地讀事件,對於其他核心就是針對其對應內存緩存行的遠程讀事件。

遠程寫(Remote Write):

  遠程寫事件指的是總線上的其它核心對某一內存緩存行進行了寫入,當前核心監聽到的事件。

  某一個核心的本地寫事件,對於其他核心就是針對其對應內存緩存行的遠程寫事件。

MESI協議緩存行狀態遷移

  緩存事件的發生可能會使得本地/遠程的對應緩存行狀態發生變化。比如當原本處於獨占狀態的本地緩存行監聽到遠程讀事件時,需要將其由Exclusive被獨占轉變為Shared被共享;當監聽到遠程寫事件時,如果發現對應的緩存行存在(此時必定是Shared被共享狀態),此時的內存緩存行便失去了穩定,MESI協議是采取的是寫無效策略,需要將本地對應的緩存行設置為Invalid無效。

  MESI協議中的四種狀態在發生上述四種緩存事件時都可能發生對應的狀態遷移,兩兩組合之后共有4*4=16種情況,下面進行詳細討論。

  本地讀/寫事件和其它核的遠程讀/寫事件是互相對應的,相互之間對照能更好的理解MESI協議的工作機制。

當前緩存行處於Invalid狀態時:

發生local read本地讀事件:

  Invalid無效的緩存行,在發生本地讀事件時,必須從內存或是處於Exclusive狀態的遠程高速緩存中獲取對應的最新數據寫入本地緩存。

  1.當其它核心中都不存在對應緩存行數據時,從內存中獲取。加載后全局有且只有本地緩存中有此緩存行記錄,本地緩存行的狀態由Invalid變成Exclusive。

  2.當其它的某一核心中恰好也存在對應緩存行數據,且狀態為Exclusive或Shared時,從內存或是存在緩存行的核心中獲取。此時由於本地和其它核心都保存了對應緩存行數據,但不獨占緩存行,本地緩存行的狀態由Invalid變成Shared。

  3.當其它的某一核心中恰好也存在對應緩存行數據,且狀態為Modified時,觸發其遠程讀事件,將修改過的最新值寫入內存后,由本地核心從內存中讀取最新的值。此時由於本地和之前狀態為modified的核心都保存了對應緩存行數據,本地緩存行的狀態由Invalid變成Shared。

發生local write本地寫事件:

  Invalid無效的緩存行,在發生本地寫事件時,必須從內存或是處於Exclusive狀態的遠程高速緩存中獲取對應的最新數據寫入本地緩存,再進行修改。

  1.當其它核心中都不存在對應緩存行數據時,從內存獲取並修改。加載后全局有且只有本地緩存中有此緩存行記錄,由於修改過和內存中數據不同,本地緩存行的狀態由Invalid變成Modified。

  2.當其它的某一核心中恰好也存在對應緩存行數據時,且狀態為Exclusive或Shared時,從內存或是存在緩存行的核心中獲取並修改。為了保持高速緩存一致性的穩定,遠端的其它核心中的數據不能與本地核心本地寫的最新數據產生沖突,遠端的其它核觸發遠程寫事件,狀態都設置為Invalid(寫失效協議)。此時全局有且只有本地緩存中有此緩存行記錄,本地緩存行的狀態由Invalid變成Modified。

  2.當其它的某一核心中恰好也存在對應緩存行數據時,且狀態為Modified,觸發其遠程寫事件,將修改過最新值寫入內存后,由本地核心從內存中讀取最新的值並修改。遠端的核心(之前為modified)中的數據不能與本地核心本地寫的最新數據產生沖突,狀態設置為Invalid。此時全局有且只有本地緩存中有此緩存行記錄,本地緩存行的狀態由Invalid變成Modified。

發生remote read遠程讀事件:

  Invalid無效狀態等價於緩存行不存在,不對遠程讀事件進行任何處理,狀態依然為Invalid。

發生remote write遠程寫事件:

  Invalid無效狀態等價於緩存行不存在,不對遠程寫事件進行任何處理,狀態依然為Invalid

當前緩存行處於Exclusive狀態時:

發生local read本地讀事件:

  Exclucive代表本地核獨占當前緩存行。

  本地讀時直接從自己的高速緩存中獲取數據即可,狀態不變,依然為Exclusive。

發生local write本地寫事件:

  Exclucive代表本地核獨占當前緩存行,且數據和內存中一致。

  本地寫會使得緩存中的數據與內存不一致,但依然獨占,狀態由Exclusive變為Modified。

發生remote read遠程讀事件:

  當監聽到遠程讀事件時,意味着當前緩存行已經不再是獨占狀態,而是共享狀態了,狀態由Exclusive變為Shared。

發生remote write遠程寫事件:

  當監聽到遠程寫事件時,意味着當前緩存行的數據已經和本地緩存中的數據不一致了,需要廢棄本地的緩存行,狀態由Exclusive變為Invalid。

當前緩存行處於Shared狀態時:

發生local read本地讀事件:

  Shared代表本地核心和遠程核心共享了緩存行,且數據是最新的。本地讀時直接從自己的高速緩存中獲取數據即可,狀態不變,依然為Shared。

發生local write本地寫事件:

  本地寫會觸發其它核的(處於Shared狀態)遠程寫事件,遠程核的狀態會被統一設置為無效,本地核心將獨占這一緩存行。由於本地寫使得緩存行數據和內存不一致,狀態由Shared變為Modified

發生remote read遠程讀事件:

  當監聽到遠程讀事件時,其並沒有改變全局狀態下緩存行的數據,狀態不變依然為Shared。

發生remote write遠程寫事件:

  當監聽到遠程寫事件時,意味着當前緩存行的數據已經和本地緩存中的數據不一致了,需要廢棄本地的緩存行,狀態由Shared變為Invalid。

當前緩存行處於Modified狀態時:

發生local read本地讀事件:

  Modified代表本地核心獨占當前緩存行,在全局串行寫序列中,本地讀事件讀取的依然是最新的值。本地讀時直接從自己的高速緩存中獲取數據即可,狀態不變,依然為Modified。

發生local write本地寫事件:

  本地寫時依然獨占緩存行,且和內存中數據不一致,狀態不變,依然為Modified。

發生remote read遠程讀事件:

  當監聽到遠程寫事件時,為了使得其獲取到的值是全局串行序列中最近的值,需要先將Modified之后的最新值寫回內存,令最新值對其它核心可見。

  遠程讀事件意味着有其它核心共享了對應的緩存行,本地不再獨占,但數據依然和本地緩存中的值保持一致,狀態由Modified變為Shared。

發生remote write遠程寫事件:

  當監聽到遠程寫事件時,為了使得其獲取到的值是全局串行序列中最近的值,需要先將Modified之后的最新值寫回內存,令最新值對其它核心可見。

  遠程寫事件意味着有其它核心共享了對應的緩存行,本地不再獨占,且本地緩存的數據不再是最新的,需要令其失效,狀態由Modified變為Invalid。

四、MESI協議的優化與內存屏障

  通過MESI協議,在強制串行化的總線事務幫助下能夠始終保持一個全局高速緩存一致的穩定狀態。

  MESI協議依賴總線偵聽機制,在某個核心發生本地寫事件時,為了保證全局只能有一份緩存數據,要求其它核對應的緩存行統統設置為Invalid無效狀態。為了確保總線寫事務的強一致性,發生本地寫的高速緩存需要等到遠端的所有核心都處理完對應的失效緩存行,返回Ack確認消息后才能繼續執行下面的內存尋址指令(阻塞)。

原始MESI協議實現時的性能問題:

  1.對於進行本地寫事件的核心,遠端核心處理失效並進行響應確認相對處理器自身的指令執行速度來說是相當耗時的,在等待所有核心響應的過程中令處理器空轉效率並不高。

  2.對於響應遠程寫事件的核心,在其高速緩存壓力很大時,要求實時的處理失效事件也存在一定的困難,會有一定的延遲。

  不進行優化的MESI協議在實際工作中效率會非常的低下,因此CPU的設計者在實現時對MESI協議進行了一定的改良。

存儲緩存(Store Bufferes)

  針對上述本地寫事件需要等待遠端核心ACK確認,阻塞本地處理器的問題,引入了存儲緩存機制。

  存儲緩存是屬於每個CPU核心的。當使用了存儲緩存后,每當發生本地寫事件時,本地核心不再阻塞的等待遠程核的確認響應,而是將寫入的新值放入存儲緩存中,繼續執行后面的指令。存儲緩存會替處理器接受遠端核心的ACK確認,當對應本地寫事件廣播得到了全部遠程核心的確認后,再提交事務,將其新值寫入本地高速緩存中。存儲緩存的大小是十分有限的,當堆積的事務滿了之后,依然會阻塞CPU,直到有事務提交釋放出新的空間。

  存儲緩存的引入將本地寫事件--->等待遠程寫通知確認消息並提交這一事務,從同步、強一致性變成了異步、最終一致性,提高了本地寫事件的處理效率。

  本地處理器在進行本地讀事件時,由於可能存儲緩存中新修改的數據還未提交到本地緩存中,這就會造成一個核心內,對於同一緩存行其后續指令的讀操作無法讀取到之前寫操作的最新值。為此,在進行本地讀操作時,處理器會先在存儲緩存中查詢對應記錄是否存在,如果存在則會從存儲緩存中直接獲取,這一機制被稱為Store Fowarding

失效隊列(Invalid Queue)

  針對上述遠端核心響應遠程寫事件,實時的將對應緩存行設置為Invalid無效狀態延遲高的問題,引入了失效隊列機制。

  失效隊列同樣是屬於每個CPU核心的。當使用了失效隊列后,每當監聽到遠程寫事件時,對應的高速緩存不再同步的處理失效緩存行后返回ACK確認信息,而是將失效通知存入失效隊列,立即返回ACK確認消息。對於失效隊列中的寫失效通知,會在空閑時逐步的進行處理,將對應的高速緩存中的緩存行設置為無效。失效隊列的引入在很大程度上緩解了存儲緩存空間有限,容易阻塞的問題。

  失效隊列的引入將監聽到遠程寫事件處理失效緩存行--->返回ACK確認消息這一事務,從同步、強一致性變成了異步、最終一致性,提高了遠程寫事件的處理效率。

內存屏障(Memory Barrier)

  存儲緩存和失效隊列的引入在提升MESI協議實現的性能同時,也帶來了一些問題。由於MESI的高速緩存一致性是建立在強一致性的總線串行事務上的,而存儲緩存和失效隊列將事務的強一致性弱化為了最終一致性,使得在一些臨界點上全局的高速緩存中的數據並不是完全一致的。

  對於一般的緩存數據,基於異步最終一致的緩存間數據同步不是大問題。但對於並發程序,多核高速緩存間短暫的不一致將會影響共享數據的可見性,使得並發程序的正確性無法得到可靠保證,這是十分致命的。但CPU在執行指令時,缺失了太多的上下文信息,無法識別出緩存中的內存數據是否是並發程序的共享變量,是否需要舍棄性能進行強一致性的同步。

  CPU的設計者提供了內存屏障機制將對共享變量讀寫的高速緩存的強一致性控制權交給了程序的編寫者或者編譯器。

  內存屏障分為讀屏障寫屏障兩種,內存屏障以機器指令的形式進行工作。

寫屏障

  寫屏障用於保證高速緩存間寫事務的強一致性。當CPU執行寫屏障指令時,必須強制等待存儲緩存中的寫事務全部處理完再繼續執行后面的指令。相當於將存儲緩存中異步處理的本地寫事務做了強一致的同步。

  寫屏障指令執行完后,當前核心位於寫屏障執行前的本地寫事務全部處理完畢,其它的核心都已經接收到了當前所有的遠程寫事件的寫無效通知。

讀屏障

  讀屏障用於保證高速緩存間讀事務的強一致性。當CPU執行讀屏障指令時,必須先將當前處於失效隊列中的寫無效事務全部處理完,再繼續的執行讀屏障后面的指令。相當於將異步隊列中異步處理的遠程寫事務做了強一致的同步。 

  讀屏障指令執行完后,當前核心位於讀屏障執行前的遠程寫無效事務全部處理完畢,對於讀屏障之后的共享數據讀取會得到最新的值。 

  在進行並發程序的開發時,針對關鍵的任務間共享變量的讀寫需要使用內存屏障保證其在多核間高速緩存的一致性。在對共享變量的寫入指令后,加入寫屏障,令新的數據立即對其它核心可見;在對共享變量的讀取指令前,加入讀屏障,令其能獲取最新的共享變量值。

  通過在指令中的適當位置加入讀/寫內存屏障,雖然一定程度上降低了效率,但保證了並發程序在多核高速緩存條件下對於共享變量的可見性,是一個很好的折中解決方案。

五、總結

  由於最近在學習有關硬件和操作系統相關的知識,在看到高速緩存相關的內容時,便想把一直以來都一知半解的MESI協議弄懂。通過廣泛的閱讀有關博客和書籍等資料,理解並整理后寫下了這篇博客,希望能幫到對MESI協議等相關內容感興趣的人。

  MESI協議和內存屏障的知識,在其基礎之上有高級語言中c、java的volatile關鍵字的工作原理,在其下有多核並行處理器、高速緩存、總線等硬件電路工作原理等相關的內容。在學習的過程中,一方面使我更好的理解了更上層的知識,另一方面黑盒子下還有黑盒子,令我感嘆吾生也有涯,而知也無涯。但在學習的過程中,滿足了對底層工作機制的好奇心,有着理解通透之后的快樂,還是挺有意思的。

  本篇博客還存在很多不足之處,請多多指教。

主要參考書籍與博客:  

《並行計算機體系結構》 

《微型計算機硬件技術及應用基礎 微機原理》 鄒逢興 

https://www.cnblogs.com/hello-shf/p/12091591.html

https://cloud.tencent.com/developer/article/1152642

https://www.cnblogs.com/yanlong300/p/8986041.html

https://www.jianshu.com/p/0e036fa7af2a

https://blog.csdn.net/weixin_44936828/article/details/89430358

http://www.wowotech.net/kernel_synchronization/memory-barrier.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM