溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

硬件緩存策略

發(fā)布時(shí)間:2020-07-13 05:30:29 來源:網(wǎng)絡(luò) 閱讀:495 作者:吳之恒心 欄目:網(wǎng)絡(luò)安全

操作系統(tǒng)中的存儲(chǔ)器構(gòu)成了一個(gè)金字塔,越往上的存儲(chǔ)器速度越快,但是價(jià)格也越貴,所以也就越小。為了解決高速的處理器和低速的存儲(chǔ)器之間的矛盾,上一層的存儲(chǔ)器作為下一層存儲(chǔ)器的緩存。

在現(xiàn)代的CPU(大多數(shù))上,所有的內(nèi)存訪問都需要通過層層的緩存來進(jìn)行。CPU的讀/寫(以及取指令)單元正常情況下甚至都不能直接訪問內(nèi)存——這是物理結(jié)構(gòu)決定的;CPU都沒有管腳直接連到內(nèi)存。相反,CPU和一級(jí)緩存(L1 Cache)通訊,而一級(jí)緩存才能和內(nèi)存通訊。大約二十年前,一級(jí)緩存可以直接和內(nèi)存?zhèn)鬏敂?shù)據(jù)。如今,更多級(jí)別的緩存加入到設(shè)計(jì)中,一級(jí)緩存已經(jīng)不能直接和內(nèi)存通訊了,它和二級(jí)緩存通訊——而二級(jí)緩存才能和內(nèi)存通訊。或者還可能有三級(jí)緩存。你明白這個(gè)意思就行。

比如要需要操作內(nèi)存的某個(gè)區(qū)域時(shí),處理器不會(huì)直接去內(nèi)存讀取,而是會(huì)去高速緩存中查看該區(qū)域是不是被調(diào)進(jìn)來了,如果沒有,則把該區(qū)域調(diào)入高速緩沖區(qū)中。那么接下來處理器直接在高速緩存中進(jìn)行讀寫操作。

同樣的,對(duì)于讀取磁盤數(shù)據(jù),處理器把內(nèi)存中的某塊區(qū)域作為磁盤的緩存。那么便可以直接在內(nèi)存中進(jìn)行讀寫。

處理器在緩存中對(duì)數(shù)據(jù)進(jìn)行讀寫操作,但是還是需要把該數(shù)據(jù)寫會(huì)到原來的區(qū)域中去,這接涉及到了一定的策略。

硬件緩存策略

 

寫緩存策略

(1)第一種策略稱為不緩存(nowrite),也就是說高速緩存不去緩存任何寫操作。當(dāng)對(duì)緩存中的數(shù)據(jù)進(jìn)行寫時(shí),將直接跳過緩存,直接寫到磁盤,同時(shí)標(biāo)記緩存的數(shù)據(jù)失效。如果后續(xù)需要進(jìn)行讀操作,需要重新從磁盤讀取數(shù)據(jù)。

(2)第二種策略稱為寫透緩存(write-through cache),即寫操作將自動(dòng)更新緩存,同時(shí)也更新磁盤文件。這種操作對(duì)保持緩存一致性很有好處,所以不需要將緩存標(biāo)記為失效,同時(shí)實(shí)現(xiàn)也比較簡(jiǎn)單。

(3)第三種策略,也是Linux所采用的,稱為回寫(write-back)。在這種策略下,程序執(zhí)行寫操作直接寫到緩存中,但是不會(huì)直接更新磁盤,而是將高速緩存中被寫入的頁(yè)面標(biāo)記成“臟”,并加入臟頁(yè)鏈表中。然后由一個(gè)進(jìn)程(回寫進(jìn)程)周期性將臟頁(yè)鏈表的頁(yè)寫會(huì)到磁盤,從而讓磁盤中的數(shù)據(jù)和緩存中的數(shù)據(jù)一致,最后清理緩存的“臟”頁(yè)標(biāo)志?!芭K”的意思不是說數(shù)據(jù)不干凈,而是說數(shù)據(jù)沒有同步到磁盤。

 

緩存一致性策略

