解決CPU,記憶體,I/O設備之間的速度差
- CPU 增加了快取,以均衡與記憶體的速度差異,// 導致
可見性問題 - 作業系統增加了行程、執行緒,以分時復用 CPU,進而均衡 CPU 與 I/O 設備的速度差異,// 導致
原子性問題 - 編譯程式優化指令執行次序,使得快取能夠得到更加合理地利用,// 導致
有序性問題
可見性問題(CPU快取造成的)
為什么要加CPU快取
CPU快取的容量比記憶體小的多但是交換速度卻比記憶體要快得多,快取的出現主要是為了解決CPU運算速度與記憶體讀寫速度不匹配的矛盾,因為CPU運算速度要比記憶體讀寫速度快很多,這樣會使CPU花費很長時間等待資料到來或把資料寫入記憶體,
也就是說CPU不充記憶體里直接讀資料,而是沖CPU快取里讀資料,
多核時代
首先,單核是不存在可見性問題的,為了提高計算機的性能,CPU從單核發展為多核,
單核快取與執行緒關系

對于
變數A被快取到CPU的快取中,執行緒1和執行緒2由同一個CPU執行,變數A對于執行緒1和執行緒2都是可見的,因此單核CPU不存在可見性問題
多核處理器的可見性問題

執行緒1由CPU1執行需要讀取變數A,執行緒2由CPU2執行需要讀取變數B,但是如果執行緒2要讀取變數A,但是變數A在CPU1的快取里,變數A對于執行緒2不可見,同理變數B對于執行緒1不可見
原子性問題(多執行緒)

執行緒1和執行緒2分別在CPU1和CPU2中執行,兩個執行緒同時將變數count從記憶體中讀取到CPU快取中,執行緒1首先將資料處理(計數器加1)完成,然后寫入記憶體,然后執行緒2將資料處理完,然后寫入記憶體,實際上,兩個執行緒分別對計數器進行加1,count本應該等于2,但是在這種極限的情況先count等于1,這就是原子性問題,
有序性問題(指令重排造成)
在說有序性之前,我們必須先來說一下指令重排,因為如果沒有指令重拍的話,也就不存在有序性問題了,
指令重排是指編譯器和處理器在不影響代碼單執行緒執行結果的前提下,對源代碼的指令進行重新排序執行,這種重排序執行是一種優化手段,目的是為了處理器內部的運算單元能盡量被充分利用,提升程式的整體運行效率,
重排序分為以下幾種:
- 編譯器優化的重排序,編譯器在不改變單執行緒程式語意的前提下,可以重新安排陳述句的執行順序,
- 指令級并行的重排序,現代處理器采用了指令級并行技術來將多條指令重疊執行,如果不存在資料依賴性,處理器可以改變陳述句對應機器指令的執行順序,
- 記憶體系統的重排序,由于處理器使用快取和讀/寫緩沖區,這使得加載和存盤操作看上去可能是在亂序執行,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/278116.html
標籤:其他
上一篇:JVM——(1)為什么學習虛擬機
下一篇:第十二屆藍橋杯B組C/C++省賽
