cpu內部,多個核心之間有一條環形匯流排,當有某乙個核心需要鎖住cache的時候,這個匯流排會通知所有的核心,所以只要有某個核心使用了cmpxchg,那麼其它的核肯定都會停下來,不會出現併發的情況。
重要的是這個快取一致性協議是如何工作的,查閱了資料發現確實在快取一致性協議這裡一筆帶過了(「快取一致性協議使得不存在兩個cpu同時寫記憶體」)
大致意思為多cpu的架構下每個cpu都有一組cache,其中我們讀寫cache會依照他們的狀態進行不同的操作,之後會切換cache的狀態,同時這樣的讀寫操作是原子的,既在同一時間只會有乙個cpu讀寫操作。所以不會出現同時讀寫。在這樣的前提下,我們的主要問題變成了如何保證多個cpu的多個cache之間和主記憶體保持一致?或者是既然cpu的讀寫是原子的,那多個cpu的多個cache之間如何保持資料不會讀或寫到錯誤的值?
主裝置(外部裝置或cpu)進行記憶體訪問時,會先訪問自己的cache,沒有命中就找別人cpu的cache,如果都沒有找到就重新從主記憶體讀。這是讀。寫的時候肯定也是先在自己的cache上寫,如果cache命中則修改自己的cache,此時會根據狀態可能設定其他cpu相應cache行無效,具體什麼狀態自己查。(比如說共享讀了同一塊資料)如果cache沒有命中,而在其他cpu的cache命中時會根據相應狀態更改,其他cache未改變時,自己的cache重讀乙份進行修改,其他cache相應行標記為失效,其他cache標記已修改時,將相應cache存入記憶體,再標記為失效,自己的cache重讀乙份修改。
如果未命中其他cache也未命中那顯然你修改的就是最新的資料
首先如果多cpu讀寫同一記憶體或者使用同一快取的話,這裡會有匯流排鎖,處理器提供#lock訊號阻塞其他cpu的請求。此外多cpu且每個cpu都有自己的快取,有兩個或以上讀寫相同記憶體對映的快取時,各個cpu會根據自己的快取的狀態分別操作,此時是快取一致性協議發揮作用的地方。快取一致協議有很多種,資料中經常出現的mesi協議就是區分了四個快取行狀態更改,獨佔,共享,無效。獨佔的只會有乙個cpu的快取行有效其他快取無法持有,共享的寫的時候會將其他共享的設定為無效,無效的寫的時候會在讀乙份,更改的會將更改的寫入記憶體。同時cpu會窺探其他cpu對快取的操作
對於多執行緒程式,單核cpu與多核cpu是怎麼工作的
1.多執行緒在單核和多核cpu上的執行效率問題的討論 a1 多執行緒在單cpu中其實也是順序執行的,不過系統可以幫你切換那個執行而已,其實並沒有快 反而慢 多個cpu的話就可以在兩個cpu中同時執行了.a2 單核cpu上執行的多執行緒程式,同一時間只能乙個執行緒在跑,系統幫你切換執行緒而已,系統給每...
MySQL5 5對多核CPU的支援
今天測試一台機器能大概支撐多少mysql例項的時候,意外的發現原來mysql 5.5對多核的支援也相當不錯,以前不是到處說mysql乙個很大的缺陷就是不能很好的利用好cpu麼?看來mysql 5.5還是不錯的,測試工具是sysbench,test mode oltp,每個例項的buffer 12g,...
vxWorks系統中多核cpu的使能
平台介紹 vxworks6.7,cpu為loongson3a1000 4核 基本過程就是首先0號cpu初始化 這段 還沒分析 之後就是0號cpu對1,2,3號cpu進行初始化。這裡主要記錄下對0號之外的cpu的初始化。函式呼叫 usrroot usrsmpinit kernelcpuenablein...