① 緩存一致性
在現代的 CPU(大多數)上,所有的內存訪問都需要通過層層的緩存來進行。CPU 的讀 / 寫(以及取指令)單元正常情況下甚至都不能直接訪問內存——這是物理結構決定的;CPU 都沒有管腳直接連到內存。相反,CPU 和一級緩存(L1 Cache)通訊,而一級緩存才能和內存通訊。大約二十年前,一級緩存可以直接和內存傳輸數據。如今,更多級別的緩存加入到設計中,一級緩存已經不能直接和內存通訊了,它和二級緩存通訊——而二級緩存才能和內存通訊。或者還可能有三級緩存。
緩存是分「段」(line)的,一個段對應一塊存儲空間,大小是 32、64或128位元組,每個緩存段知道自己對應什麼范圍的物理內存地址。
當 CPU 看到一條讀內存的指令時,它會把內存地址傳遞給一級數據緩存。一級數據緩存會檢查它是否有這個內存地址對應的緩存段。如果沒有,它會把整個緩存段從內存(或者從更高一級的緩存,如果有的話)中載入進來。是的,一次載入整個緩存段,這是基於這樣一個假設:內存訪問傾向於本地化(localized),如果我們當前需要某個地址的數據,那麼很可能我們馬上要訪問它的鄰近地址。一旦緩存段被載入到緩存中,讀指令就可以正常進行讀取。
如果我們只處理讀操作,那麼事情會很簡單,因為所有級別的緩存都遵守以下規律—— 在任意時刻,任意級別緩存中的緩存段的內容,等同於它對應的內存中的內容。 。
一旦我們允許寫操作,事情就變得復雜一點了。這里有兩種基本的寫模式:直寫(write-through)和回寫(write-back)。直寫更簡單一點:我們透過本級緩存,直接把數據寫到下一級緩存(或直接到內存)中,如果對應的段被緩存了,我們同時更新緩存中的內容(甚至直接丟棄),就這么簡單。這也遵守前面的定律: 緩存中的段永遠和它對應的內存內容匹配。
回寫模式就有點復雜了。緩存不會立即把寫操作傳遞到下一級,而是僅修改本級緩存中的數據,並且把對應的緩存段標記為「臟」段。臟段會觸發回寫,也就是把裡面的內容寫到對應的內存或下一級緩存中。回寫後,臟段又變「干凈」了。當一個臟段被丟棄的時候,總是先要進行一次回寫。回寫所遵循的規律有點不同。 當所有的臟段被回寫後,任意級別緩存中的緩存段的內容,等同於它對應的內存中的內容。
換句話說,回寫模式的定律中,我們去掉了「在任意時刻」這個修飾語,代之以弱化一點的條件:要麼緩存段的內容和內存一致(如果緩存段是干凈的話),要麼緩存段中的內容最終要回寫到內存中(對於臟緩存段來說)。
只要系統只有一個 CPU 核在工作,一切都沒問題。如果有多個核,每個核又都有自己的緩存,那麼我們就遇到問題了,因為如果一個 CPU 緩存了某塊內存,那麼在其他 CPU 修改這塊內存的時候,我們希望得到通知。系統的內存在各個 CPU 之間無法做到與生俱來的同步,我們需要一個大家都能遵守的方法來達到同步的目的。
緩存一致性協議有多種,但是日常處理的大多數計算機設備使用的都屬於「窺探(snooping)」協議。
窺探」背後的基本思想是,所有內存傳輸都發生在一條共享的匯流排上,而所有的處理器都能看到這條匯流排:緩存本身是獨立的,但是內存是共享資源,所有的內存訪問都要經過仲裁(arbitrate):同一個指令周期中,只有一個緩存可以讀寫內存。窺探協議的思想是,緩存不僅僅在做內存傳輸的時候才和匯流排打交道,而是不停地在窺探匯流排上發生的數據交換,跟蹤其他緩存在做什麼。所以當一個緩存代表它所屬的處理器去讀寫內存時,其他處理器都會得到通知,它們以此來使自己的緩存保持同步。只要某個處理器一寫內存,其他處理器馬上就知道這塊內存在它們自己的緩存中對應的段已經失效。
在直寫模式下,這是很直接的,因為寫操作一旦發生,它的效果馬上會被「公布」出去。但是如果混著回寫模式,就有問題了。因為有可能在寫指令執行過後很久,數據才會被真正回寫到物理內存中——在這段時間內,其他處理器的緩存也可能會傻乎乎地去寫同一塊內存地址,導致沖突。在回寫模型中,簡單把內存寫操作的信息廣播給其他處理器是不夠的,我們需要做的是,在修改本地緩存之前,就要告知其他處理器。
MESI 是四種緩存段狀態的首字母縮寫,任何多核系統中的緩存段都處於這四種狀態之一。
從CPU讀寫角度來說:
上圖的切換解釋:
緩存的一致性消息傳遞是要時間的,這就使其切換時會產生延遲。當一個緩存被切換狀態時其他緩存收到消息完成各自的切換並且發出回應消息這么一長串的時間中CPU都會等待所有緩存響應完成。可能出現的阻塞都會導致各種各樣的性能問題和穩定性問題。
比如你需要修改本地緩存中的一條信息,那麼你必須將I(無效)狀態通知到其他擁有該緩存數據的CPU緩存中,並且等待確認。等待確認的過程會阻塞處理器,這會降低處理器的性能。因為這個等待遠遠比一個指令的執行時間長的多。
為了避免這種CPU運算能力的浪費,Store Bufferes被引入使用。處理器把它想要寫入到主存的值寫到緩存,然後繼續去處理其他事情。當所有失效確認(Invalidate Acknowledge)都接收到時,數據才會最終被提交。
執行失效也不是一個簡單的操作,它需要處理器去處理。另外,存儲緩存(Store Buffers)並不是無窮大的,所以處理器有時需要等待失效確認的返回。這兩個操作都會使得性能大幅降低。為了應付這種情況,引入了失效隊列——對於所有的收到的Invalidate請求,Invalidate Acknowlege消息必須立刻發送,Invalidate並不真正執行,而是被放在一個特殊的隊列中,在方便的時候才會去執行,處理器不會發送任何消息給所處理的緩存條目,直到它處理Invalidate。
② 如何有效進行數據同步備份
網路搜索FastCopy2.11漢化版,下載安裝。
怎樣高效進行數據的本地備份
運行FastCopy,界面很是樸素。
要選擇需要備份的內容,請單擊「來源」按鈕。
怎樣高效進行數據的本地備份
此時彈出一個對話框,若需要選擇的備份內容是文件夾,那就直接選擇吧,如圖所示。本例中我們選擇了「F:\A_工作\重要資料」文件夾作為需要備份的文件夾。
怎樣高效進行數據的本地備份
對於本例的目的而言,當然推薦選擇上面以文件夾為備份對象的方式。
這里順便介紹一下,如果需要選擇的備份內容是文件,請單擊右上方的「選擇文件」按鈕,進入文件選擇對話框。在這里一次可以選擇多個文件。
怎樣高效進行數據的本地備份
來源選擇好了,我們插上用作備份存儲空間的移動硬碟,單擊如圖「目標」按鈕,定位到剛插上的移動硬碟中,需要使用的文件夾。本例直接選擇了根目錄。
怎樣高效進行數據的本地備份
單擊「目標」下面的下拉列表框,在其中選中「同步-如重名,則僅復制大小與時間不同的文件」這一項。
怎樣高效進行數據的本地備份
到這里前期的設置工作就全部完成了。
單擊「執行」按鈕,即可開始首次備份操作。
怎樣高效進行數據的本地備份
③ java 緩存 同步
有以下幾種方式可以實現:
1. 使用共享緩存:memcached 或者 redis。緩存共享,不存在不同步問題!
2. 應用觀察者設計模式。當其中一台伺服器更新緩存時,通知其他伺服器更新緩存。不過需要一個中介者伺服器作為伺服器轉發請求,通知所有其他伺服器端,就像QQ:客戶端——伺服器——客戶端。
3. 應用責任鏈設計模式。首先,讓每一台伺服器彼此相連接,形成一個責任鏈,並讓首尾節點相連,即:形成一個環。當一台伺服器接收到請求時,首先檢查本地緩存,如果存在則返回,否則,對本伺服器的下一個節點伺服器進行查找,如果找到則將其信息復制到本伺服器中並返回。如此進行下去,直到滿足一下兩個條件之一: 查找到相匹配的內容,或者已經遍歷整個環沒有找到。
結論:第一種方式存儲的數據量少,無冗餘,易操作,效率較高;第二、三種方式每台伺服器都存儲了相同的內容,容易造成數據臟讀或臟寫,而且執行效率比較低。
以上希望對你有幫助!
④ 電腦的緩存指的是什麼
CPU緩存(Cache
Memory)位於CPU與內存之間的臨時存儲器,它的容量比內存小但交換速度快。在緩存中的數據是內存中的一小部分,但這一小部分是短時間內CPU即將訪問的,當CPU調用大量數據時,就可避開內存直接從緩存中調用,從而加快讀取速度。由此可見,在CPU中加入緩存是一種高效的解決方案,這樣整個內存儲器(緩存+內存)就變成了既有緩存的高速度,又有內存的大容量的存儲系統了。緩存對CPU的性能影響很大,主要是因為CPU的數據交換順序和CPU與緩存間的帶寬引起的。
緩存是為了解決CPU速度和內存速度的速度差異問題。內存中被CPU訪問最頻繁的數據和指令被復制入CPU中的緩存,這樣CPU就可以不經常到象「蝸牛」一樣慢的內存中去取數據了,CPU只要到緩存中去取就行了,而緩存的速度要比內存快很多。
這里要特別指出的是:
1.因為緩存只是內存中少部分數據的復製品,所以CPU到緩存中尋找數據時,也會出現找不到的情況(因為這些數據沒有從內存復制到緩存中去),這時CPU還是會到內存中去找數據,這樣系統的速度就慢下來了,不過CPU會把這些數據復制到緩存中去,以便下一次不要再到內存中去取。
2.因為隨著時間的變化,被訪問得最頻繁的數據不是一成不變的,也就是說,剛才還不頻繁的數據,此時已經需要被頻繁的訪問,剛才還是最頻繁的數據,現在又不頻繁了,所以說緩存中的數據要經常按照一定的演算法來更換,這樣才能保證緩存中的數據是被訪問最頻繁的。
緩存的工作原理
[編輯本段]
緩存的工作原理是當CPU要讀取一個數據時,首先從緩存中查找,如果找到就立即讀取並送給CPU處理;如果沒有找到,就用相對慢的速度從內存中讀取並送給CPU處理,同時把這個數據所在的數據塊調入緩存中,可以使得以後對整塊數據的讀取都從緩存中進行,不必再調用內存。
正是這樣的讀取機制使CPU讀取緩存的命中率非常高(大多數CPU可達90%左右),也就是說CPU下一次要讀取的數據90%都在緩存中,只有大約10%需要從內存讀取。這大大節省了CPU直接讀取內存的時間,也使CPU讀取數據時基本無需等待。總的來說,CPU讀取數據的順序是先緩存後內存。
一級緩存和二級緩存
[編輯本段]
為了分清這兩個概念,我們先了解一下RAM
。RAM和ROM相對的,RAM是掉電以後,其中的信息就消失那一種,ROM在掉電以後信息也不會消失那一種。
RAM又分兩種,一種是靜態RAM,SRAM;一種是動態RAM,DRAM。前者的存儲速度要比後者快得多,我們現在使用的內存一般都是動態RAM。
有的菜鳥就說了,為了增加系統的速度,把緩存擴大不就行了嗎,擴大的越大,緩存的數據越多,系統不就越快了嗎?緩存通常都是靜態RAM,速度是非常的快,
但是靜態RAM集成度低(存儲相同的數據,靜態RAM的體積是動態RAM的6倍),
價格高(同容量的靜態RAM是動態RAM的四倍),
由此可見,擴大靜態RAM作為緩存是一個非常愚蠢的行為,
但是為了提高系統的性能和速度,我們必須要擴大緩存,
這樣就有了一個折中的方法,不擴大原來的靜態RAM緩存,而是增加一些高速動態RAM做為緩存,
這些高速動態RAM速度要比常規動態RAM快,但比原來的靜態RAM緩存慢,
我們把原來的靜態ram緩存叫一級緩存,而把後來增加的動態RAM叫二級緩存。
一級緩存和二級緩存中的內容都是內存中訪問頻率高的數據的復製品(映射),它們的存在都是為了減少高速CPU對慢速內存的訪問。
通常CPU找數據或指令的順序是:先到一級緩存中找,找不到再到二級緩存中找,如果還找不到就只有到內存中找了。
緩存的技術發展
[編輯本段]
最早先的CPU緩存是個整體的,而且容量很低,英特爾公司從Pentium時代開始把緩存進行了分類。當時集成在CPU內核中的緩存已不足以滿足CPU的需求,而製造工藝上的限制又不能大幅度提高緩存的容量。因此出現了集成在與CPU同一塊電路板上或主板上的緩存,此時就把
CPU內核集成的緩存稱為一級緩存,而外部的稱為二級緩存。一級緩存中還分數據緩存(Data
Cache,D-Cache)和指令緩存(Instruction
Cache,I-Cache)。二者分別用來存放數據和執行這些數據的指令,而且兩者可以同時被CPU訪問,減少了爭用Cache所造成的沖突,提高了處理器效能。英特爾公司在推出Pentium
4處理器時,用新增的一種一級追蹤緩存替代指令緩存,容量為12KμOps,表示能存儲12K條微指令。
隨著CPU製造工藝的發展,二級緩存也能輕易的集成在CPU內核中,容量也在逐年提升。現在再用集成在CPU內部與否來定義一、二級緩存,已不確切。而且隨著二級緩存被集成入CPU內核中,以往二級緩存與CPU大差距分頻的情況也被改變,此時其以相同於主頻的速度工作,可以為CPU提供更高的傳輸速度。
二級緩存是CPU性能表現的關鍵之一,在CPU核心不變化的情況下,增加二級緩存容量能使性能大幅度提高。而同一核心的CPU高低端之分往往也是在二級緩存上有差異,由此可見二級緩存對於CPU的重要性。
CPU在緩存中找到有用的數據被稱為命中,當緩存中沒有CPU所需的數據時(這時稱為未命中),CPU才訪問內存。從理論上講,在一顆擁有二級緩存的CPU中,讀取一級緩存的命中率為80%。也就是說CPU一級緩存中找到的有用數據占數據總量的80%,剩下的20%從二級緩存中讀取。由於不能准確預測將要執行的數據,讀取二級緩存的命中率也在80%左右(從二級緩存讀到有用的數據占總數據的16%)。那麼還有的數據就不得不從內存調用,但這已經是一個相當小的比例了。目前的較高端的CPU中,還會帶有三級緩存,它是為讀取二級緩存後未命中的數據設計的—種緩存,在擁有三級緩存的CPU中,只有約5%的數據需要從內存中調用,這進一步提高了CPU的效率。
為了保證CPU訪問時有較高的命中率,緩存中的內容應該按一定的演算法替換。一種較常用的演算法是「最近最少使用演算法」(LRU演算法),它是將最近一段時間內最少被訪問過的行淘汰出局。因此需要為每行設置一個計數器,LRU演算法是把命中行的計數器清零,其他各行計數器加1。當需要替換時淘汰行計數器計數值最大的數據行出局。這是一種高效、科學的演算法,其計數器清零過程可以把一些頻繁調用後再不需要的數據淘汰出緩存,提高緩存的利用率。
CPU產品中,一級緩存的容量基本在4KB到64KB之間,二級緩存的容量則分為128KB、256KB、512KB、1MB、2MB、4MB等。一級緩存容量各產品之間相差不大,而二級緩存容量則是提高CPU性能的關鍵。二級緩存容量的提升是由CPU製造工藝所決定的,容量增大必然導致CPU內部晶體管數的增加,要在有限的CPU面積上集成更大的緩存,對製造工藝的要求也就越高。
現在主流的CPU二級緩存都在2MB左右,其中英特爾公司07年相繼推出了台式機用的4MB、6MB二級緩存的高性能CPU,不過價格也是相對比較高的,對於對配置要求不是太高的朋友,一般的2MB二級緩存的雙核CPU基本也可以滿足日常上網需要了。