現代計算機理論模型,工作原理,以及硬件是如何實現併發安全

 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的利用率,但是他也有使用的限制,也就是緩存行,當該數據的長度超過了該緩存航的最大容量,那麼他只能使用總線鎖來保證併發的安全。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章