現(xiàn)在的的多處理器的計(jì)算機(jī),每個(gè)CPU都有自己的寄存器和緩存。那么一個(gè)多線程的程序就會(huì)出現(xiàn)這個(gè)問題,線程A更改了緩存A中的數(shù)據(jù),但是緩存B中的數(shù)據(jù)還是原來的數(shù)據(jù),那么線程B去緩存B中讀取的數(shù)據(jù)就是錯(cuò)誤的數(shù)據(jù)。這個(gè)就是緩存一致性的問題了。(注:?jiǎn)栴}的產(chǎn)生是因?yàn)槎嗑彺嬉鸬模?/p>

硬件緩存策略

 

既然問題的產(chǎn)生是因?yàn)槎嗑彺嬉鸬?,那么為什么不讓所有的處理器共享一個(gè)緩存呢?那么在一個(gè)指令周期內(nèi)只有一個(gè)處理器能夠通過一級(jí)緩存運(yùn)行它的指令。這樣效率實(shí)在是太低了。所以就有了緩存一致性協(xié)議。

緩存一致性協(xié)議有多種,但是你日常處理的大多數(shù)計(jì)算機(jī)設(shè)備使用的都屬于“窺探(snooping)”協(xié)議,窺探”背后的基本思想是,所有內(nèi)存?zhèn)鬏敹及l(fā)生在一條共享的總線上,而所有的處理器都能看到這條總線:緩存本身是獨(dú)立的,但是內(nèi)存是共享資源,所有的內(nèi)存訪問都要經(jīng)過仲裁(arbitrate):同一個(gè)指令周期中,只有一個(gè)緩存可以讀寫內(nèi)存。窺探協(xié)議的思想是,緩存不僅僅在做內(nèi)存?zhèn)鬏數(shù)臅r(shí)候才和總線打交道,而是不停地在窺探總線上發(fā)生的數(shù)據(jù)交換,跟蹤其他緩存在做什么。所以當(dāng)一個(gè)緩存代表它所屬的處理器去讀寫內(nèi)存時(shí),其他處理器都會(huì)得到通知,它們以此來使自己的緩存保持同步。只要某個(gè)處理器一寫內(nèi)存,其他處理器馬上就知道這塊內(nèi)存在它們自己的緩存中對(duì)應(yīng)的段已經(jīng)失效。

在直寫模式下,這是很直接的,因?yàn)閷懖僮饕坏┌l(fā)生,它的效果馬上會(huì)被“公布”出去。但是如果混著回寫模式,就有問題了。因?yàn)橛锌赡茉趯懼噶顖?zhí)行過后很久,數(shù)據(jù)才會(huì)被真正回寫到物理內(nèi)存中——在這段時(shí)間內(nèi),其他處理器的緩存也可能會(huì)傻乎乎地去寫同一塊內(nèi)存地址,導(dǎo)致沖突。在回寫模型中,簡(jiǎn)單把內(nèi)存寫操作的信息廣播給其他處理器是不夠的,我們需要做的是,在修改本地緩存之前,就要告知其他處理器。搞懂了細(xì)節(jié),就找到了處理回寫模式這個(gè)問題的最簡(jiǎn)單方案,我們通常叫做MESI協(xié)議(譯者注:MESI是Modified、Exclusive、Shared、Invalid的首字母縮寫,代表四種緩存狀態(tài),下面的譯文中可能會(huì)以單個(gè)字母指代相應(yīng)的狀態(tài))。

其中的Exclusive表示獨(dú)占緩存段,當(dāng)處理器想寫某個(gè)緩存段時(shí),如果它沒有獨(dú)占權(quán),它必須先發(fā)送一條“我要獨(dú)占權(quán)”的請(qǐng)求給總線,這會(huì)通知其他處理器,把它們擁有的同一緩存段的拷貝失效(如果它們有的話)。只有在獲得獨(dú)占權(quán)后,處理器才能開始修改數(shù)據(jù)——并且此時(shí),這個(gè)處理器知道,這個(gè)緩存段只有一份拷貝,在我自己的緩存里,所以不會(huì)有任何沖突。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI