天天看點

java并發系列——底層CPU

java并發有諸多難點,實際上并非java語言本身的問題,本質上說一部分是因為并發操作本身的問題,另外一部分是因為計算機體系結構帶來的。為了更好地了解java并發過程中的問題,我們應該對CPU有一些基礎的認知。

CPU

在資訊時代,CPU是我們耳熟能詳的一個概念,大家都知道CPU就是計算機的大腦。計算機中一連串複雜的指令都是由它負責執行的,而這些指令通常就是我們稱之為程式的東西。那麼CPU到底是什麼呢?CPU即中央處理器,它是計算機中控制資料操控的電路。主要由三部分組成:算術/邏輯單元、控制單元、寄存器單元。

控制單元是整個CPU的指揮控制中心,它的主要職責就是協調機器活動,通過向其他兩個單元發送控制指令來達到控制效果。算數/邏輯單元主要的職責是負責執行運算,包括算術和邏輯運算,它估計控制單元發送過來的指令執行相應的運算操作。寄存器單元主要的作用是用來臨時儲存資料,它儲存着待處理的或者已經處理的資料,它的出現是為了減少CPU對記憶體的通路次數,提升讀取資料的性能,進而提升CPU的整體工作效率。

java并發系列——底層CPU

cpu與記憶體的協作

CPU中的寄存器分為通用寄存器和專用寄存器,通用寄存器用于臨時存放CPU正在使用的資料,而專用寄存器用于CPU專有用途,比如指令寄存器和程式計數器。CPU與主存通過總線進行通信,CPU通過控制單元能夠操作主存中的資料。

java并發系列——底層CPU

-執行兩個數值相加的大緻過程為:從主存讀取第一個操作數放到寄存器A->從主存讀取第二個操作數放到寄存器B->兩個寄存器儲存的值作為輸入送入到加法電路->将加法結果儲存到寄存器C->控制單元将結果放入主存中。

程式等于資料

原始的計算機并不像現代計算機一樣将程式儲存起來,以前的人們隻對資料進行儲存,而裝置執行的步驟作為計算機的一部分而被内置在控制單元中。這樣就很不靈活,最多通過重新布線來提升靈活性。将程式和資料視作相同本質是很大的計算機思維的突破,因為人們一直認為它們是不同的事物,資料應該存放在主存中而程式應該屬于CPU的一部分。

将程式作為資料一樣儲存在主存中大有好處,控制單元能夠從主存讀取程式,然後對它們解碼并執行。當我們要修改執行程式時可以在計算機的主存中修改,而不必對CPU更改或者重新布線。

指令系統

程式包含了大量的機器指令,CPU對這些指令進行解碼并執行。CPU分為兩類體系:精簡指令集計算機(RISC)和複雜指令級計算機(CISC)。RISC提供了最小的機器指令集,計算機效率高速度快且制造成本低。而CISC提供了強大豐富的指令集,能更友善實作複雜的軟體。

機器指令分為三類:資料傳輸類、算術/邏輯類、控制類。

資料傳輸類指令用于将資料從一個地方移動到另一個地方。比如将主存單元的内容加載到寄存器的LOAD指令,反之将寄存器的内容儲存到主存的STORE指令。此外,CPU與其他裝置(鍵盤、滑鼠、列印機、顯示器、磁盤等)進行通信的指令被稱為I/O指令。

算術/邏輯類指令用于讓控制單元請求在算術/邏輯單元内執行運算。這些運算包括算術、與、或、異或和位移等。

控制類指令用于指導程式執行。比如轉移(JUMP)指令,它包括無條件轉移和條件轉移。

指令寄存器與程式計數器

CPU将主存的指令加載進來解碼并執行,其中涉及到兩個重要的寄存器:指令寄存器和程式計數器。指令寄存器用于存儲正在執行的指令,而程式計數器則保持下一個待執行的指令位址。

CPU向主存請求加載程式計數器指定的位址的指令,将其存放到指令寄存器中,加載後将程式計數器的值加2(加入指令長度為2個位元組)。

指令如何執行

比如我們要計算11+22,假設過程為:将主存位址為00的内容加載到寄存器A中->将主存位址為01的内容加載到寄存器B中->将寄存器A和寄存器B的資料相加并将結果儲存到寄存器C->将寄存器C的結果儲存到主存位址為02的位置->end。

這個過程CPU涉及到四個操作:加載(LOAD)、存儲(STORE)、加法(ADD)和停止(HALT)。可以對這些操作進行編碼,比如可以分别用1、2、3、0000表示。

控制器

CPU與其他裝置的通信一般通過控制器來實作,控制器可能在主機闆上,也可能以電路闆形式插到主機闆。控制器本身可以看成是小型計算機,也有自己簡單的CPU。以前每連接配接一種外設都需要購買相應的控制器,而現在随着通用串行總線(USB)稱為通用的标準,很多外設都可以直接用USB控制器作為通信接口。每個控制器都連接配接在總線上,通過總線進行通信。

java并發系列——底層CPU

每個控制器可能被設計成對應一組位址引用,主存則會忽略這些位址引用。當CPU往這些位址發送消息時,其實是直接穿過主存而到控制器的,操作的是控制器而非主存。這種模式稱為存儲映射輸入/輸出。此外,這種模式的另一種實作可以在機器指令中提供特定的操作碼,專門用于與控制器通信,這樣的操作碼稱為I/O指令。

直接存儲器存取

直接存儲器存取(DMA)是一種提升外設通信性能的措施,CPU并非總是需要使用總線,在總線空閑的時間裡控制器能夠充分利用起來。因為控制器都與總線相連接配接,而控制器又有執行指令的能力,是以可以将CPU的一些工作分給控制器來完成。比如在磁盤中檢索資料時,CPU可以将告知控制器,然後由控制器找到資料并放到主存上,期間CPU可以去執行其他任務。這樣可以節省CPU資源。不過DMA會使得總線通信過于複雜,而且會導緻總線競争問題。總線瓶頸源自馮.諾伊曼體系結構。