CPU 讀取存儲器數(shù)據(jù)過程
CPU 要取寄存器XX的值版保,只需要一步:直接讀取
CPU 要取 L1 cache的某個值,需要1-3步(或者更多):把 cache 行鎖住亏镰,把某個數(shù)據(jù)拿來摧莽,解鎖旺遮,如果沒鎖住就慢了
CPU 要取 L2 cache 的某個值医寿,先要到 L1 cache 里取栏赴,L1 當(dāng)中不存在,在 L2 里靖秩,L2 開始加鎖须眷,加鎖以后,把L2里的數(shù)據(jù)復(fù)制到L1沟突,再執(zhí)行讀L1的過程花颗,上面的3步,再解鎖
CPU 取 L3 cache的也是一樣惠拭,只不過先由 L3 復(fù)制到 L2捎稚,從 L2 復(fù)制到 L1,從 L1 到 CPU
CPU 取內(nèi)存則最復(fù)雜:通知內(nèi)存控制器占用總線帶寬求橄,通知內(nèi)存加鎖,發(fā)起內(nèi)存讀請求葡公,等待回應(yīng)罐农,回應(yīng)數(shù)據(jù)保存到 L3(如果沒有就到 L2),再從 L3/2到L1催什,再從 L1 到 CPU涵亏,之后解除總線鎖定
1. 當(dāng) CPU1 從主內(nèi)存中取共享變量 X=2 時,通過上述 CPU讀取數(shù)據(jù)的過程將數(shù)據(jù)讀取到 CPU 緩存 L1 中蒲凶,此時只有 CPU1 緩存行得到共享變量X气筋,X 的狀態(tài)則為 E,CPU1 的緩存行會時刻的監(jiān)聽嗅探 bus總線
2. 當(dāng) CPU2 也從主內(nèi)存中取共享變量 X=2 時旋圆,CPU1 的緩存行會嗅探到CP2 對共享變量X 的操作宠默,此時 CPU1 和 CPU2 的緩存行中 X 的狀態(tài)會變成 S
3. 當(dāng) CPU1 對 X 進行+1 操作時,寄存器將 L1 cache 的數(shù)據(jù)讀取灵巧,并對 X+1 ,將 X=3 賦值給緩存行 L1 cache搀矫,L1 cache 的 X =3 通知 L2 cache,L2 cache 再通知 L3 cache 刻肄,最終 CPU 緩存上的 X 都是 3瓤球,然后 X=3 將會寫到 主內(nèi)存中,這個回寫的過程敏弃,CPU1 的 X 狀態(tài) 會變成 M 卦羡,而 CPU2 的緩存行通過 bus 總線嗅探到 主內(nèi)存X 變量的值改變了,此時 CPU2 的 X 狀態(tài)就會變成 I ,即該緩存行無效绿饵。
4. CPU1 緩存行 X 的值回寫到主內(nèi)存后欠肾,CPU1 緩存行的 X 狀態(tài)又會變成 E
以上為個人理解