硬件的效率與一致性:
物理計算機中的併發問題:讓「計算機併發的執行若干個運算任務」與「更充分的利用計算機的處理器效能」的因果關係看起來瓜熟蒂落。
實際上其中一個重要的複雜性來源是絕大多數的運算任務都不可能只靠處理器「計算」就能完成,處理器至少要與內存交互,如讀取運算數據、存儲運算結果,這個IO操做是很難消除的(沒法緊靠寄存器來完成全部的運算任務)。因爲計算機的存儲設備與處理器的運算速度有幾個數量級的差距。全部現代計算機系統加入了一層讀寫速度儘量接近處理器運算速度的高速緩存來做爲內存和處理器之間的緩衝:將運算須要使用到的數據複製到緩存中,讓運算能快速運行,當運算結束後再從緩存同步到內存中,只要處理器就無須等待慢 的內存讀寫了。
基於高速緩存的存儲交互很好的解決了處理器與內存的速度矛盾,可是也爲計算機系統帶來了更高的複雜度,由於他引入了一個新問題:緩存一致性。
在多處理器系統中,每一個處理器都有本身的高速緩存,而他們有共享同一主內存。當多處理器的運算任務涉及到同一塊的主內存區域時,將可能致使各自的緩存數據不一致。爲了解決一致性的問題,須要各個處理器訪問緩存時都遵循一些協議,這類協議有MSI、MESI、MOSI、Synapes、firefly以及Dragon Protocol等。
下面講到的「內存模型」能夠理解爲是在特定的操做協議下,對特定的內存或者高速緩存進行讀寫訪問的過程抽象。
不一樣架構的物理機器能夠擁有不同的內存模型,而java虛擬機也有本身的內存模型,而java的內存訪問操做和硬件的緩存訪問操做具備可比性。 java
除了增長高速緩存以外,爲了使得處理器內部的運算單元儘量的被充分利用,處理器可能會對輸入的代碼進行亂序執行優化,處理器會在計算以後將亂序執行的結果重組保證該結果與順序執行的結果一直,但不保證程序中各個語句計算的前後順序與輸入的代碼的順序一致。
與處理器的亂序執行優化相似,java虛擬機的即時編譯器中也有相似的指令重排序優化。 緩存