計算機內存模型(轉)

內存模型,英文名Memory Model,他是一個很老的老古董了。他是與計算機硬件有關的一個概念。編程

CPU和緩存一致性緩存

隨着CPU技術的發展,CPU的執行速度愈來愈快。而因爲內存的技術並無太大的變化,因此從內存中讀取和寫入數據的過程和CPU的執行速度比起來差距就會愈來愈大,這就致使CPU每次操做內存都要耗費不少等待時間。多線程

因此,人們想出來了一個好的辦法,就是在CPU和內存之間增長高速緩存。緩存的概念你們都知道,就是保存一份數據拷貝。他的特色是速度快,內存小,而且昂貴。併發

那麼,當程序在運行過程當中,會將運算須要的數據從主存複製一份到CPU的高速緩存當中,那麼CPU進行計算時就能夠直接從它的高速緩存讀取數據和向其中寫入數據,當運算結束以後,再將高速緩存中的數據刷新到主存當中。編程語言

而隨着CPU能力的不斷提高,一層緩存就慢慢的沒法知足要求了,就逐漸的衍生出多級緩存。優化

按照數據讀取順序和與CPU結合的緊密程度,CPU緩存能夠分爲一級緩存(L1),二級緩存(L2),部分高端CPU還具備三級緩存(L3),每一級緩存中所儲存的所有數據都是下一級緩存的一部分。.net

這三種緩存的技術難度和制形成本是相對遞減的,因此其容量也是相對遞增的。線程

當CPU要讀取一個數據時,首先從一級緩存中查找,若是沒有找到再從二級緩存中查找,若是仍是沒有就從三級緩存或內存中查找。blog

單核CPU只含有一套L1,L2,L3緩存;若是CPU含有多個核心,即多核CPU,則每一個核心都含有一套L1(甚至和L2)緩存,而共享L3(或者和L2)緩存。進程

 

單線程。cpu核心的緩存只被一個線程訪問。緩存獨佔,不會出現訪問衝突等問題。

單核CPU,多線程。進程中的多個線程會同時訪問進程中的共享數據,CPU將某塊內存加載到緩存後,不一樣線程在訪問相同的物理地址的時候,都會映射到相同的緩存位置,這樣即便發生線程的切換,緩存仍然不會失效。但因爲任什麼時候刻只能有一個線程在執行,所以不會出現緩存訪問衝突。

多核CPU,多線程。每一個核都至少有一個L1 緩存。多個線程訪問進程中的某個共享內存,且這多個線程分別在不一樣的核心上執行,則每一個核心都會在各自的cache中保留一份共享內存的緩衝。因爲多核是能夠並行的,可能會出現多個線程同時寫各自的緩存的狀況,而各自的cache之間的數據就有可能不一樣。

在CPU和主存之間增長緩存,在多線程場景下就可能存在緩存一致性問題,也就是說,在多核CPU中,每一個核在本身的緩存中,關於同一個數據的緩存內容可能不一致。

 

處理器優化和指令重排

上面提到在CPU和主存之間增長緩存,在多線程場景下會存在緩存一致性問題。除了這種狀況,還有一種硬件問題也比較重要。那就是爲了使處理器內部的運算單元可以儘可能的被充分利用,處理器可能會對輸入代碼進行亂序執行處理。這就是處理器優化。

除了如今不少流行的處理器會對代碼進行優化亂序處理,不少編程語言的編譯器也會有相似的優化,好比Java虛擬機的即時編譯器(JIT)也會作指令重排。

可想而知,若是任由處理器優化和編譯器對指令重排的話,就可能致使各類各樣的問題。

 

併發編程的問題

原子性是指在一個操做中就是cpu不能夠在中途暫停而後再調度,既不被中斷操做,要不執行完成,要不就不執行。

可見性是指當多個線程訪問同一個變量時,一個線程修改了這個變量的值,其餘線程可以當即看獲得修改的值。

有序性即程序執行的順序按照代碼的前後順序執行。

 

緩存一致性問題其實就是可見性問題

處理器優化是能夠致使原子性問題

指令重排會致使有序性問題

 

參考連接:

http://www.hollischuang.com/archives/2550原文:https://blog.csdn.net/qq_35642036/article/details/82798679 

相關文章
相關標籤/搜索