1. 程式人生 > >內存,寄存器和cache的區別與聯系

內存,寄存器和cache的區別與聯系

拷貝 技巧 line 一段時間 arc 但是 nbsp 貴的 硬盤

1. 寄存器是中央處理器內的組成部份。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數據和位址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)程序計數器(PC)。在中央處理器的算術及邏輯部件中,包含的寄存器有累加器(ACC)。
2. 內存包含的範圍非常廣,一般分為只讀存儲器(ROM)、隨機存儲器(RAM)和高速緩存存儲器(cache)。

3. 寄存器是CPU內部的元件,寄存器擁有非常高的讀寫速度,所以在寄存器之間的數據傳送非常快。
4. Cache即高速緩沖存儲器是位於CPU與主內存間的一種容量較小但速度很高的存儲器。由於CPU的速度遠高於主內存,CPU直接從內存中存取數據要等待一定時間周期,Cache中保存著CPU剛用過或循環使用的一部分數據

,當CPU再次使用該部分數據時可從Cache中直接調用,這樣就減少了CPU的等待時間,提高了系統的效率。Cache又分為一級Cache(L1 Cache)和二級Cache(L2 Cache),L1 Cache集成在CPU內部,L2 Cache早期一般是焊在主板上,現在也都集成在CPU內部,常見的容量有256KB或512KB L2 Cache。

總結:大致來說數據是通過內存-Cache-寄存器,Cache緩存則是為了彌補CPU與內存之間運算速度的差異而設置的的部件。

http://blog.csdn.net/csuyishuan/article/details/52073421

首先看一下計算機的存儲體系(Memory hierarchy)金字塔

技術分享圖片

其次我們看看一個計算機的存儲體系

技術分享圖片

Register

寄存器是CPU的內部組成單元,是CPU運算時取指令和數據的地方,速度很快,寄存器可以用來暫存指令、數據和地址。在CPU中,通常有通用寄存器,如指令寄存器IR;特殊功能寄存器,如程序計數器PC、sp等。

Cache

緩存即就是用於暫時存放內存中的數據,若果寄存器要取內存中的一部分數據時,可直接從緩存中取到,這樣可以調高速度。高速緩存是內存的部分拷貝。

CPU <--- > 寄存器<--- > 緩存<--- >內存

寄存器的工作方式很簡單,只有兩步:(1)找到相關的位,(2)讀取這些位。

內存的工作方式就要復雜得多:

(1)找到數據的指針。(指針可能存放在寄存器內,所以這一步就已經包括寄存器的全部工作了。)

(2)將指針送往內存管理單元(MMU),由MMU將虛擬的內存地址翻譯成實際的物理地址。

(3)將物理地址送往內存控制器(memory controller),由內存控制器找出該地址在哪一根內存插槽(bank)上。

(4)確定數據在哪一個內存塊(chunk)上,從該塊讀取數據。

(5)數據先送回內存控制器,再送回CPU,然後開始使用。

內存的工作流程比寄存器多出許多步。每一步都會產生延遲,累積起來就使得內存比寄存器慢得多。

為了緩解寄存器與內存之間的巨大速度差異,硬件設計師做出了許多努力,包括在CPU內部設置緩存、優化CPU工作方式,盡量一次性從內存讀取指令所要用到的全部數據等等。



RAM-memory

即內存,是用於存放數據的單元。其作用是用於暫時存放CPU中的運算數據,以及與硬盤等外部存儲器交換的數據。

HardDisk

硬盤

作者:時國懷
鏈接:http://www.zhihu.com/question/20075426/answer/16354329
來源:知乎
著作權歸作者所有,轉載請聯系作者獲得授權。

一條匯編指令大概執行過程是(不是絕對的,不同平臺有差異):

取指(取指令)、譯碼(把指令轉換成微指令)、取數(讀內存裏的操作數)、計算(各種計算的過程,ALU負責)、寫回(將計算結果寫回內存),有些平臺裏,前兩步會合並成一步,某些指令也不會有取數或者回寫的過程。

