日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747


什么是緩存一致性問題?如何解決呢?

 

當程序在運行過程中,會將運算需要的數據從主存復制一份到CPU高速緩存中,那么CPU進行計算時就可以從它的高速緩存讀取數據和向其中寫入數據,當運算結束后,再將高速緩存中的數據刷新到主存當中。舉個簡單的例子,比如下面的這段代碼:

當線程執行這個語句時,會先從主存當中讀取i的值,然后復制一份到高速緩存當中,然后CPU執行指令對i指令進行加1操作,然后將數據寫入高速緩存,最后將高速緩存中i最新的值刷新到主存當中。

這個代碼在單線程中運行時沒有任何問題的,但是在多線程中運行就會有問題了。在多核CPU中,每條線程可能運行于不同的CPU中,因此每個線程運行時有自己的高速緩存(對單核CPU來說,其實也會出現這種問題,只不過是以線程調度的形式來分別執行的)。我們以多核CPU為例。

比如同時有兩個線程執行這段代碼,假如初始時i的值為0,那么我們希望兩個線程執行完之后i的值變為2。但事實會是這樣嗎?

可能存在下面一種情況:初始時,兩個線程分別讀取i的值存入各自所在的CPU的高速緩存當中,然后線程1進行加1操作,然后把i的最新值1寫入到內存。此時線程2的高速緩存當中i的值還是0,進行加1操作后,i的值為1,然后線程2把i的值寫入內存。

最終結果i的值是1,而不是2。這就是著名的緩存一致性問題。通常稱這種被多個線程訪問的變量為共享變量。

也就是說,如果一個變量在多個CPU中都存在緩存(一般在多線程編程時才會出現),那么就可能存在緩存不一致的問題。

為了解決緩存不一致問題,通常來說有以下2種解決方法:

1)通過在總線加LOCK,鎖的方式;

2)通過緩存一致性協議;

在早期的CPU中,是通過在總線上加LOCK鎖的形式來解決緩存不一致的問題。因為CPU和其他部件進行通信都是通過總線來進行的,如果對總線加LOCK鎖的話,也就是說阻塞了其他CPU對其它部件訪問(如內存),從而使得只能有一個CPU能使用這個變量的內存。比如上面例子中,如果一個線程在執行i = i +1,如果在執行這段代碼的過程中,在總線上發出了LOCK鎖的信號,那么只有等待這段代碼完全執行完畢之后,其他CPU才能從變量i所在的內存讀取變量,然后進行相應的操作。這樣就解決了緩存不一致的問題。

但是上面的方式會有一個問題,由于在鎖住總線期間,其他CPU無法訪問內存,導致效率低下。

所以就出現了緩存一致性協議。該協議保證了每個緩存中使用的共享變量的副本是一致的。它的核心思想是:當CPU向內存寫入數據時,如果發現操作的變量是共享變量,即在其他CPU中也存在該變量的副本,會發出信號通知其他CPU將該變量的緩存行置為無效狀態,因此當其他CPU需要讀取這個變量時,發現自己緩存中緩存該變量的緩存是無效的,那么它就會從內存重新讀取。

分享到:
標簽:緩存 一致性
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定