同樣是電晶體,為什麼暫存器比記憶體快呢?
計算機的儲存層次(memory hierarchy)之中,暫存器(register)最快,記憶體其次,最慢的是硬碟。
同樣都是電晶體儲存裝置,為什麼暫存器比記憶體快呢?
Mike Ash寫了一篇很好的解釋,非常通俗地回答了這個問題,有助於加深對硬體的理解。下面就是我的簡單翻譯。
原因一:距離不同
距離不是主要因素,但是最好懂,所以放在最前面說。記憶體離CPU比較遠,所以要耗費更長的時間讀取。
以3GHz的CPU為例,電流每秒鐘可以振盪30億次,每次耗時大約為0.33納秒。光在1納秒的時間內,可以前進30釐米。也就是說,在CPU的一個時鐘週期內,光可以前進10釐米。因此,如果記憶體距離CPU超過5釐米,就不可能在一個時鐘週期內完成資料的讀取,這還沒有考慮硬體的限制和電流實際上達不到光速。相比之下,暫存器在CPU內部,當然讀起來會快一點。
距離對於桌面電腦影響很大,對於手機影響就要小得多。手機CPU的時脈頻率比較慢(iPhone 5s為1.3GHz),而且手機的記憶體緊挨著CPU。
原因二:硬體設計不同
蘋果公司新推出的iPhone 5s,CPU是A7,暫存器有6000多位(31個64位暫存器,加上32個128位暫存器)。而iPhone 5s的記憶體是1GB,約為80億位(bit)。這意味著,高效能、高成本、高耗電的設計可以用在暫存器上,反正只有6000多位,而不能用在記憶體上。因為每個位的成本和能耗只要增加一點點,就會被放大80億倍。
事實上確實如此,記憶體的設計相對簡單,每個位就是一個電容和一個電晶體,而暫存器的設計則完全不同,多出好幾個電子元件。並且通電以後,暫存器的電晶體一直有電,而記憶體的電晶體只有用到的才有電,沒用到的就沒電,這樣有利於省電。這些設計上的因素,決定了暫存器比記憶體讀取速度更快。
原因三:工作方式不同
暫存器的工作方式很簡單,只有兩步:(1)找到相關的位,(2)讀取這些位。
記憶體的工作方式就要複雜得多:
(1)找到資料的指標。(指標可能存放在暫存器內,所以這一步就已經包括暫存器的全部工作了。)
(2)將指標送往記憶體管理單元(MMU),由MMU將虛擬的記憶體地址翻譯成實際的實體地址。
(3)將實體地址送往記憶體控制器(memory controller),由記憶體控制器找出該地址在哪一根記憶體插槽(bank)上。
(4)確定資料在哪一個記憶體塊(chunk)上,從該塊讀取資料。
(5)資料先送回記憶體控制器,再送回CPU,然後開始使用。
記憶體的工作流程比暫存器多出許多步。每一步都會產生延遲,累積起來就使得記憶體比暫存器慢得多。
為了緩解暫存器與記憶體之間的巨大速度差異,硬體設計師做出了許多努力,包括在CPU內部設定快取、優化CPU工作方式,儘量一次性從記憶體讀取指令所要用到的全部資料等等。
相關文章
- 3. 暫存器(記憶體) | 問題 3.7 - 3.10記憶體
- Java記憶體模型是什麼,為什麼要有Java記憶體模型,Java記憶體模型解決了什麼問題?Java記憶體模型
- 什麼是伺服器記憶體?如何選擇伺服器記憶體?伺服器記憶體
- Java記憶體模型FAQ(一) 什麼是記憶體模型Java記憶體模型
- MongoDB 如何使用記憶體?為什麼記憶體滿了?MongoDB記憶體
- MongoDB如何使用記憶體?為什麼記憶體滿了?MongoDB記憶體
- 什麼是Java記憶體模型?Java記憶體模型
- 什麼是Java記憶體模型Java記憶體模型
- 什麼是Java記憶體模型(JMM)中的主記憶體和本地記憶體?Java記憶體模型
- Python如何管理記憶體?記憶體分配機制是什麼?Python記憶體
- 電腦記憶體XMP是什麼意思?電腦記憶體XMP模式的作用與開啟教程記憶體模式
- Python記憶體檢視是什麼Python記憶體
- 為什麼Modbus的只讀暫存器被稱為“輸入暫存器(Input Registers)”而不是“輸出暫存器”
- 記憶體條的PCB是個啥? 宏旺半導體告訴你什麼樣的記憶體條好記憶體
- 為什麼說列舉更佔記憶體,列舉原理是什麼?記憶體
- SQL Server為什麼這麼耗記憶體SQLServer記憶體
- 伺服器記憶體跑滿是什麼原因造成的?伺服器記憶體
- 伺服器記憶體跑滿是什麼原因造成的伺服器記憶體
- 為什麼 Linux 需要虛擬記憶體Linux記憶體
- 電腦記憶體升級知識 電腦升級記憶體需要注意什麼?記憶體
- 比Redis快5倍的中介軟體,究竟為什麼這麼快?Redis
- Java記憶體模型FAQ(七)同步會幹些什麼呢Java記憶體模型
- 直接記憶體和堆記憶體誰快記憶體
- 《堡壘》《電晶體》開發商成功的祕訣是什麼?
- 讀書筆記《組合語言》——intel8086暫存器的記憶體訪問筆記組合語言Intel記憶體
- 同樣是車、球,為什麼《火箭聯盟》改變了體育遊戲?遊戲
- 電腦記憶體怎麼擴大 如何更改電腦記憶體大小記憶體
- C++ 類的記憶體分配是怎麼樣的?C++記憶體
- 電腦卡頓是記憶體還是硬碟原因 電腦卡頓是什麼原因造成的記憶體硬碟
- 詳解JVM中的記憶體模型是什麼?JVM記憶體模型
- 面試官:為什麼需要Java記憶體模型?面試Java記憶體模型
- 電腦升級記憶體之前的注意事項 電腦增加記憶體條需要注意什麼?記憶體
- CPU快取記憶體快取記憶體
- 在 4GB 實體記憶體的機器上,申請 8G 記憶體會怎麼樣?記憶體
- 序列SPI NOR快閃記憶體VS並行NOR快閃記憶體記憶體並行
- 記憶體科普:DIMM是指什麼,和DDR有什麼區別?記憶體
- Linux 中的“大記憶體頁”(hugepage)是個什麼?Linux記憶體
- Java記憶體模型FAQ(三)JSR133是什麼?Java記憶體模型JS