再提一下CPU主頻的概念:首先,主頻絕對不等於一秒鐘可以執行的指令個數,每個指令的執行成本是不同的,比如x86平臺裏匯編指令INC就比ADD要快,具體每個指令的時鐘周期可以參考intel的手冊。

為什麽要提主頻?因為上面的執行過程中,每個操作都需要占用一個時鐘周期,對於一個操作內存的加法,就需要5個時鐘周期,換句話說,500Mhz主頻的CPU,最多執行100MHz條指令。

仔細觀察,上面的步驟裏不包括寄存器操作,對於CPU來說讀/寫寄存器是不需要時間的,或者說如果只是操作寄存器(比如類似mov BX,AX之類的操作),那麽一秒鐘執行的指令個數理論上說就等於主頻,因為寄存器是CPU的一部分。

然後寄存器往下就是各級的cache,有L1 cache,L2,甚至有L3的,以及TLB這些(TLB也可以認為是cache),之後就是內存,前面說寄存器快,現在說為什麽這些慢:

對於各級的cache,訪問速度是不同的,理論上說L1cache(一級緩存)有著跟CPU寄存器相同的速度,但L1cache有一個問題,當需要同步cache和內存之間的內容時,需要鎖住cache的某一塊(術語是cache line),然後再進行cache或者內存內容的更新,這段期間這個cache塊是不能被訪問的,所以L1cache的速度就沒寄存器快,因為它會頻繁的有一段時間不可用。

L1 cache下面是L2 cache,甚至L3 cache,這些都有跟L1 cache一樣的問題,要加鎖,同步,並且L2比L1慢,L3比L2慢,這樣速度也就更低了。

最後說說內存,內存的主頻現在主流是1333左右吧?或者1600,單位是MHz,這比CPU的速度要低的多,所以內存的速度起點就更低,然後內存跟CPU之間通信也不是想要什麽就要什麽的。

內存不僅僅要跟CPU通信,還要通過DMA控制器與其它硬件通信,CPU要發起一次內存請求,先要給一個信號說“我要訪問數據了,你忙不忙?”如果此時內存忙,則通信需要等待,不忙的時候,通信才能正常。並且,這個請求信號的時間代價,就是夠執行幾個匯編指令了,所以,這是內存慢的一個原因。

另一個原因是:內存跟CPU之間通信的通道也是有限的,就是所謂的“總線帶寬”,但,要記住這個帶寬不僅僅是留給內存的,還包括顯存之類的各種通信都要走這條路,並且由於路是共享的,所以任何請求發起之間都要先搶占,搶占帶寬需要時間,帶寬不夠等待的話也需要時間。

以上兩條加起來導致了CPU訪問內存更慢,比cache還慢。

舉個更容易懂的例子:

CPU要取寄存器AX的值,只需要一步:把AX給我拿來,AX就拿來了。
CPU要取L1 cache的某個值,需要1-3步(或者更多):把某某cache行鎖住,把某個數據拿來,解鎖,如果沒鎖住就慢了。
CPU要取L2 cache的某個值,先要到L1 cache裏取,L1說,我沒有,在L2裏,L2開始加鎖,加鎖以後,把L2裏的數據復制到L1,再執行讀L1的過程,上面的3步,再解鎖。
CPU取L3 cache的也是一樣,只不過先由L3復制到L2,從L2復制到L1,從L1到CPU。
CPU取內存則最復雜:通知內存控制器占用總線帶寬,通知內存加鎖,發起內存讀請求,等待回應,回應數據保存到L3(如果沒有就到L2),再從L3/2到L1,再從L1到CPU,之後解除總線鎖定。

磁盤緩存和內存緩存的區別

內存緩存

高速緩存(英語:cache,英語發音:/k??/ kash [1][2][3],簡稱緩存),其原始意義是指訪問速度比一般隨機存取存儲器(RAM)快的一種RAM,通常它不像系統主存那樣使用DRAM技術,而使用昂貴但較快速的SRAM技術。

原理
Cache一詞來源於1967年的一篇電子工程期刊論文。其作者將法語詞“cache”賦予“safekeeping storage”的涵義,用於電腦工程領域。

