java併發-緩存一致性協議和內存屏障的思考和理解

################這是之前的思考

內存屏障只是保證清空流水線,如何保證高速緩存的內容更新到最新或刷新到主存呢?這個問題突然想到了,不知道這個需要怎回答。

內存屏障保證的CPU執行執行序列能夠順序執行,而不是亂序執行。當然,前提是編譯器沒有重排指令,JVM沒有重排執行,有了這兩個前提,再保證CPU不重排執行,不亂序執行。

緩存一致性協議是保證多個CPU的高速緩存和主存的數據的一致性的問題。

################這是最近的思考

緩存一致性協議是一種維護多個CPU的緩存數據一致性的協議。

能夠保證多個CPU高效實用緩存內的數據。

1.每個CPU讀數據,都優先從所有高速緩存內查找,當找不到,纔會從主存中查找,然後緩存到自己所屬的高速緩存當中。

2.每個緩存行都具有一種狀態,這種狀態標識了當前緩存的數據,在其餘高速緩存中是否有複製,是否是最新的。

最簡單的MESI協議,每個緩存行具有四種狀態。

內存屏障其實是作用於CPU和緩存之間的存儲緩衝區的。

當使用內存屏障指令,就會將存儲緩存區中的數據刷新到緩存的緩存行中。從而得到數據訪問的順序一致性。

當然,還有一部分功能就是防止CPU指令流水線的指令重排序,讓內存屏障指令前面的指令都執行完,才執行內存屏障後面的指令。

################################

按照道理,CPU應該只能和緩存打交道,我感覺應該確實如此。

CPU不會直接訪問內存,因爲這樣效率太低,緩存作爲一箇中間的組件,用來從內存中加載數據,然後緩存起來,提供給CPU使用。

當CPU要讀數據的時候,向緩存請求數據,如果緩存中存在,那麼直接返回,如果緩存中不存在,那麼就向其他的CPU核心的緩存請求,如果還不存在,則從內存中加載。

當CPU要加載數據的時候,將數據先暫存到寫緩衝區中,當寫緩衝區滿了,才被動的寫入到緩存,注意!!!這裏依然沒有寫入到內存。其實,是當寫緩衝區寫數據發生寫缺失,纔會真正的向內存中寫數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章