1.馮·諾依曼體系 現代電腦的模型都是基於馮·諾依曼體系的,馮·諾依曼體系的基本組成有存儲器,計數器,控制器,輸入和輸出設備,總共有這五大本分組成。下圖是我基於這五大組成部分畫了一個組成圖來表示他們之間的關係,如圖1-1。 圖1-1 基於馮·諾依曼體系,首先控制器從記憶體中取出指令,有控制器來執行, ...
1.馮·諾依曼體系
現代電腦的模型都是基於馮·諾依曼體系的,馮·諾依曼體系的基本組成有存儲器,計數器,控制器,輸入和輸出設備,總共有這五大本分組成。下圖是我基於這五大組成部分畫了一個組成圖來表示他們之間的關係,如圖1-1。
圖1-1
基於馮·諾依曼體系,首先控制器從記憶體中取出指令,有控制器來執行,控制器通過計數器來完成各種邏輯運算,算術運算等,然後將數據寫會記憶體,輸入設備輸出設備更是常見,在這裡就不一一贅述,重點是下麵的內容。
2.電腦的硬體結構
電腦的硬體結構更是基於馮·諾依曼體系的,主板上主要由cpu,記憶體,匯流排等重要部件組成,其大致的示意圖如下圖2-1所示:
圖2-1
cpu是主板上的核心部件,主要負責指令的執行,記憶體通過記憶體匯流排和I/O橋相連,在這裡I/O橋可最大程度的解決cpu與記憶體速度不匹配的問題,一般cpu的速度是gHZ為單位的,而記憶體條則是幾百兆HZ為單位,兩者存在速度不匹配的問題,在這裡I/O橋可以緩解兩者速度不匹配,還有一個也能緩解cpu與記憶體的速度不匹配的問題,那就是cpu緩存,她的速度很快,但是成本相對較高,不適合記憶體條大量使用,因此apu緩存很小,但它可有效的緩解此問題。
匯流排是cpu與其他部件交互的通道,可通過USB控制器鏈接滑鼠,鍵盤等,圖形適配器可鏈接顯示器等。
3.多cpu緩存架構
多cpu在與記憶體交互的時候,是存在併發安全的問題的,當一個主板上有多個cpu時,和cpu多核又是不一樣的,在這裡就來講講多cpu時,cpu是怎麼從記憶體讀取數據,並保證他們的併發安全,這裡完全是從硬體層次來講,這對後面去學習併發,線程和JMM,以及JVM有很大的幫助,有些軟體層次的技術實現,完全是基於現有的硬體基礎。
多cpu的情況下,當其中一個cpu從記憶體讀取數據,放入cpu緩存,如果該cpu對這個數據要進行修改,這個時候,另一個cpu剛好也從記憶體讀取了該數據,也要對他進行修改,那麼當兩個cpu同事從該記憶體中讀取該數據,並對他進行邏輯,算術等運算是,這個時候記憶體中在接受cpu返回的該數據是不准確的,就存在了併發的安全問題(技術在不斷發展,cpu從以前的單核,一些cpu廠家有段時間一致於追求提高cpu的運算頻率,到後來發現cpu的頻率提高達到了瓶頸,要想在提高cpu的運算速度,光靠提高頻率是遠遠不夠的,這個時候,一些技術大牛們就想到了單個cpu多核,這樣就立竿見影的提高了cpu的速度)。這個時候就有了匯流排鎖和後來的緩存一致性協議來實現併發安全。下圖是我多cpu與記憶體交互的一個簡圖,見下圖3-1。
圖3-1
先講講匯流排鎖,匯流排鎖很簡單,早期奔騰cpu只能依靠匯流排鎖來解決併發的問題,當一個cpu讀取了記憶體中的某個數據的時候,該cpu對匯流排加了把鎖:lock。當其他cpu通過匯流排去訪問記憶體的該數據時是訪問不了的,這就是匯流排鎖。匯流排所有很多缺點,比如cpu的利用率低,當多個cpu同時對一個數據訪問時,只能有一個cpu能拿到這把匯流排鎖,其他cpu只能處於低效率狀態。匯流排鎖在早期的奔騰系列的cpu用的很多,到了後來的酷睿以及新的一些cpu絕大部分使用緩存一致性協議,下麵我就來詳細說明一下MESI緩存一致性協議,當cpu從主存中讀取了該數據進入cpu的緩存行(catch line)中的時候,並且其他cpu沒有讀取該數據,該緩存行的狀態為E狀態(Exclusive),也就是獨享狀態,這個時候如果該對該緩存行進行了修改,那麼該緩存行的狀態就會變成M狀態(Modified),也就是修改狀態,表示該緩存行的數據修改了,與記憶體中的數據不一致,當該cpu監聽到其他cpu也要讀取該數據的時候,那麼,該緩存行的狀態會變成S狀態(Shared),也就是共用狀態,cpu會在一個特定的時間節點將數據協會記憶體(下篇博文中講到兩個線程讀取記憶體一個變數的時候,會用到這個知識點),保證緩存行的數據與記憶體一致,從而其他cpu也可以讀取該數據。其中該緩存行在S狀態的時候,也會去監聽其他緩存行的消息,當其他緩存行變成M狀態的時候,此時該緩存行就會變成I狀態(Invalid),也就是無效狀態,當有條件觸發需要該數據的時候,會重新從記憶體中讀取該數據。MESI緩存一致性協議依賴於匯流排的嗅探機制,該機制時刻監聽cpu中緩存行的狀態,並通過匯流排發消息來將緩存航狀態發送給其他緩存行。
在這裡需要註意的是,現代的酷睿系列處理器雖然用的很多MESI緩存一致性協議,保證了cpu的利用率,但是他也有使用的限制,也就是緩存行,當該數據的長度超過了該緩存航的最大容量,那麼他只能使用匯流排鎖來保證併發的安全。