计算机组成原理笔记(王道考研) 第三章:存储系统
內(nèi)容基于中國大學MOOC的2023考研計算機組成原理課程所做的筆記。
感謝LY,他幫我做了一部分筆記。由于聽的時間不一樣,第四章前的內(nèi)容看起來可能稍顯啰嗦,后面會記得簡略一些。
?
西電的計算機組織與體系結(jié)構(gòu)課講法和王道考研的課不太一樣,要應(yīng)付校內(nèi)考試建議還是跟著老師學比較好。以下是20年西電計科院車向泉老師這門課的錄播下載鏈接(請勿將錄像上傳到B站等網(wǎng)站!!):
鏈接:https://pan.baidu.com/s/1bFs3ajhy8ZcbHopS9izGsw
提取碼:fdez
期中考試占20分,一般只考前兩章內(nèi)容,期末考試占60分,一般前兩章內(nèi)容不考,考察內(nèi)容一般考前的復(fù)習課都會講清楚,請務(wù)必認真聽復(fù)習課。
?
其他各章節(jié)的鏈接如下:
計算機組成原理筆記(王道考研) 第一章:計算機系統(tǒng)概述
計算機組成原理筆記(王道考研) 第二章:數(shù)據(jù)的表示和運算1
計算機組成原理筆記(王道考研) 第二章:數(shù)據(jù)的表示和運算2
計算機組成原理筆記(王道考研) 第三章:存儲系統(tǒng)
計算機組成原理筆記(王道考研) 第四章:指令系統(tǒng)
計算機組成原理筆記(王道考研) 第五章:中央處理器
計算機組成原理筆記(王道考研) 第六章:總線
計算機組成原理筆記(王道考研) 第七章:輸入輸出系統(tǒng)
其他各科筆記匯總
存儲系統(tǒng)
存儲系統(tǒng)基本概念
本章探討二進制數(shù)據(jù)在電腦中如何存儲。之前提過現(xiàn)代計算機的結(jié)構(gòu)大致如下圖所示,其中主機內(nèi)部的主存儲器(內(nèi)存)和輔存都是存儲器。這些存儲器的容量是不一樣的,主存更小而輔存更大
下圖中的機身存儲就是輔存
除了主存和輔存之外還有沒有其他用于存儲數(shù)據(jù)的存儲器?為什么主存和輔存的存儲容量差異這么大?除了存儲容量之外,它們之間有沒有速度差異?這就是在這一小節(jié)要探討的第一個問題:存儲器的層次結(jié)構(gòu)。另外在這一小節(jié)當中也會介紹計算機內(nèi)部存儲器從不同角度進行的分類,最后會講度量存儲器的一些性能指標
存儲器的層次化結(jié)構(gòu)
直接見下圖,后面是對下圖的一些說明
手機里的輔存一般不是用磁盤實現(xiàn)的
平時手機里安裝的app就存儲在輔存內(nèi),由于輔存的讀寫速度比較慢,因此CPU不能直接和輔存進行數(shù)據(jù)交互
CPU的數(shù)據(jù)處理速度很快,如果讓CPU直接去讀寫輔存的數(shù)據(jù),CPU處理數(shù)據(jù)的速度會被輔存讀寫數(shù)據(jù)的速度拖累
平時要啟動一個app就需要把該程序相關(guān)的數(shù)據(jù)先從輔存調(diào)入到主存。當app數(shù)據(jù)被放到主存之后,手機的CPU就會開始運行app的代碼,我們就能使用app了。CPU可以向主存讀數(shù)據(jù)也可以向主存寫數(shù)據(jù)
老版微信打開時會有一個頁面(一個人站在月球上看地球),手機會在這個頁面停留幾秒,這幾秒就是把微信的數(shù)據(jù)從輔存讀入主存所需要的時間
主存之上還有Cache,增加這一層的作用是什么?雖然主存讀寫速度已經(jīng)很快了,但是依然遠遠跟不上CPU的運算速度,為了緩解這種速度矛盾通常計算機硬件會把當前有可能頻繁被訪問的代碼和數(shù)據(jù)從主存復(fù)制一份到Cache當中。CPU可以直接讀取Cache當中的副本數(shù)據(jù)。總之添加Cache層主要是為了緩解CPU和主存之間的速度矛盾
假設(shè)微信的數(shù)據(jù)現(xiàn)在被調(diào)入主存,要進行視頻聊天。接下來一段時間內(nèi)微信處理視頻聊天的相關(guān)代碼有可能會被頻繁地訪問,這時候就可以把處理視頻相關(guān)的代碼從主存復(fù)制一份到Cache當中。由于Cache是更靠近上層的存儲層,因此Cache的讀寫速度會更快,CPU直接訪問Cache里面存儲的視頻聊天相關(guān)的代碼可以比直接訪問主存快很多,這樣就能讓視頻聊天更流暢
除了Cache之外還會看到更上面最接近CPU的一層叫做寄存器。什么是寄存器在之前的小節(jié)中已經(jīng)講過好多次(如ACC,MQ等),寄存器的讀寫速度又要比Cache快的多,所以CPU在進行加減乘除之類的運算時會把操作數(shù)先放到寄存器里面。CPU內(nèi)部包含的寄存器數(shù)量很有限,有可能只有幾十個
主存和輔存之間的數(shù)據(jù)交換由硬件+操作系統(tǒng)實現(xiàn)。主存和Cache之間的交換由硬件自動完成
操作系統(tǒng)需要實現(xiàn)頁面置換算法,根據(jù)頁面置換算法決定要把哪些數(shù)據(jù)從主存換出到外存。主存和輔存實現(xiàn)了虛擬存儲系統(tǒng)(操作系統(tǒng)課會講),虛擬存儲系統(tǒng)解決了主存容量不夠的問題。在實現(xiàn)了虛擬存儲系統(tǒng)之后應(yīng)用程序員看到的主存容量可以比它實際的容量要大得多,這就是“虛擬”的意思
接下來以一個實際的例子感受一下各層存儲器的速度與價格間的差異
各層存儲器的速度與價格
以京東的三星內(nèi)存條介紹為例。Memory指的就是三星的內(nèi)存條,大小為8GB,后面列出了其讀(Read)、寫(Write)、復(fù)制(Copy)的速度。當這個內(nèi)存條與Intel的$i$5-9300H CPU進行配合工作的時候,內(nèi)存的讀速度可以達到37051MB/s,寫速度可以達到37566MB/s(40GB/s左右),這就是內(nèi)存也就是主存這一層的讀寫速度
除了內(nèi)存之外還會有Cache層,各種CPU型號里面肯定會介紹其高速緩存也就是Cache的容量大小。從上圖可以看出$i5的處理器受硬件開發(fā)成本限制的原因總?cè)萘恐挥?2MB,比內(nèi)存的容量小得多。另外在現(xiàn)代CPU中Cache通常也是分層的,像上圖5的處理器受硬件開發(fā)成本限制的原因總?cè)萘恐挥?2MB,比內(nèi)存的容量小得多。另外在現(xiàn)代CPU中Cache通常也是分層的,像上圖5的處理器受硬件開發(fā)成本限制的原因總?cè)萘恐挥?/span>12MB,比內(nèi)存的容量小得多。另外在現(xiàn)代CPU中Cache通常也是分層的,像上圖i$5處理器就分為L1、L2、L3這幾層,越靠近上層的容量越小,處理速度也更快,從圖中也可以看出其訪問/讀寫速度都比內(nèi)存高得多
上面是主存層和Cache層,這兩層都能直接被CPU訪問,接下來再看靠近下層的輔存。從上圖可以看到290+的價格機械硬盤的存儲容量可以達到1TB,但實際讀寫速度100M/s左右,遠小于內(nèi)存。以藍光光盤為例,外存制造成本又遠小于輔存,但讀寫速度小于輔存
請無視SATA6Gb/s
在好幾年前大多數(shù)的輔存都采取機械硬盤,但是近幾年幾乎所有的電腦都采用固態(tài)硬盤SSD來作為輔存,可以看到500+的價格能買到500GB大小,讀寫速度達到550MB/s的固態(tài)硬盤,比原來的機械硬盤要快的多。一些比較新的硬盤如果采用m.2接口讀寫速度甚至能達到4GB/s。由于固態(tài)硬盤的讀寫速度比機械硬盤快得多,電腦系統(tǒng)安裝在固態(tài)硬盤里面會比安裝在機械硬盤里面啟動速度快得多,因為在開機時需要把系統(tǒng)相關(guān)的數(shù)據(jù)從輔存讀入到主存,輔存讀入的速度越快開機的速度越快
這就是存儲器的層次結(jié)構(gòu),接下來探討存儲器的分類
存儲器的分類
直接見下面的幾張圖即可,這里只做一些必要說明
1.按層次結(jié)構(gòu)分類
我們需要重點關(guān)注的是高速緩存、主存、輔存這中間三層
高速緩存和主存可以直接被CPU讀寫,而輔存里的數(shù)據(jù)只有被調(diào)入到主存之后才能被CPU訪問
2.按存儲介質(zhì)分類
半導體存儲器的讀寫速度通常要快一些
好多年前的軟盤、磁帶、機械硬盤都以磁性材料作為存儲介質(zhì)。光盤/DVD之類則是光存儲器
3.按存取方式分類
之前說過其實所有的存儲器都是分為一個個存儲單元,每個存儲單元都有各自的地址編號。RAM讀寫速度與物理位置無關(guān),像內(nèi)存條就是一種RAM。復(fù)讀機里面的磁帶就是一種SAM,復(fù)讀機/錄音機會有一個磁頭來讀寫磁帶里面存放的數(shù)據(jù),磁帶中間的軸轉(zhuǎn)動時磁條會劃過讀寫磁頭,此時就能讀出其中的數(shù)據(jù)。機械硬盤/磁盤就是一種DAM,磁頭臂會進行前后移動移到想讀取的區(qū)域(隨機存取),接下來中間的馬達會帶動磁盤旋轉(zhuǎn),想要讀寫的數(shù)據(jù)滑過磁頭下方時磁頭就能進行相應(yīng)的讀和寫(順序存取),DAM讀寫速度介于SAM和RAM之間
以上三種類型的存儲器都要指明一個要讀寫的地址然后進行讀取,CAM的存取方式會不太一樣。注意這種存儲器和其他三種的區(qū)別,其他三種是指定數(shù)據(jù)的存儲地址然后直接去那個地址當中讀或者寫這個數(shù)據(jù)。而CAM可以指明想要找的數(shù)據(jù)內(nèi)容是什么,然后根據(jù)數(shù)據(jù)的內(nèi)容去查找它的存儲位置在哪兒。即下面三種按照地址來訪問,上面這種是按照內(nèi)容來訪問
4.按信息的可更改性分類
BIOS通常寫在ROM中,而這個ROM芯片通常集成在主板上
5.按信息的可保存性分類
手機沒電關(guān)機之后需要開機,開機時會有開機畫面并且過程很緩慢,這是因為之前手機在運行時操作系統(tǒng),各自軟件的數(shù)據(jù)本來是存在主存里的。然而在斷電之后主存里的數(shù)據(jù)被清空,所以在開機時要把系統(tǒng)等各種各樣的數(shù)據(jù)從輔存調(diào)入主存,因此開機的過程會比較慢。手機系統(tǒng)或者電腦系統(tǒng)安裝在輔存里,顯然這些數(shù)據(jù)電腦和手機沒電之后依然是存在的,不然就不可能重新開機了
存儲器的性能指標
之前說過存儲器的MDR數(shù)據(jù)寄存器的位數(shù)反映了存儲器的存儲字長是多少,MAR地址寄存器的位數(shù)又反映了存儲字數(shù)是多少。存儲字數(shù)×\times×存儲字長=存儲容量
單位成本指每一個比特位所需要付出的金錢成本是多少
注意TaT_aTa?和TmT_mTm?的區(qū)別
主存儲器的基本組成
本節(jié)首先學習使用半導體元器件存儲二進制0和1的基本原理,然后通過半導體元器件的組合可以構(gòu)成存儲芯片。由于存儲芯片里面存儲了很多個字的數(shù)據(jù),因此存儲芯片必須提供尋址功能。本節(jié)最后會探討不同的尋址方式如何實現(xiàn)
首先來看組成主存儲器的基本半導體元件和它的工作原理
基本的半導體元件及原理
第一章說過一個主存儲器邏輯上可以分為存儲體、地址寄存器MAR、數(shù)據(jù)寄存器MDR三大部分。這三部分會在時序控制邏輯電路的控制下相互配合工作。之前說過存儲體就是用來存取實際的二進制數(shù)據(jù)0和1的,一個存儲體由多個存儲單元構(gòu)成,而每個存儲單元又由存儲元也就是存儲元件來構(gòu)成
用一個存儲元件也就能存儲一位的二進制0或1,根據(jù)電容是否保存電荷兩種狀態(tài)信息來對應(yīng)二進制的0和1
?
假設(shè)電容上現(xiàn)在保存著一些電荷,我們規(guī)定當它保留了一些電荷時表示二進制1,那接下來如何讀取這個二進制的比特位呢?只需要給MOS管加一個高電平信號(也可以理解為輸入了一個二進制1),當MOS管這一端輸入電壓達到一定閾值之后就會接通,相當于開關(guān)可以開始導電。由于MOS管接通,此時電容里保存的電荷就可以順著導線往外流,當在另一端檢測到輸出電流時就意味著此時輸出了二進制1。如果本來這個電容沒有保存電荷,也就是這種狀態(tài)表示二進制的0,當MOS接通時在另一端并不能檢測到電荷的流出,因此在這種情況下就能判斷電容保存的是二進制0
這就是讀出一個二進制的原理,再來看寫入一個二進制的原理
?
假設(shè)現(xiàn)在想讓電容保存一個二進制的1,那可以在另一端加高電平同時給MOS也加高電平使其接通。導致電容存儲一些電荷也就是存儲了二進制的1,接下來再讓MOS斷開,這樣電容里的電荷就無法跑出了
這就是存儲元件存儲二進制0和1的原理,需要用到一個MOS管和一個電容
?
將多個存儲元進行科學合理的連接就能一次性讀出或者寫入多個二進制數(shù)據(jù)。比如下圖上面這一排它們存儲的二進制信息分別是這樣一些值 101000011,紅線連接了每一個存儲元的MOS管,如果給這條紅線加一個高電平就意味著所有存儲元的MOS管都可以被導通。當MOS管被導通之后電容里存儲的電荷就可以順著綠色的線往外導出,只需要檢測每一條綠線有沒有產(chǎn)生電流就可以判斷每一條線對應(yīng)的是二進制0還是1,如果有電流意味著產(chǎn)生二進制1,如果沒電流意味著產(chǎn)生二進制0。用這樣的方式就能讀出這一整行的存儲元所存儲的二進制比特信息
這樣的一整行就是之前提到過的存儲單元,也就是一個存儲字,多個存儲單元就構(gòu)成了之前提到過的存儲體(也可以叫做存儲矩陣)。一次能讀出的這些二進制位就是一個存儲字,像下圖中存儲字長就是8bit,一行總共有8個存儲元。如果讓16個存儲元構(gòu)成一行,那么就意味著存儲字長變成了16bit
這里就能理解為什么第一章說存儲器每一次讀或者每一次寫的單位都是一個存儲字。因為從屬同一個存儲字的存儲元件的MOS管接的都是同一根線。如果要接通就是整個字的存儲單元同時接通,也就可以同時被讀出或者同時被寫入
要注意字節(jié)和存儲字的區(qū)別。1Byte=8bit,而一個存儲字等于多少個比特具體要看存儲體的結(jié)構(gòu)是什么樣的。像下圖存儲體就只包含了兩個存儲單元
接下來要研究的問題就是如何根據(jù)地址來決定要讀或者要寫哪個存儲字,這就涉及到譯碼器的使用
存儲器芯片的基本原理
譯碼器會根據(jù)地址寄存器MAR里邊給出的這幾位地址,把它轉(zhuǎn)變成某一條選通線的高電平信號。每一個地址會對應(yīng)譯碼器的一條輸出線。經(jīng)過譯碼器的處理,一個地址信號會被轉(zhuǎn)換成譯碼器的某一條輸出線的高電平信號,當這一條紅色的字選線被接通之后就可以通過綠色的數(shù)據(jù)線把每一位的二進制信息傳送到MDR當中,接下來CPU會根據(jù)數(shù)據(jù)總線從MDR當中取走這一整個字的數(shù)據(jù)。這就是給出地址之后通過譯碼器的處理選中其中某一個字的原理
數(shù)據(jù)總線的寬度和存儲字長相同
接下來繼續(xù)完善這個存儲芯片的構(gòu)成
還需要增加一個控制電路用于控制MAR、譯碼器和MDR。比如CPU會通過地址總線把地址送到MAR當中,但是由于是用電信號來傳送這些二進制數(shù)據(jù),而電信號難免會有不穩(wěn)定的情況,因此當MAR里面的電信號穩(wěn)定之前這個地址信息不能送到譯碼器當中的。這就是控制電路的一個作用,只有MAR穩(wěn)定之后它才會打開這個譯碼器的開關(guān)讓譯碼器來翻譯這個地址然后給出相應(yīng)的輸出信號。同樣的當數(shù)據(jù)輸出時只有電信號穩(wěn)定之后控制電路才會認為此時的輸出是正確無誤的,所以它也需要控制MDR在什么時候給數(shù)據(jù)總線送出數(shù)據(jù)
?
另一個方面存儲芯片還需要對外提供一些線路。一個叫片選線,通常用CS ̄\overline{CS}CS(chip select)和CE ̄\overline{CE}CE(chip enable)來表示片選線的電信號。如果給出的CS ̄\overline{CS}CS芯片選擇信號是一個低電平時就說明這個芯片的總開關(guān)是被接通的,可以正常工作
另外控制電路還需要對外提供一個讀控制線和寫控制線。當寫控制線的信號WE ̄\overline{WE}WE是低電平時表示此時這個芯片正在進行的是寫操作,也就是要把MDR里保存的數(shù)據(jù)輸入到各個電容當中。當需要讀出數(shù)據(jù)時需要把讀控制線OE ̄\overline{OE}OE電信號變?yōu)榈碗娖?#xff0c;當讀控制線接收到一個低電平時控制電路就知道現(xiàn)在要進行的是讀操作
還有一種常見的方法把兩根控制線合二為一,用一根控制線來表示此時要進行寫還是讀。這種情況下輸入低電平時表示要進行寫操作,輸入高電平表示要進行讀操作
注意題目說的是采用兩根讀寫線還是一根讀寫線,這兩種方案芯片對外暴露的金屬引腳數(shù)目是不一樣的
到目前為止就給出了一塊存儲芯片的完整構(gòu)造,把這些內(nèi)部細節(jié)屏蔽掉進行封裝,整體來看存儲芯片由下圖中所示的幾個邏輯部分構(gòu)成
存儲矩陣就是一個個存儲元
譯碼驅(qū)動電路分為譯碼器和驅(qū)動器。譯碼器的作用剛剛已經(jīng)說過,會輸出某一條線的高電平信號,這條線連了很多很多的存儲元,需要控制這些存儲元的開和關(guān)。為了讓譯碼器輸出的高電平穩(wěn)定有效,通常還會在譯碼器后面加上驅(qū)動器,驅(qū)動器是把電信號放大的部件
讀寫電路包括下圖那些紅色,綠色的線還有控制電路
邏輯上我們可以把存儲芯片的內(nèi)部分為這樣的三大部分
?
另外存儲芯片需要接收來自外界的地址信息,這個地址信息通常是CPU通過地址總線傳過來的,此外還需要數(shù)據(jù)線來控制數(shù)據(jù)的傳輸。除此之外還需要片選線的電信號來確定這塊芯片此時是否可用。另外也需要提供讀/寫控制線(有可能有一條有可能有兩條)
?
下圖內(nèi)存條中一塊塊黑色的小芯片就是存儲器芯片,可見存儲器有可能由多塊存儲芯片構(gòu)成。如果只想讀取某塊芯片指定地址的數(shù)據(jù)就需要只讓這塊存儲芯片的片選線信號有效(給低電平),這樣就能保證讀取指定芯片的數(shù)據(jù),這就是片選線和片選信號的作用。每一塊存儲芯片都會對外暴露出一個個金屬引腳,這些金屬引腳就是用來接收地址信號、數(shù)據(jù)信號、片選信號、讀/寫信號的,每一條線都會對應(yīng)一個金屬引腳
除了實現(xiàn)功能所必須的金屬引腳之外還會有供電引腳和接地引腳
有的題目會告知某一塊存儲芯片的參數(shù)信息,判斷這塊存儲芯片至少有幾個引腳
8×8\times 8×8位的存儲芯片,第一個8表示有8個存儲單元,第二個8位表示存儲字長是多少,即每一個存儲單元包含多少位的信息。可以根據(jù)這兩個信息來分別判斷地址線和數(shù)據(jù)線有多少位,然后根據(jù)地址線和數(shù)據(jù)線的數(shù)量再加上片選線和讀/寫控制線就可以判斷出這塊存儲芯片應(yīng)該對外暴露出多少個金屬引腳
尋址
按字節(jié)尋址、字尋址、半字尋址、雙字尋址之前講過。直接見下圖即可,此處詳細講解略過不記
?
SRAM和DRAM
在上一小節(jié)講了存儲芯片的基本原理。如何存儲二進制的0和1,如何根據(jù)一個地址來訪問某一個存儲字,這是上一小節(jié)學習的內(nèi)容
這一小節(jié)會介紹兩種特定類型的存儲芯片SRAM(Static Random Access Memory,靜態(tài)RAM)和DRAM(Dynamic Random Access Memory,動態(tài)RAM)。DRAM用于主存,SRAM用于Cache。DRAM和SRAM的對比是高頻考點
之前提到過RAM(Random Access Memory),當指定某一個存儲單元的地址時,這個存儲單元的讀取速度并不會因為存儲單元的物理位置而改變
DRAM 芯片
上一小節(jié)介紹的這種芯片其實就是DRAM芯片,可以用于制造主存。DRAM和SRAM的核心區(qū)別在于存儲元件不一樣
來看一下這兩種存儲元存儲元件的區(qū)別
柵極電容 V.S. 雙穩(wěn)態(tài)觸發(fā)器
DRAM芯片的存儲元柵極電容上節(jié)已經(jīng)說明過,此處不再贅述,直接看圖即可
?
再來看SRAM芯片,SRAM芯片的存儲元是下圖右邊的雙穩(wěn)態(tài)觸發(fā)器。這個雙穩(wěn)態(tài)觸發(fā)器里面總共包含了6個MOS管,分別用M1~M6M_1\sim M6M1?~M6來標注。之所以叫雙穩(wěn)態(tài)觸發(fā)器,是因為這種觸發(fā)器可以呈現(xiàn)出兩種穩(wěn)定的狀態(tài),規(guī)定A為高電平,B為低電平的狀態(tài)對應(yīng)二進制1。A為低電平,B為低電平的狀態(tài)對應(yīng)二進制0。用觸發(fā)器的這兩種穩(wěn)定狀態(tài)就可以記錄此時存儲的是二進制1還是0
雙穩(wěn)態(tài)觸發(fā)器需要用兩根數(shù)據(jù)線來讀出0和1的狀態(tài)。如果原本里面存儲的是二進制1,當給字選擇線接通加高電平時,線BLX會輸出低電平信號。如果原本里面存儲的是二進制0,線BL會輸出低電平信號,線BLX不會輸出任何電信號。根據(jù)左邊還是右邊哪條線輸出了低電平信號就可以判斷這個觸發(fā)器里面原本存儲的是1還是0
如果要寫入二進制0和1也很簡單。以二進制0為例,要寫入二進制0只需要給線BL加低電平,線BLX加高電平,這樣就能使得觸發(fā)器變?yōu)锳低B高的狀態(tài),而這個狀態(tài)對應(yīng)的就是二進制0。要寫入二進制1也是類似的原理
了解了這兩種存儲元的基本原理之后來看一下它們有什么區(qū)別。 區(qū)別直接看下圖即可,此處詳細講解略過不記
注意理解什么是“刷新”
DRAM 的刷新
簡單模型中一個譯碼器要接的線太多了,如何解決這個問題呢?
把這些存儲單元從一維的排列變成二維的排列,也就是把它們變成一個存儲單元構(gòu)成的矩陣。原本的n位地址會被拆分成行地址和列地址來分別送給行地址譯碼器和列地址譯碼器,這樣每個譯碼器只需要處理n2\frac n22n?位也就是一半的地址信息。隨著存儲器的發(fā)展和存儲容量越來越大,現(xiàn)代存儲器甚至會有三維的排列,但原理都是類似的
?
現(xiàn)在給右邊的圖示進行簡單的連線,看下如何根據(jù)一個地址選中某一個存儲單元。如果此時要訪問的地址是全0,地址總共有8位,這個地址會被分為前后兩半,前半部分作為行地址分給行地址譯碼器,后半部分作為列地址分給列地址譯碼器,4個全0的地址會導致行地址譯碼器的第0根選通線被選通,4個全0的送給列地址譯碼器也會導致它的第0根選通線被選通。一個存儲單元只有行和列這兩個選通信號都選通時才可以對它進行讀和寫。這樣就完成了通過行地址和列地址來選中一個存儲單元的操作
現(xiàn)在已經(jīng)知道了什么叫一行存儲單元,只要給出一個行地址,那么行地址譯碼器就會選中一行的存儲單元,而刷新操作每次就會刷新一整行
怎么刷新呢?會有一個專門的刷新電路來支持,刷新電路會直接讀出一整行的存儲單元信息然后重新寫入也就是重新給電容充電。由于刷新一整行本質(zhì)上就是進行了一次讀操作,所以它的耗時和一次讀/寫周期的耗時差不多。采用思路三來決定什么時刻刷新
刷新時CPU不能對存儲器進行讀和寫
在實際應(yīng)用當中可以利用CPU不需要訪問存儲器的時間進行刷新,比如CPU取得了一條指令,在指令譯碼階段就可以進行刷新操作
DRAM 的地址線復(fù)用技術(shù)
之前已經(jīng)知道了什么叫行地址什么叫列地址,同時送出行地址和列地址,地址有多少位就要有多少根地址線,而DRAM存儲芯片通常存儲容量會比較大(有可能需要32位地址)。為了地址線對應(yīng)的電路更簡單,DRAM通常會采用地址線復(fù)用技術(shù),將行列地址分前后兩次傳輸,先后把行列地址送到行列地址緩沖器里面,接下來在控制電路的控制下把行列地址再送給譯碼器進行處理
?
補充:現(xiàn)在的主存通常采用SDRAM,買電腦說的DDR3和DDR4都屬于SDRAM
?
只讀存儲器ROM
在這一小節(jié)中會學習ROM芯片。上一小節(jié)中學習了兩種具體的RAM芯片DRAM和SRAM,RAM芯片支持隨機存取,讀寫速度較快,具有易失性,斷電后數(shù)據(jù)消失。而ROM芯片具有非易失性,斷電后數(shù)據(jù)不會丟失。本節(jié)會介紹幾種ROM芯片
了解各種 ROM
比如買手機的時候看到文字宣傳8GB RAM+256GB ROM,分別指的就是主存和輔存
計算機內(nèi)的重要 ROM
通過之前的學習知道計算機的主存是用來存放一系列指令和數(shù)據(jù)的,CPU要做的就是從主存里取指令并執(zhí)行指令。然而RAM具有易失性,斷電后數(shù)據(jù)會全部丟失,也就說計算機關(guān)機之后主存里的數(shù)據(jù)就全部都沒了,當再一次開機時需要把操作系統(tǒng)和各種應(yīng)用程序相關(guān)的指令和數(shù)據(jù)重新調(diào)入主存,而操作系統(tǒng)安裝在輔存里面。由于開機時主存里完全沒有數(shù)據(jù)和指令,CPU就需要從主板上的一塊ROM芯片上讀取開機所需要的一些指令,這塊芯片就是BIOS芯片
重裝電腦的時候就可能會見到BIOS界面
補充:雖然BIOS芯片通常被集成在主板上,但是邏輯上應(yīng)該把它看作是主存的一部分。也就是說在計組中提到主存時,除了指我們熟悉的內(nèi)存條之外,還應(yīng)該加上BIOS芯片,二者結(jié)合才是一個完整的主存
統(tǒng)一編址的意思是如果這塊ROM芯片的容量是1KB,那么CPU會把0到1023這幾個地址分配給ROM芯片。然后RAM芯片也就是內(nèi)存條的地址從1024開始往后編號
?
主存儲器與CPU之間的連接
之前已經(jīng)知道了單塊存儲芯片對外暴露出來的一些接口
首先會探討單塊存儲芯片和CPU的連接如何實現(xiàn),接下來會介紹多塊存儲芯片和CPU之間的連接,分別是位擴展、字擴展和字位同時擴展,這一小節(jié)的最后還會補充一些關(guān)于譯碼器的知識
單塊存儲芯片與CPU的連接
首先來回顧一下單塊存儲芯片的結(jié)構(gòu)
需要對外暴露出這樣的一些接口:綠線是用來傳送數(shù)據(jù)的,通常會通過數(shù)據(jù)總線和CPU進行連接。紅線是用來傳送訪問地址的,通常會通過地址總線和CPU進行連接。除此之外還需要暴露出片選線、讀控制線和寫控制線的接口,CPU通過控制總線來發(fā)送這些控制信號。下圖給出的圖示就是一個8×88\times88×8位的存儲芯片,因為總共只有8個字,每個字的字長是8位
字擴展和位擴展是這兩個小節(jié)要解決的兩個主要問題
?
這里只使用了單塊存儲芯片來存儲數(shù)據(jù),并且只能存儲8B的數(shù)據(jù)。現(xiàn)在如果想要擴展主存字數(shù)該怎么辦?這就是這一小節(jié)要學習的字擴展要解決的問題,我們可以連接多塊存儲芯片來擴展主存的字數(shù)
這里給出的存儲芯片存儲字長只有8位,也就是CPU一次只能存或者取8bit的數(shù)據(jù),但是現(xiàn)代的CPU大多數(shù)可以同時存或者取64bit的數(shù)據(jù),也就是說現(xiàn)代計算機數(shù)據(jù)總線的寬度通常都有64位寬。之前說過應(yīng)該盡可能的保持數(shù)據(jù)總線的寬度和主存的存儲字長一樣,只有這樣才能盡可能地發(fā)揮數(shù)據(jù)總線的性能。每一次多存或者多取一些數(shù)據(jù)可以讓數(shù)據(jù)的讀寫速度更快。所以現(xiàn)在問題產(chǎn)生了,現(xiàn)在擁有的單塊存儲芯片如果芯片的字長比數(shù)據(jù)總線的寬度更小該怎么辦呢?這一小節(jié)要學習的位擴展就是要解決這個問題,通過多塊存儲芯片的合理連接可以讓整個主存的存儲字長擴展為和數(shù)據(jù)總線寬度一致
這里還需要補充一點,之前在講存儲芯片的時候把MAR和MDR都畫在了存儲芯片里面,但是現(xiàn)在的計算機MAR、MDR通常集成在CPU內(nèi)部。所以現(xiàn)在存儲器當中的寄存器其實并不是MAR和MDR,只不過是一個普通的寄存器而已
因此現(xiàn)在使用的計算機一般來說是下圖的結(jié)構(gòu)。CPU里面集成了MAR和MDR,MDR里面存儲的數(shù)據(jù),即要讀或者要寫的數(shù)據(jù),是通過數(shù)據(jù)總線和主存進行交換的。而MAR里存儲的地址數(shù)據(jù)是通過地址總線送給主存的。另外CPU還需要通過控制總線向主存發(fā)送讀/寫這一類的控制信息。此外現(xiàn)在的主存當中一般會包含多塊存儲芯片
存儲器芯片的輸入輸出信號
接下來為了描述方便,給一塊存儲芯片的各個輸入信號和輸出信號進行命名
有可能要輸入多位的地址,地址通常用A(address)表示,A0A_0A0?表示低位。地址通常用D(data)表示,D0D_0D0?表示低位。片選信號通常用CS ̄\overline{CS}CS(chip select)或CE ̄\overline{CE}CE(chip enable)表示,上有橫線表示低電平有效。讀寫控制線的信號通常用WE ̄\overline{WE}WE(write enable)或WR ̄\overline{WR}WR表示,上有橫線表示低電平信號時進行寫操作,高電平信號進行讀操作
也有的地方可能會把讀信號和寫信號分開用兩個輸入端輸入,寫信號用WE ̄\overline{WE}WE表示,讀信號用OE ̄\overline{OE}OE表示,都是低電平有效
增加主存的存儲字長 - 位擴展
如果此時已經(jīng)買到了一塊8K×18K \times 18K×1位的存儲芯片,這個單塊的存儲芯片應(yīng)該如何和CPU進行連接?
?
8K對應(yīng)二進制是2132^{13}213,所以需要用13根地址線來表示這8K個地址,因此這塊存儲芯片對外暴露出的地址線引腳應(yīng)該是A0~A12A_0\sim A_{12}A0?~A12?總共13條,CPU會把它想要訪問的地址通過地址總線送過來,這樣就完成了地址線的連接
接下來看WE信號,CPU也會有一個金屬引腳來發(fā)送這個讀寫控制信號,這個信號通過控制總線傳給這個芯片
接下來看數(shù)據(jù)的傳送,雖然CPU可以通過數(shù)據(jù)總線同時讀或者寫8bit的數(shù)據(jù),然而由于存儲芯片的限制,每一次只能通過數(shù)據(jù)總線來傳送1bit,也就是說數(shù)據(jù)總線的傳輸能力利用不夠充分
這里還有一個CS也就是片選信號沒有接,由于只有這一塊芯片工作,所以可以直接簡單粗暴地給它接上一個高電平的信號
不管怎么說,這樣就完成了單塊存儲芯片和CPU的連接。此時整個主存只有一塊存儲芯片,每一次只能讀或者寫一位的數(shù)據(jù),所以此時主存的存儲字長就是1bit,數(shù)據(jù)總線并沒有被充分地利用
?
為了解決這個問題可以給主存再加上一塊相同型號的存儲芯片,同樣也是8K×18K \times 18K×1位。同樣CPU通過地址總線把它想要訪問的地址信息傳給這塊芯片,因為左邊和右邊都有8K個存儲單元,所以如果把13位的地址信息同時送給這兩塊芯片,地址信息可以同時選中這兩塊芯片相同位置的存儲單元。讀寫控制線也一樣,只需要把CPU發(fā)出的讀/寫控制信號同時送給兩塊芯片就可以,要么同時讀要么同時寫。右邊這塊芯片讀出的這一位數(shù)據(jù)可以作為CPU讀入的D1D_1D1?這一位數(shù)據(jù)。接下來只需要給片選信號加一個高電平,這樣這兩塊芯片就可以同時工作
進行了這個改造之后,整個主存儲器就總共有兩塊存儲芯片,總體來看現(xiàn)在存儲器的存儲字長擴展為了2位,可以同時讀或者同時寫兩位的信息
接下來還可以使用同樣的方法繼續(xù)增加同類型的6塊芯片,最終得到下圖的連接。每一塊芯片都有8K個存儲單元,CPU發(fā)出的A0~A12A_0\sim A_{12}A0?~A12?這13位的地址信息會同時送給8片存儲芯片。由于每一塊芯片的存儲單元只有1bit的數(shù)據(jù),所以會把這8塊存儲芯片的這1位數(shù)據(jù)分別送到數(shù)據(jù)總線的不同位上,接下來數(shù)據(jù)總線可以同時把這8位的信息送給CPU。這樣的話就把整個主存的存儲字長擴展為了8bit。這種連接方式稱為位擴展的方式
接下來再來看第二種連接方式也就是字擴展的方式
增加主存的存儲字數(shù) - 字擴展
假設(shè)現(xiàn)在買了一片8K×88K\times 88K×8位的存儲芯片,CPU可以同時讀或者寫8位的信息。由于存儲芯片字長已經(jīng)有8位了,因此這塊存儲芯片的字長、數(shù)據(jù)的寬度和CPU能夠處理的寬度可以完美匹配,對于這個場景數(shù)據(jù)總線的傳輸能力已經(jīng)被使用到極致,不再需要像之前那樣進行位擴展。同樣的由于它有8K個存儲單元,因此需要有13位的地址信息。接下來再給片選信號加一個高電平,這塊存儲芯片就能正常工作了
現(xiàn)在會發(fā)現(xiàn)CPU還有3個地址位的信息沒有被利用到,這個CPU的MAR本來有16位,也就是這個CPU擁有2162^{16}216的尋址能力,然而現(xiàn)在只利用了13位的地址信息,并沒有完全發(fā)揮出CPU的尋址能力,那如何解決這個問題呢?
?
同樣地,買一塊同型號的芯片,不能簡單的用之前位擴展的方式解決問題。關(guān)鍵在于片選信號的使用,現(xiàn)在把A13A_{13}A13?連到左邊這塊芯片,A14A_{14}A14?連到右邊這塊芯片。由于片選信號高電平有效,當A13A_{13}A13?和A14A_{14}A14?分別為1和0時,左邊的這塊芯片片選信號有效被選中,右邊則不會工作,這種情況下只會讀取出左邊這塊芯片對應(yīng)存儲單元的8bit數(shù)據(jù)。聯(lián)系數(shù)電里譯碼器擴展的內(nèi)容,易得A13A_{13}A13?和A14A_{14}A14?輸入的都是兩個1的信號時,這兩塊芯片都會被選中,這樣兩邊會同時讀或者同時寫數(shù)據(jù),出現(xiàn)沖突
所以如果采用這樣的連線方式,想要讓存儲器正常地工作只能允許A14A_{14}A14?和A13A_{13}A13?這兩位要么為01要么為10,不可以是11和00。此時如果把它們看作是一整個存儲器會發(fā)現(xiàn)在這個存儲器當中00和11開頭的地址都不能用,所以這種連線方法有待改進
這種連線方法我們稱之為線選法,會用一根專門的地址線作為片選信號來選中某一片芯片。如果CPU有n條多余的地址線,采用這種方法就只能有n個選片信號
這里結(jié)合數(shù)電的經(jīng)驗應(yīng)該很容易理解,就不贅述了
接下來對線選法進行優(yōu)化,采用下圖的連線方式。自行結(jié)合數(shù)電理解這個非門的作用,此處詳細講解略過不記
顯然這樣連線之后整個主存的地址空間就是連續(xù)的。這里可以把設(shè)計的小電路看成是1-2譯碼器,什么叫1-2呢?就是輸入1位的地址信息,這一位的地址信息有可能呈現(xiàn)出21=22^1=221=2種不同的狀態(tài),這兩種不同的狀態(tài)會被譯碼器翻譯為要么是上面那條線高電平要么是下面這條線高電平,這就是1-2譯碼器的意思。之前其實接觸過如3-8譯碼器等更復(fù)雜的譯碼器,因此可以順著這個思路往下優(yōu)化,使用一個譯碼器來處理CPU的高位地址部分,這種方法稱為譯碼器片選法,如果CPU能夠給出n位的地址信息,那么通過譯碼器的翻譯可以得到2n2^n2n個片選信號
后面緊跟著介紹了一下3-8譯碼器的工作原理,這里略過不記
主存容量擴展 - 字擴展
現(xiàn)在有了譯碼器之后再來看如何更好的進行字擴展,以2-4譯碼器為例。此處的具體工作原理分析略過不記
注意譯碼器輸出端的小圓圈(進行取反)和CS信號上加的橫線和小圓圈的(低電平有效)含義不同
A15A_{15}A15?這一位還沒有使用,想要再使用這一位,只需要換成3-8譯碼器,然后再增加4片8K×88K\times88K×8位的存儲芯片
考試也有可能考察下面的連法,這種連法下A14A_{14}A14?就是沒用的
這種設(shè)計在實際應(yīng)用中是不可能采用的
?
總結(jié)一下字擴展,實際應(yīng)用中都是采用片選法
| n條線→\to→n個選片信號 | n條線→2n\to2^n→2n個選片信號 |
| 電路簡單 | 電路復(fù)雜 |
| 地址空間不連續(xù) | 地址空間可連續(xù) |
目前學習了位擴展和字擴展,位擴展可以使存儲器的字長變得更長,從而更好地發(fā)揮數(shù)據(jù)總線的數(shù)據(jù)傳輸能力,而字擴展可以增加存儲器的字數(shù),可以更好地利用CPU的尋址能力。這兩種方法可以在不同維度上擴展主存的總?cè)萘?/p>
主存容量擴展 - 字位同時擴展
還可以把字擴展和位擴展兩種方法進行結(jié)合,二者的結(jié)合就是字位同時擴展法,其實原理都是類似的
圖里總共畫出了8塊芯片,因為每一塊芯片是16K×416K\times 416K×4位,而CPU可以同時讀寫8位,所以可以讓每2塊芯片為一組實現(xiàn)位擴展。上面這塊芯片可以把它連接上D0~D3D_0\sim D_3D0?~D3?這4根數(shù)據(jù)線,而后面這塊芯片可以把它連接上D4~D7D_4\sim D_7D4?~D7?這4根數(shù)據(jù)線。下圖中畫的空心箭頭其實指的就是數(shù)據(jù)總線,數(shù)據(jù)總線總共有8位,其中低4位可以由上面這塊芯片傳輸,高4位可以由下面這塊芯片傳輸
再看字擴展。每一塊芯片的字數(shù)是16K=2142^{14}214,所以芯片內(nèi)的地址總共要用14位表示,可以把CPU的A0~A13A_0\sim A_{13}A0?~A13?這14位的地址信息作為片內(nèi)地址。CPU還有兩個高位地址沒有使用,可以給它接上一個2-4譯碼器,總共有4個片選信號,所以可以接上4組,每一組的芯片總共有16K這么多個存儲單元,每一個單元可以存8位的數(shù)據(jù),得到一個64K×864K\times 864K×8位的存儲器。再看每一組芯片所對應(yīng)的合法地址,顯然分別由00、01、10、11開頭,整個主存的地址空間從全0到全1并且中間是連續(xù)不中斷的,同時這個主存的字長也可以完美地匹配CPU的讀寫能力,這就是字位同時擴展法
補充:譯碼器
此處詳細講解略過不記
?
雙口RAM & 多模塊存儲器
先回顧一個概念叫做存取周期,存取周期就是可以連續(xù)讀/寫的最短時間間隔。之前說過對于DRAM芯片,由于DRAM芯片采用了電容這種存儲元,因此對于DRAM芯片的讀操作是破壞性的讀出,所以這種芯片進行一次讀寫操作之后所需要的恢復(fù)時間比較長,一般是存取時間的好幾倍。相比之下,SRAM的恢復(fù)時間就會短很多。存取時間意味著CPU從內(nèi)存里讀出一個字的數(shù)據(jù)實際上只需要t2?t1t_2-t_1t2??t1?的時間,然而雖然存取的時間很快,CPU又必須等這么一段恢復(fù)時間才可以讀取下一個存儲字,所以這就引出了一系列問題
下圖提出的問題中第一個問題可以用雙端口RAM這種方式來解決,而第二個問題可以用多模塊存儲器這樣的方式來解決。多模塊存儲器又可以進一步地分為單體多字、多體多字(高位交叉編址、低位交叉編址)
很多打游戲的同學應(yīng)該聽說過“雙通道內(nèi)存”這個名詞。把電腦改造成雙通道內(nèi)存可以很大地提升電腦的性能
首先來看第一個技術(shù),雙端口RAM。該技術(shù)可以用來優(yōu)化多核CPU訪問一根內(nèi)存條的速度
雙端口 RAM
比如我們的電腦是雙核CPU但只有一根內(nèi)存條,該內(nèi)存條使用雙端口RAM技術(shù),這樣兩個CPU的核心就可以通過它的兩個端口來對內(nèi)存進行訪問。如果要支持雙端口RAM,就必須擁有兩組完全獨立的數(shù)據(jù)總線、地址總線和控制總線,也就是總線設(shè)計會變得更復(fù)雜(如果用大家熟悉的東西來說,就是電腦主板要設(shè)計的更復(fù)雜一些),需要有兩組完全獨立的各種各樣的線,另外CPU里的內(nèi)存控制單元和內(nèi)存里的讀寫控制電路也需要更復(fù)雜的設(shè)計
現(xiàn)在來分析一下這兩個CPU對雙端口RAM的訪問有可能出現(xiàn)的情況,4種情況直接見下圖即可,此處詳細講解略過不記。當發(fā)生3和4這兩種情況時,RAM里的控制電路應(yīng)該向CPU發(fā)送一個“忙”信號,同時會有一些邏輯電路來決定暫時關(guān)閉其中某一個端口,等一個CPU完成操作之后另一個CPU再繼續(xù)訪問
可以把這部分內(nèi)容和操作系統(tǒng)中的“讀者-寫者問題”進行對比。可以同時讀但不能同時寫,這其實和“讀者-寫者問題”一模一樣
多體并行存儲器
之前說過即便是對于一個單核CPU,CPU的讀寫速度也比內(nèi)存快得多,而內(nèi)存每次讀寫之后又需要一段恢復(fù)時間,當CPU想要連續(xù)讀取一些數(shù)據(jù)時,就必須等待它的恢復(fù)時間。可以使用多體并行存儲器解決這個問題
?
可以把下圖理解成是在電腦上插了4根內(nèi)存條,并且每一根內(nèi)存條的大小都一致。可以有兩種編址方案,第一種是高位交叉編址,第二種是低位交叉編址。CPU在對內(nèi)存進行訪問時必須要提供一個內(nèi)存地址,高位交叉編址會采用內(nèi)存地址的更高幾個bit位來區(qū)分要訪問哪一個存儲體,相應(yīng)的低位交叉編址采用內(nèi)存地址的更低幾個bit位來區(qū)分
下圖假設(shè)每個存儲體有8個存儲單元,由這4個存儲體構(gòu)成的一整個主存地址空間大小就是4×8=32=254\times 8=32=2^54×8=32=25,所以可以用5bit來表示主存地址。如果采用高位交叉編址,就意味著對于第一個存儲體的第一個存儲單元,給它的地址應(yīng)該是00 000。高位的00表示這是M0M_0M0?存儲體,后面的000表示在這個存儲體內(nèi)部的第幾個單元,所以把它稱為體內(nèi)地址,類似地下一個存儲單元就應(yīng)該是00 001,再往后都是類似的。采用低位交叉編址時原理差不多,直接見下圖即可
?
現(xiàn)在嘗試著把這些地址信息翻譯為十進制,會發(fā)現(xiàn)地址編號一個是豎著編一個是橫著編,這兩種特性會導致一定的區(qū)別。現(xiàn)在假設(shè)每個存儲體存取周期為TTT,存取時間為rrr,假設(shè)T=4rT=4rT=4r,也就是說CPU從一個存儲體里取走一個字的數(shù)據(jù)總共需要rrr的時間,但是CPU想要再次訪問這個存儲體就需要再等3r3r3r的恢復(fù)時間
對于高位交叉編址,如果要連續(xù)訪問00000、00001、00010、00011、00100這樣一些地址,那么根據(jù)體號和體內(nèi)地址就可以知道第一個地址00000應(yīng)該對應(yīng)M0M_0M0?的哪個存儲單元。接下來畫一個甘特圖,CPU對M0M_0M0?存儲體進行一次讀操作,每一次讀的存取周期是TTT,實際上CPU只花了rrr的時間就完成了讀操作,但是后面還必須等待3r3r3r的時間讓這個存儲體恢復(fù)。由于接下來要訪問的這個存儲單元同樣屬于M0M_0M0?存儲體,所以必須等TTT的時間才可以訪問1號存儲單元,接下來再過一個周期再訪問2號存儲單元,然后是3號、4號。總之由于連續(xù)訪問的地址都屬于M0M_0M0?存儲體,所以每一次訪問完之后都必須等待它恢復(fù),也就是總共要過TTT的時間之后才可以進行下一次讀寫。整個過程讀了5個存儲字,耗時5T5T5T,這是高位交叉編址
由于過程比較簡單,下圖就直接展示甘特圖結(jié)果了
接下來再來看低位交叉編址。根據(jù)00000的末兩位可以知道這個地址從屬于M0M_0M0?存儲體,所以CPU會從M0M_0M0?這讀出一個字
剛才說過其實CPU從存儲器里面讀或者寫一個字實際只需要rrr的時間,因此過了rrr的時間之后,對M0M_0M0?這個存儲單元的讀取工作就已經(jīng)完成,后面3r3r3r的時間CPU不用管這個存儲體,只需要讓它自己恢復(fù)。所以過了rrr的時間后,由于第二個要訪問的這個存儲單元所屬的M1M_1M1?存儲體此時已經(jīng)準備好被讀寫,因此CPU可以直接從M1M_1M1?這讀取數(shù)據(jù)
之后都是類似的,再往后要訪問的2號存儲單元屬于M2M_2M2?,M2M_2M2?此時已經(jīng)準備好被讀寫,所以經(jīng)過rrr時間的讀M1M_1M1?操作之后CPU就可以緊接著讀M2M_2M2?的這個單元
再往后讀M3M_3M3?的過程也是類似的,此處詳細講解略過不記
讀取M3M_3M3?也需要r的時間,讀完M3M_3M3?之后從剛開始算起總共已經(jīng)過了4r4r4r的時間,也就是剛好過了一個存取周期。因此讀取完M3M_3M3?的這個地址之后,M0M_0M0?存儲體又準備好被讀取了,而剛好接下來要讀取的地址又回到了M0M_0M0?,因此到TTT這個時刻CPU又可以緊接著從M0M_0M0?讀出下一個字的數(shù)據(jù)
對于這個例子,讀出地址連續(xù)的4個單元總共的時間開銷是T+4rT+4rT+4r,也就是剛好等于2T2T2T。其實CPU在5r5r5r這個時刻就已經(jīng)取得了這5個字,只不過這里計算總耗時考慮了最后這3r3r3r的恢復(fù)時間。進一步推廣不難得出結(jié)論,當連續(xù)取nnn個存儲字,采用低位交叉編址,那么總耗時應(yīng)該是T+(n?1)rT+(n-1)rT+(n?1)r。因為對各個存儲字的讀取剛好是可以無縫銜接的,所以讀取nnn個存儲字總共需要nrnrnr長的時間,而最后一個存儲字讀取完之后還需要給它留3r3r3r的時間進行恢復(fù),所以整體來看耗時就應(yīng)該是T+(n?1)r,(T=4r)T+(n-1)r ,(T=4r)T+(n?1)r,(T=4r)。這是一種考題,考察對微觀層面的時間開銷的計算
如果連續(xù)讀取的字數(shù)n→∞n\to \inftyn→∞,使用這種策略讀寫一個字的平均只需要rrr的時間。所以在訪問一系列地址連續(xù)的存儲單元時,低位交叉編址的方案效率要比高位交叉編址高得多
這就是多體并行存儲器
為什么要探討“連續(xù)訪問”的情況?
因為在實際應(yīng)用當中很多數(shù)據(jù)其實就存放在一些地址連續(xù)的空間,比如數(shù)組。我們平時寫的程序代碼,或者說程序的指令也是連續(xù)地存放在主存當中的,除非遇到if-else之類需要發(fā)生跳轉(zhuǎn)的地方,否則程序指令肯定是順著地址一條一條往下執(zhí)行的
應(yīng)該取幾個“體”?
既然這種低位交叉編址的方案能讓存取效率變得更高,那應(yīng)該取多少個“體”呢?
直接見下圖說明即可,此處詳細講解略過不記
總之最好的方案還是m=t/rm=t/rm=t/r。這種方案可以讓存取流水線的效率達到頂峰,同時存儲體的數(shù)量最少成本最低
存取時間rrr指的是存儲體的性能瓶頸,存取字至少也需要r這么長的時間。而總線傳輸周期rrr指的是通過數(shù)據(jù)總線把一個數(shù)據(jù)傳給CPU至少需要rrr的時間。所以雖然這兩種表述方式背后的含義是不一樣的,但是都意味著CPU存取一次時間不可能低于rrr,因此不管題目給的是哪種條件,都可以按同樣的算法來處理
多模塊存儲器
目前為止介紹了多體并行存儲器,這種存儲方案的特點是每一個體,每一模塊之間是相互獨立的,與這種方案相對應(yīng)的另一種方案是單體多字存儲器
上面這種實現(xiàn)方式可以讓每一個存儲體獨立地工作,CPU可以自由地選擇每一次要從哪個存儲體讀出哪個字,它們之間都是相互獨立的。而下面這種方案相當于把這幾個存儲體進行了一個合并,整個存儲器只有一套讀寫電路,地址寄存器和數(shù)據(jù)寄存器。本來每次只能讀寫一個存儲字,但是經(jīng)過這樣的合體之后每次讀取的就是一整行也就是4個字。為了配合這種單體多字存儲器,需要把數(shù)據(jù)總線的寬度改為m個字,每次可以并行地讀出m個字。顯然這種單體多字存儲器靈活性要比多體并行存儲器差一些,我們并不能單獨地選擇要讀取其中的某個字,只能一次讀一整行也就是4個字的內(nèi)容。不過如果從整體讀寫速度的提升來看,上面這種方案和下面這種方案都差不多,無論是哪種方案,都能很大地提升主存的讀寫速度
?
?
以上就是這一小節(jié)理論部分的內(nèi)容,接下來我們嘗試把這個理論應(yīng)用到現(xiàn)實生活當中
以內(nèi)存條為例,之前說過雙通道內(nèi)存可以提升整體性能,事實上所謂雙通道內(nèi)存就是低位交叉的二體存儲器,給電腦插了2根內(nèi)存條之后,CPU給這2個內(nèi)存條編址采用低位交叉編址方案,雖然內(nèi)存的讀寫速度跟不上CPU,然而CPU可以交替地訪問這兩個內(nèi)存,這樣就可以讓內(nèi)存的整體吞吐量幾乎翻倍
當然這里所謂的翻倍指的是連續(xù)訪問的情況,經(jīng)過之前的講解應(yīng)該不難理解
可以拆開主板看一下,很多主板給的內(nèi)存條卡槽顏色不一樣(如下圖,雖然該主板支持的DDR2內(nèi)存已經(jīng)過時了,但是現(xiàn)在的主板其實也都差不多)。以后如果有2根內(nèi)存條應(yīng)該插到顏色相同的卡槽里面,只有這樣才是低位交叉編址。如果其中一條插到了黃色這,另一條插到了綠色這,這種插法相當于給這兩個內(nèi)存條進行高位交叉編址,只是單純地擴充了內(nèi)存的容量,并沒有提升訪存速度
當買內(nèi)存條時可挑選相同主頻和容量的兩根內(nèi)存條來組成雙通道。當然可以買一根16GB的內(nèi)存直接插到主板上,但是更好的方式是選擇兩根8GB的內(nèi)存然后分別插到黃色的卡槽上,這樣內(nèi)存性能能更高。所以這也是為什么去搜內(nèi)存條時會發(fā)現(xiàn)有的商家賣內(nèi)存條是按16G×216G\times 216G×2這樣來賣的,因為兩根一起就意味著可以組成一個雙通道
下圖中內(nèi)存條的主頻是3200MHz,這反映了它的讀寫周期有多快。主頻越高,相應(yīng)的讀寫周期TTT就越短,讀寫時間rrr也越短。如果買的是兩根主頻不一樣的內(nèi)存條,那主頻更高的內(nèi)存條就會進行降頻處理,也就發(fā)揮不出它所有的功效,因為CPU在處理多體存儲器的各個體時只有TTT和rrr都相等才比較方便,這就是為什么要選相同主頻的原因
想要將兩個內(nèi)存條組成雙通道時如果容量不同,則只有低地址部分這兩個內(nèi)存可以組成雙通道,高地址部分依然是單通道的性能,而這有可能會導致電腦性能不太穩(wěn)定。如果打游戲時游戲剛好被裝到了低地址部分,那游戲可能會運行的更流暢一些,畫面幀數(shù)什么都會更好,但是如果游戲被裝到了高地址部分,那運行起來就會更卡。所以如果組成雙通道的兩根內(nèi)存容量不一樣,電腦性能有可能會更不穩(wěn)定
再以下面兩張筆記本電腦配置截圖為例。左圖說明的是整個電腦的概況,為內(nèi)存16GB的MacBook Pro。但查看內(nèi)存的詳細頁面會看到電腦里面其實是插了兩根8GB的內(nèi)存條,第一根內(nèi)存條插在0號卡槽里,第二根內(nèi)存條插在2號卡槽里。有可能該電腦的主板也有4個卡槽,編號分別是0~3,插在0號和2號時就可以組成一個雙通道,所以這臺電腦在出廠時或許就已經(jīng)考慮到了雙通道的問題
?
外存儲器 磁盤存儲器
外存儲器
磁表面存儲器每次讀寫都以1bit為單位,讀和寫不能同時進行
磁盤存儲器
主機每次對磁盤進行讀寫操作都以扇區(qū)為單位
?
?
?
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LGF91Us5-1663675480178)( https://xdu-cslee-blog.oss-cn-hangzhou.aliyuncs.com/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20220911231846759.png)]
?
?
磁盤陣列
?
固態(tài)硬盤SSD
U盤也使用閃存技術(shù)
機械硬盤與固態(tài)硬盤
固態(tài)硬盤的結(jié)構(gòu)
塊大小:16KB$\sim$512KB
頁大小:512B$\sim$4KB
系統(tǒng)對SSD的讀寫以頁為單位,一個邏輯塊對應(yīng)一個SSD里面的一個頁
如果數(shù)據(jù)存放在機械硬盤里面,一個邏輯塊對應(yīng)著一個磁盤塊/扇區(qū),磁盤的讀寫以塊為單位
?
對于SSD,一個邏輯地址對應(yīng)的實際物理位置可能會變,閃存翻譯層會把映射關(guān)系修改正確
想要再次往已經(jīng)寫入數(shù)據(jù)的頁寫入數(shù)據(jù)必須先把一整塊擦除,SSD會把同塊的其他數(shù)據(jù)復(fù)制到另一塊的對應(yīng)位置,然后再把新數(shù)據(jù)寫到另一塊,接著把原來的塊擦除,同時閃存翻譯層會重新進行映射
理想情況下,固態(tài)硬盤的壽命
?
Cache的基本概念和原理
從這一小節(jié)開始會進入這章的重點,大題和小題的高頻考點Cache
之前學習了存儲系統(tǒng)的一些優(yōu)化策略。可以用雙端口RAM、多模塊存儲器的方式來提高主存的工作速度,但是無論主存的速度再怎么提高,相比CPU的讀寫運算速度依然很大。為了解決這個問題,一個比較容易想到的方法是設(shè)計更高速的存儲單元,比如把DRAM芯片改成SRAM芯片,但是這又意味著存儲器價格會更高,或者從另一個角度來想當成本相同時容量肯定要下降
基于程序的局部性原理,可以再增加一個Cache層來緩和CPU和主存之間的矛盾
來看一下Cache的工作原理
Cache 的工作原理
先看沒有Cache的情況。假設(shè)下圖是一個手機,輔存空間上安裝了各種各樣的軟件
現(xiàn)在要啟動微信,過程其實就是把微信相關(guān)的程序代碼還有數(shù)據(jù)調(diào)入內(nèi)存。比如微信里面可能會有一個模塊用來處理文字聊天,還有一個模塊用來處理視頻聊天,還有一個模塊的代碼指令專門用來實現(xiàn)朋友圈的相關(guān)功能。當然除了應(yīng)用軟件的代碼指令之外,也會有一些相關(guān)的數(shù)據(jù)被調(diào)入內(nèi)存,比如微信的聊天數(shù)據(jù)還有朋友圈里的圖片之類的緩存數(shù)據(jù)也需要放到內(nèi)存里
把這些數(shù)據(jù)調(diào)入內(nèi)存之后微信就可以開始正常運行了。微信運行的過程其實就是CPU從內(nèi)存一條一條地取指令并執(zhí)行指令。不過之前說過CPU和內(nèi)存的速度差異很大,所以快速的CPU每一次都從內(nèi)存里讀取數(shù)據(jù)就會導致CPU的執(zhí)行效率被內(nèi)存的讀寫速度所拖累
假設(shè)現(xiàn)在正在視頻聊天,在視頻聊天的這段時間內(nèi),只有視頻聊天的相關(guān)指令代碼在這段時間內(nèi)會被頻繁地訪問
所以如果能夠把視頻聊天相關(guān)的代碼復(fù)制一份到更高速,讀寫速度更快的Cache當中。那么CPU就可以直接從Cache當中讀取視頻聊天相關(guān)的指令和數(shù)據(jù)。而Cache的讀寫速度比內(nèi)存快多了,這樣CPU和內(nèi)存之間的速度矛盾就能被緩和,可以更好地配合高速的CPU工作
這就是Cache的工作原理
上圖左下角圖中最右邊的Latency列表示CPU訪問主存的某一個存儲單元和訪問Cache的某一個存儲單元所需要付出的時間代價
在上圖中Cache和CPU畫成了兩個框,但是現(xiàn)在的計算機通常Cache高速緩沖存儲器被集成在CPU內(nèi)部
Cache用SRAM芯片實現(xiàn).之前說過SRAM速度要比DRAM快得多,但是成本也會更高。另外SRAM的集成度會更低,這就意味著如果想要把Cache高速緩沖存儲器塞進一個很小的手機里面,注定了Cache的存儲容量不可能做的特別大,這并不是有錢就能解決的問題,得考慮集成度和體積。Intel i5i5i5系列CPU的Cache大小可能也就是12MB
局部性原理
大家可能會覺得剛才說的視頻聊天的場景比較特殊,其他的程序運行也會存在描述的這么理想的場景嗎?就是說在某一段時間內(nèi)CPU是否只會訪問到某一部分的數(shù)據(jù)?這個問題可以用程序的局部性原理解釋,局部性原理是Cache能有效工作的理論依據(jù)
下圖中程序A是個遍歷二維數(shù)組的過程,這個程序運行時需要把代碼翻譯成二進制機器指令再放到內(nèi)存里面,另外像數(shù)組還有各種各樣的變量也需要被放到內(nèi)存里面
假如現(xiàn)在訪問了a[0][0]a[0][0]a[0][0]這個元素,那么在接下來一段時間內(nèi)和a[0][0]a[0][0]a[0][0]這個元素相鄰的元素很有可能緊接著被訪問,這就是所謂的空間局部性
剛才看的是數(shù)組的數(shù)據(jù),其實除了數(shù)據(jù)之外,指令的訪問也存在空間局部性。因為這些程序最終肯定會被翻譯成一條一條的機器指令,而這些機器指令在內(nèi)存里也是順序存放的,因此當訪問某一條機器指令時,在不久的將來與這條機器指令相鄰的其他機器指令也有可能緊接著被使用到
再看時間局部性,要理解時間局部性最典型的例子就是程序A里的這種循環(huán)結(jié)構(gòu)。比如程序A中加法所對應(yīng)的指令可能被存放在內(nèi)存里的某一位置,當訪問了這條加法指令之后,由于有這種循環(huán)結(jié)構(gòu)的存在,在未來很短的時間內(nèi)有可能會再次使用到加法所對應(yīng)的指令
這就是空間局部性和時間局部性。空間局部性是因為指令和數(shù)據(jù)在內(nèi)存里通常是順序存儲的,訪問這些指令和數(shù)據(jù)時很多時候都是需要順序地訪問,這就導致了空間局部性。而時間局部性主要是因為程序里面會存在大量的循環(huán)結(jié)構(gòu),這就導致了時間局部性。除了對指令的訪問具有時間局部性之外,對某一些數(shù)據(jù)的訪問也具有時間局部性,比如對于變量i,j,sumi,j,sumi,j,sum,這些變量因為循環(huán)結(jié)構(gòu)的存在也很有可能在短時間內(nèi)被重復(fù)地訪問
?
基于程序執(zhí)行的局部性原理,不難想到這樣的策略,由于CPU當前訪問的主存地址周圍的那些數(shù)據(jù)很有可能在不久的未來就被使用,另外CPU當前訪問的地址也有可能在未來被重復(fù)地訪問,所以可以把CPU當前訪問地址周圍的部分數(shù)據(jù)復(fù)制一份放到Cache中,接下來CPU就可以直接從Cache里讀取相應(yīng)的數(shù)據(jù)
比如當訪問這個數(shù)組時,如果此時CPU訪問了a[0][0]a[0][0]a[0][0]這個元素,那完全可以制定一定的策略把a[0][0]a[0][0]a[0][0]之后的多個數(shù)組元素復(fù)制一份到Cache當中。這樣接下來CPU想要訪問這些數(shù)據(jù)時去Cache里面找就可以了,這樣就可以大幅度提升CPU的運行速度
在實際當中可能程序B的實際運行時間要比程序A慢得多
接下來看一下增加了Cache之后整個系統(tǒng)的程序運行效率會提升多少
性能分析
還是以剛才微信的運行為例。直接見下圖即可,此處詳細講解略過不記
有待解決的問題
對于Cache依然還有很多有待解決的問題
第一個問題直接見下圖即可,此處詳細講解略過不記
此外還有一些問題留待接下來幾節(jié)探討。CPU會優(yōu)先從Cache里面找數(shù)據(jù),但如果Cache當中找不到,CPU又會到主存里面找數(shù)據(jù),那么當CPU訪問了主存的某一個存儲單元之后一定會把這個存儲單元所從屬的一整塊立即調(diào)入到Cache當中,注意這個過程只會把數(shù)據(jù)復(fù)制一份,并不會刪除主存里的數(shù)據(jù)
現(xiàn)在問題產(chǎn)生了,訪問的這些主存塊有可能被放到Cache的每一個位置,那么應(yīng)該如何記錄主存塊和Cache塊之間的對應(yīng)關(guān)系?CPU如何區(qū)分Cache數(shù)據(jù)和主存數(shù)據(jù)的對應(yīng)關(guān)系?這個問題是下一小節(jié)學習的Cache和主存的映射方式要探討和解決的問題
?
第二個問題,之前說過Cache的容量很小,而主存的容量一般要比Cache大得多,這就意味著只能把主存中的一小部分數(shù)據(jù)放到Cache當中。那么Cache滿了之后應(yīng)該怎么辦?這個問題是下下小節(jié)當中替換算法要解決的問題
?
最后一個問題,主存里保存的數(shù)據(jù)被復(fù)制了一份到Cache當中,比如用美圖秀秀P圖時,圖片數(shù)據(jù)有可能會被放到Cache當中,圖片的數(shù)據(jù)是被復(fù)制了一份到Cache里面。當進行P圖時CPU其實會優(yōu)先更改Cache里面保存的數(shù)據(jù),而Cache里的數(shù)據(jù)只是一個數(shù)據(jù)副本,真正的數(shù)據(jù)母本被保存在主存當中。那應(yīng)該如何保證數(shù)據(jù)副本和數(shù)據(jù)母本之間的一致性?這也是后面的小節(jié)要解決的問題,也就是Cache的寫策略所要探討的問題
?
Cache和主存的映射方式
上一小節(jié)的末尾留下了幾個問題,由于Cache保存的是主存里某些數(shù)據(jù)塊的副本,那么如何區(qū)分Cache數(shù)據(jù)塊與主存數(shù)據(jù)塊之間的映射關(guān)系?這一小節(jié)要學習的Cache和主存的映射方式探討的就是這個問題
本節(jié)內(nèi)容直接見圖即可,詳細講解略過不記
全相聯(lián)映射(隨意放)
“全相聯(lián)映射“如何訪存?
直接映射(只能放固定位置)
映射到相同位置會把之前存放的數(shù)據(jù)覆蓋掉
可以進一步對標記進行優(yōu)化
“直接映射”如何訪存
組相聯(lián)映射(可放到特定分組)
仿造直接映射的思路,同樣可以對標記進行優(yōu)化
“組相聯(lián)映射”如何訪存
?
Cache替換算法
本節(jié)學習Cache的替換算法,在之前的小節(jié)中留下了三個問題。上一個小節(jié)解決了第一個問題。第二個問題就是Cache很小,主存很大,但是每次被訪問的主存塊一定會被立即調(diào)入Cache,這就意味著Cache很容易被裝滿,當Cache裝滿之后應(yīng)該怎么辦?這就是替換算法要解決的問題
結(jié)合上一小節(jié)學習的這些地址映射方式,可知替換算法只會被用到全相聯(lián)映射和組相聯(lián)映射這兩種方式。直接映射時不需要考慮替換算法。這一小節(jié)以全相聯(lián)映射為例學習四種替換算法
隨機算法( RAND )
假設(shè)總共有4個Cache塊,并且剛開始所有的Cache塊都是空的。所以剛開始訪問1、2、3、4這幾個主存塊時都需要把這些主存塊依次調(diào)入到Cache當中。1號主存塊放到0號位置,2號主存塊放到1號位置,接下來3、4號主存塊也是類似地被放到Cache的相應(yīng)位置。剛開始訪問的這幾個主存塊都沒有命中,每訪問一個主存塊就需要把這塊的數(shù)據(jù)從主存調(diào)入到Cache。由于前邊的這幾次訪問Cache都沒有裝滿,所以不需要進行Cache替換
接下來要訪問1號主存塊,由于此時1號主存塊已經(jīng)被存放到Cache當中,所以這次的訪問可以命中。接下來2號主存塊也一樣可以命中
要訪問5號主存塊時,由于此時4個Cache塊當中存放的主存塊分別是1、2、3、4號,5號主存塊沒有被調(diào)入Cache,而之前說過每訪問一個主存塊就一定要把這個主存塊立即調(diào)入Cache,所以此時就需要根據(jù)Cache塊的替換算法決定要替換哪一塊。根據(jù)隨機算法的規(guī)則可以隨便選一個塊進行替換,比如把3號主存塊換出去換入5號主存塊
對下表中后面步驟的詳細講解略過不記。接下來的幾種方法也會記得簡略些
先進先出算法( FIFO )
最先被調(diào)入Cache的塊也有可能在之后會被頻繁地訪問到。比如C語言程序很有可能在剛開始就調(diào)用了printf函數(shù),而這并不意味著往后就用不到這個函數(shù)了
近期最少使用算法( LRU )
做題時可以采取一種比較快的方法,當要替換一個Cache塊時,從當前訪問的這個主存塊號位置往前看,看哪些主存塊最近被訪問過,從后往前看最后一個出現(xiàn)的主存塊號就是應(yīng)該被替換的主存塊
如何用硬件實現(xiàn)近期最少使用算法的?上一小節(jié)說過每一個Cache行需要有一個標記用來記錄這個Cache行里所存儲的主存塊號,另外還需要增加一個有效位,除了這些信息之外,如果要使用LRU算法,那么還必須給每一個Cache行添加一個計數(shù)器屬性。剛開始所有的Cache行都是空的,計數(shù)器也會被全部置為0。計數(shù)器的編號規(guī)則見下圖所示
后面步驟的具體說明略過不記
當然也可以同樣地把3加1變成4,但是這樣毫無意義,讓它的值保留原本的3也可以達到同樣的效果。因為設(shè)置計數(shù)器的目的是想通過計數(shù)器值的大小判斷應(yīng)該替換哪一個主存塊,我們想要選擇的是計數(shù)器值最大的一個Cache塊并把它替換掉,3這個值本來就已經(jīng)是最大的了,所以再讓3加1沒有意義。這種處理策略的好處是當只有4個Cache行時,4個計數(shù)器的值可能是0、1、2、3這幾種情況
模擬機器執(zhí)行要比手算麻煩一點,但是機器這樣處理計數(shù)器是有好處的,剛才說過采用這樣的策略可以保證所有這些計數(shù)器的值只有可能出現(xiàn)0、1、2、3這幾種情況
當Cache塊的總數(shù)為2n2^n2n時,只需要nnn個比特位作為計數(shù)器。比如這個例子當中只有4個Cache塊,那么就只需要2bit的信息來表示計數(shù)器,2bit剛好可以表示0、1、2、3這幾種數(shù)字。這樣的策略保證了當用硬件實現(xiàn)替換算法時硬件電路的設(shè)計會更簡單,只需要增加2bit的冗余信息
該算法的特點如下
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SYGKQyLX-1663675480182)( https://xdu-cslee-blog.oss-cn-hangzhou.aliyuncs.com/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BB%84%E6%88%90%E5%8E%9F%E7%90%86%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87/image-20210303122900238.png)]
最不經(jīng)常使用算法( LFU )
后面步驟的具體說明略過不記
該算法的特點如下
?
Cache寫策略
之前提出了三個待解決的問題,前兩個問題已經(jīng)解決了,就剩最后一個問題。就是Cache當中保存的只是主存里數(shù)據(jù)的副本,那么CPU對Cache里的數(shù)據(jù)進行寫操作之后,如何保證主存和Cache的數(shù)據(jù)一致性?這就是Cache的寫策略要探討的問題
分為兩種情況來探討寫策略,第一種情況如果此時CPU要寫的存儲單元被命中,也就是已經(jīng)在Cache里面,如何處理?可以有兩種方法,分別叫全寫法和寫回法。第二種情況如果此時CPU想要寫的地址沒有命中,那又會有兩種處理策略,分別是寫分配法和非寫分配法
為何這里只探討寫操作?如果CPU進行的是讀操作而不是寫操作,那無論是讀命中還是讀不命中,都不會導致Cache和主存數(shù)據(jù)不一致的問題
?
首先來看第一種情況,就是CPU要對某一個地址進行寫操作,并且這個地址所對應(yīng)的主存塊已經(jīng)被調(diào)入Cache當中
寫命中
為了減少CPU的訪存次數(shù),可以增加一個寫緩沖,可以把它看作是一個先進先出的隊列。寫緩沖用SRAM制造,用SRAM制造就意味著對寫緩沖的讀寫操作會比直接往主存里寫快得多
寫不命中
多級Cache
之前說過Cache里保存的是主存里一小部分數(shù)據(jù)的副本,更高級更快速的Cache所保存的數(shù)據(jù)又是更低一級Cache的一小部分數(shù)據(jù)的副本,因此在各級Cache之間同樣存在數(shù)據(jù)一致性的問題。既然要保證數(shù)據(jù)的一致性,就可以使用之前介紹的幾種方法
可以去Windows電腦的任務(wù)管理器看一下性能這一頁,在這里可以看到CPU的詳細信息,如它有幾級Cache,每一級Cache容量有多少
?
頁式存儲器
頁式存儲
虛地址 vs 實地址
頁表:邏輯頁號 —> 主存塊號
地址變換過程
地址變換過程(增加TLB)
快表采用SRAM,主存采用DRAM。SRAM的讀寫速度要比DRAM更快
在電路設(shè)計方面,快表是一種相聯(lián)存儲器,可以按內(nèi)容尋訪。CPU可以根據(jù)標記的實際內(nèi)容通過硬件電路快速找到在快表當中有沒有與標記相對應(yīng)的數(shù)據(jù)
虛擬存儲器
虛擬存儲系統(tǒng)
頁式虛擬存儲器
存儲器的層次化結(jié)構(gòu)
段式虛擬存儲器
段頁式虛擬存儲器
總結(jié)
以上是生活随笔為你收集整理的计算机组成原理笔记(王道考研) 第三章:存储系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(3218):批量传递props
- 下一篇: 软件开发工作的绩效评估