1. 程式人生 > >硬體效率與快取一致性

硬體效率與快取一致性

  絕大多數的計算任務都不可能只靠處理器計算就能完成,處理器至少要跟記憶體互動,如讀取運算資料、儲存運算結果等,這個I/O是很難消除的,無法僅靠暫存器來完成所有的計算任務。由於計算機儲存裝置與處理器的運算速度有個數量級的差距(即便儲存裝置使用SSD,還是比處理器慢幾個數量級),所以計算機系統不得不增加一層讀寫速度儘可能接近處理器速度的快取記憶體Cache來作為記憶體和處理器之間的緩衝:將運算需要使用到的資料複製到快取中,讓運算能快速執行,當運算結束後再從快取同步到記憶體之中,這樣處理器就無需等待緩慢的記憶體讀寫操作了。

  基於快取記憶體的儲存互動解決了處理器和記憶體的速度矛盾,但是引入了一個新問題:快取一致性(Cache Coherence)。在多處理器系統中,每個處理器都有自己的快取記憶體,而它們又共享同一個主記憶體(Main Memory),當多個處理器的運算任務都涉及同一塊主記憶體區域時,將可能導致各自的快取資料不一致,這樣,將快取資料同步到主記憶體時將以誰的快取資料為準呢?為了解決快取一致性問題,需要再讀寫時根據協議來進行操作,這類協議有MSI、MESI、MOSI、Synapse、Firefly和Dragon Protocol等。不同的物理機器有不一樣的記憶體模型,而Java虛擬機器也有自己的記憶體模型。記憶體模型指在特定的操作協議下,對特定的記憶體或快取記憶體進行讀寫訪問的過程抽象。

      除了增加快取記憶體外,為了使處理器內部的運算單元儘量被充分利用,處理器可能會對輸入的程式碼進行亂序執行(流水線指令)優化,處理器會在計算之後將亂序執行的結果重組,保證該結果與順序執行的結果是一致的,但不保證程式中各個語句計算的先後順序與輸入程式碼中的順序一致,因此,如果存在一個計算任務依賴另外一個計算任務的中間結果,那麼其順序性並不能靠在程式碼中的先後順序來保證。類似地,Java虛擬機器的JIT中也有指令重排序優化。

來自《深入理解Java虛擬機器》