當CPU處理數據時,它會先到Cache中去尋找,如果數據因之前的操作已經讀取而被暫存其中,就不需要再從隨機存取存儲器(Main memory)中讀取數據——由於CPU的運行速度一般比主內存的讀取速度快,主存儲器周期(訪問主存儲器所需要的時間)為數個時鐘周期。因此若要訪問主內存的話,就必須等待數個CPU周期從而造成浪費。

提供“緩存”的目的是為了讓數據訪問的速度適應CPU的處理速度,其基於的原理是內存中“程序執行與數據訪問的局域性行為”,即一定程序執行時間和空間內,被訪問的代碼集中於一部分。為了充分發揮緩存的作用,不僅依靠“暫存剛剛訪問過的數據”,還要使用硬件實現的指令預測與數據預取技術——盡可能把將要使用的數據預先從內存中取到緩存裏。

CPU的緩存曾經是用在超級計算機上的一種高級技術,不過現今電腦上使用的的AMD或Intel微處理器都在芯片內部集成了大小不等的數據緩存和指令緩存,通稱為L1緩存(L1 Cache即Level 1 On-die Cache,第一級片上高速緩沖存儲器);而比L1更大容量的L2緩存曾經被放在CPU外部(主板或者CPU接口卡上),但是現在已經成為CPU內部的標準組件;更昂貴的CPU會配備比L2緩存還要大的L3緩存(level 3 On-die Cache第三級高速緩沖存儲器)。

概念的擴充
如今緩存的概念已被擴充,不僅在CPU和主內存之間有Cache,而且在內存和硬盤之間也有Cache(磁盤緩存),乃至在硬盤與網絡之間也有某種意義上的Cache──稱為Internet臨時文件夾或網絡內容緩存等。凡是位於速度相差較大的兩種硬件之間,用於協調兩者數據傳輸速度差異的結構,均可稱之為Cache。

地址鏡像與變換
主條目:CPU緩存#組相聯
由於主存容量遠大於CPU緩存的容量,因此兩者之間就必須按一定的規則對應起來。地址鏡像就是指按某種規則把主存塊裝入緩存中。地址變換是指當按某種鏡像方式把主存塊裝入緩存後,每次訪問CPU緩存時,如何把主存的物理地址(Physical address)或虛擬地址(Virtual address)變換成CPU緩存的地址,從而訪問其中的數據。

緩存置換策略
主條目:CPU緩存#置換策略、分頁和緩存文件置換機制
主存容量遠大於CPU緩存,磁盤容量遠大於主存,因此無論是哪一層次的緩存都面臨一個同樣的問題:當容量有限的緩存的空閑空間全部用完後,又有新的內容需要添加進緩存時,如何挑選並舍棄原有的部分內容,從而騰出空間放入這些新的內容。解決這個問題的算法有幾種,如最久未使用算法(LRU)、先進先出算法(FIFO)、最近最少使用算法(LFU)、非最近使用算法(NMRU)等,這些算法在不同層次的緩存上執行時擁有不同的效率和代價,需根據具體場合選擇最合適的一種。

磁盤緩存

磁盤緩存

16MB緩沖區的硬盤
磁盤緩存(Disk Buffer)或磁盤快取(Disk Cache)實際上是將下載到的數據先保存於系統為軟件分配的內存空間中(這個內存空間被稱之為“內存池”),當保存到內存池中的數據達到一個程度時,便將數據保存到硬盤中。這樣可以減少實際的磁盤操作,有效的保護磁盤免於重復的讀寫操作而導致的損壞。

磁盤緩存是為了減少CPU透過I/O讀取磁盤機的次數,提升磁盤I/O的效率,用一塊內存來儲存存取較頻繁的磁盤內容;因為內存的存取是電子動作,而磁盤的存取是I/O動作,感覺上磁盤I/O變得較為快速。

相同的技巧可用在寫入動作,我們先將欲寫入的內容放入內存中,等到系統有其它空閑的時間,再將這塊內存的資料寫入磁盤中。

大小
現在的磁盤通常有32MB或64MB緩存。舊的硬盤則有8MB或16MB。

內存,寄存器和cache的區別與聯系