原文地址:https://blog.csdn.net/redRnt/article/details/83445031
重要考大題
一、存儲器的分類
存儲器是計算機系統中的記憶設備,用來存放程序和數據,從不同的角度對存儲器可以做不同的分類。
1、按存儲介質分
- 半導體存儲器(又稱易失性存儲器):體積小,功耗低,存取時間短,電源消失的時候,所存的信息也隨之消失。
- 磁表面存儲器(非易失性存儲器):如磁盤
- 光盤存儲器(非易失性存儲器):耐用,可靠,如光盤
2、按存取方式分
- 隨機存儲器(RAM):任何一個存儲單元內容都可以隨機存取,像數組的下標,可以直接訪問元素。訪問速度較快,常用於制作主存和Cache
- 順序存取存儲器(SAM):只能按某種順序來存取,即與存取時間和存取單元的物理位置有關。(比如磁帶)
- 直接存取存儲器(DAM):如磁盤
- 相聯存儲器(CAM):按內容檢索
3、按計算機中作用分
二、計算機的層次結構
存儲器有三個性能指標,速度,容量,每位價格(位價)。
就一般而言,速度較高,位價越越高,容量越小。反之,速度越低,位價也越低,容量也就越大。
存儲系統的層次結構主要體現在緩存——主存和主存——緩存兩個存儲層次上。如圖:
- 緩存——主存層次:這一層面主要解決CPU與主存速度不匹配的問題,主存用來存放將要參與運行的程序和數據。但是其速度與CPU相差很大,為了使得他們之間的速度更好匹配,於是在主存與CPU之間插入了一種比主存更快,容量更小的高速存儲器(Cache),因此只要把近期要使用的信息調入緩存,CPU便可以直接從緩存中獲取信息。注意,主存與緩存中的數據調動是由硬件自動完成,對程序員是透明的。
- 主存——輔存層次:這一層面主要解決存儲系統的容量問題,輔存的速度較低,但是容量大,用於存放暫時未用到的信息,當CPU要用到這些信息的時候,將輔存的內容調到主存中,供CPU直接訪問,主存與輔存之間的數據調動是由硬件和操作系統共同完成的。
三、半導體隨機存儲芯片
半導體隨機存儲器芯片內集成有記憶功能的存儲矩陣,譯碼驅動電路和讀/寫電路等等。
讀寫電路:包括讀出放大器和寫入電路,用來完成讀/寫操作。
地址線:單向輸入,其位數與芯片的容量有關
片選線:確定哪個芯片被選中(用來選擇芯片)
數據線:雙向輸入,其位數與芯片可讀出或者寫入的位數有關,也與芯片容量有關。
存儲容量
通常我們將存儲容量表示為:
字數 X 位數,比如 64K X8位,其含義為,以8位構成一個字,一共有64個字。這個概念要相當熟悉,后面理解題目很有用。
下面我們來看一道例題:
一個64K x 8位的存儲器,可以由()個16k x1位的存儲芯片構成?
分析:64K x 8位,說明該存儲器是以8位構成一個字,因此,每讀出一個字,需要選中8片16k x1位的存儲芯片,而一片能表示16k,因此一共需要64/16 = 4片,根據組合的原理,一共需要4x8 = 32片。
從圖中我們可以看出,相當於把32個芯片分成了4組,每組8片(表示8位)。
於是我們得出這樣的結論:
半導體隨機存取器,習慣上多稱為RAM,按其存儲信息原理不同,可以分為靜態RAM(SRAM)和動態RAM(DRAM)
SRAM
SRAM存儲原件所使用的mos管多,占用硅片面積大,集成度低,但是采用觸發器工作原理存儲信息,因此即使信息讀出之后,它仍然保持原狀,不需要再生,但是電源掉電時,原存有的信息就會消失,因此它屬於易失性存儲器。因為這個比較的簡單,因此就簡單介紹一下就好:
工作原理:觸發器
優點:
- 能長久保存信息
- 速度快,工作穩定
- 無需刷新
- 無需讀后再生
缺點:功耗大,集成度低,價格高。
典型應用:cache
DRAM(這個是重點)
與SDRAM相比,DRAM所用的mos管少,占硅面積小,因而功耗小,集成度高但是因為采用了電容存儲電荷的原理來寄存信息,會發生漏電現象,所以要保持狀態不變,需要定時刷新,因為讀操作會使得狀態發生改變,故需要讀后再生。且速度比SRAM慢。但是由於其功耗小,集成度高,被廣泛應用於計算機中。
典型應用:主存
存儲記憶原理
定義:存“0”:C中沒有電荷,存“1”:C中有電荷
讀入的時候,T中的高電平使得T通導,如果此時C有電荷,那么數據線就會產生電流,視為讀出1.否則視為讀出0
寫入的時候,若為高電平,則經過T對C充電,充電后有電荷,於是存1,若為低電平,C經過T時放電,C中沒有電荷,於是存0.
DRAM的刷新
問:為什么要對DRAM進行刷新?如何進行刷新?
由於動態存儲器的原理是容存儲電荷的原理,且訪問存儲單元是隨機的,有可能某些存儲單元長期得不到訪問,其存儲單元內原信息就會慢慢消失(原因)。刷新的過程實質上是將原信息讀出,再由刷新放大器形成原信息並重新寫入的再生過程,稱為讀后再生。
下面介紹一下刷新過程中要用到的名詞。
- 刷新周期:在規定的時間內,對DRAM全部基本單元進行一次刷新(即兩次刷新之間的相隔時間),一般為ms級別,2ms。
- 死時間:刷新時,某段時間需要暫停讀寫操作,這段時間由於外界不能對存儲器進行操作,因此稱為死時間。
- 存取周期:DRAM完成一次讀寫操作所需要的最短時間
- 死時間率:
DRAM常見的刷新方式有三種:集中刷新,分散刷新,異步刷新
刷新的過程為:以行為單位,讀出一行中全部單元的數據嗎,經過信號放大后,同時寫回。讀出時候一定斷開存儲器的輸出。
集中刷新:
做法:在刷新周期內,對全部存儲單元集中一段時間進行刷新(逐行進行),此時必須停止讀寫操作。
看看下面的例題:
設對128 x 128矩陣的存儲芯片進行刷新,若存取周期為0.5us,刷新周期為2ms,采用集中刷新的方式,那么對128行集中刷新,一共需要()us?死時間率為()%?
分析:刷新一遍的時間 = 存取周期 x行數,於是可以求得刷新時間。在刷新時間內,不能進行讀寫操作,因此死時間就是刷新的那段時間,占用的存取周期數值上等於行數。利用計算公式算出死時間率為32.%。所以很容易得到:
但是這種做法有個極其不好的缺點:對於經常要進行讀入讀出的程序,要陷入大量的等待時間,CPU的工作效率不高。
分散刷新:
做法:對每行存儲單元的刷新分布到每個存取周期內完成,其中吧機器的存取周期(記為tc),分成兩個部分,前半段的tm用來記錄讀寫,后半段(tr)用來刷新,即tc = tm +tr。如圖:
若讀寫周期 tc = 0.5us ,那么存取周期tc = (0.5+0.5)us = 1us
現在沿用上面的題目:
設對128 x 128矩陣的存儲芯片進行刷新,若存取周期為1us,刷新周期為2ms,采用分散刷新的方式,那么對128行分散刷新,一共需要()us?死時間率為()%?
分析:因為在讀寫操作之后,立刻刷新,那么每讀取操作一次,就會刷新一次,刷新128行就需要 1us x 128 = 128 us。由於刷新是在讀寫操作過后直接完成的,所以不存在死時間。也就是死時間率為0.
缺點:這樣無異於加長了存取周期,會使系統運行速度降低,刷新操作也過於頻繁。
異步刷新
做法:在刷新周期內對所有行各刷新一次,即每隔(刷新周期/總行數)us,刷新一次。這種方式是前面兩種方式的結合,既能縮短死時間,又能充分利用刷新周期,提高刷新頻率。
題目同上:
設對128 x 128矩陣的存儲芯片進行刷新,若存取周期為0.5us,刷新周期為2ms,采用異步刷新的方式,那么對128行異步刷新,一共需要()us?死時間率為()%?
每隔(2ms/128) = 15.6us刷新一次,每一次刷新,死時間都是存取周期內的時間為0.5us,對於該行來說,下一次輪到它刷新還是間隔了2ms,所以死時間率為 1/4000.(2ms 里面有4000個存取周期)。所以;
1/4000 << 3.2%
若將DRAM的異步刷新安排在CPU對指令的譯碼階段(此階段CPU訪問存儲器),那么也就不存在死區。
四、ROM
ROM——只讀存儲器,顧名思義,只能讀出不能寫入的存儲器。但是隨着用戶的需要,總希望修改原ROM里面的內容。 ROM中一旦有了信息,就不能輕易改變,也不會在掉電時丟失,它們在計算機系統中是只供讀出的存儲器。因此,SRAM、DRAM都是易失性(揮發性)存儲器,而ROM是非易失性的存儲器。
ROM器件有兩個顯著的優點:
1. 結構簡單,所以位密度比可讀/寫存儲器高。
2. 具有非易失性,所以可靠性
在計算機系統中,既有RAM模塊也有ROM模塊,ROM模塊中常用來存放:
- 系統啟動程序和參數表,常駐內存的監控程序
- 操作系統的常駐內存部分,某些語言的編譯程序及解釋程序等。(所以操作系統是存在於RAM和ROM之中的)
ROM常分為以下幾種:
1. 掩模型ROM(MROM):在制作mask時將信息(Program)編排進去。光刻成的ROM,所存信息與mask完全一致,不可改變。故名全固定ROM。適合大批量生產已成型的產品。小量生產則成本上升(mask制作工藝復雜,周期長),所以,總是在一個計算機系統完成開發以后,才用掩膜ROM來容納不再作修改的程序或數據。如家電洗衣機、風扇的程序 2. 一次可編程ROM(PROM):只能實現一次編程,不得再修改。寫入時,利用外部引腳輸入地址,對其中的二極管鍵進行選擇,使某一些被熔斷,某一些保持原狀,於是就進行了編程。
3. 可擦除可編程ROM(EPROM):可以由用戶對所有信息進行有限次數的修改,可采用光擦,電擦等方式對內容進行改寫。對信息擦除的時候,只能全部擦除。
4. 電可擦寫PROM(EEPROM或E2PROM):利用高壓擦寫 可字節擦,也可全片擦。一般用在即插即用設備,它既有ROM的非易失性,又有RAM 的可讀寫功能,編程方便。
5. 閃速存儲器(flash memory):簡稱閃存,在EEPROM基礎上發展起來的新型電可擦除非揮發性存儲器件。存儲單元結構類似於EEPROM,主要差別是閃存的氧化層較薄,因而電擦性能更好。它從全片擦除/按字節擦除進步到部分(塊)擦除,寫入快,適合文件存儲,並且擦寫次數10萬次以上,讀取時間小;存儲單元只需單個MOS管,結構更簡單,容量更大。是替代磁盤的理想工具。不過在寫入的時候,要擦除原有的數據,因此寫入比讀出的速度略慢。
EEPOR與閃存
早期的手機軟件一般放在EEPROM中,打電話時,最后撥打的號碼暫存在SRAM (類似於緩存),不是馬上 寫入通話記錄(記錄保存在EEPROM中),因為當時正在通話,如果寫入,影響質量 現在的主板,手機也用閃存.一般的手機,ROM=C盤,RAM=內存,SD卡相當於外存,硬盤 。筆記本也用閃存替代原來的磁盤。
五、主存擴容及其連接
由於單片存儲芯片的容量總是有限的,但很難滿足實際的需要,因此必須將存儲芯片連在一起才能組成足夠的容量。這個過程簡稱主存擴容。常見的擴容方式有:字擴展。位擴展 字位同時擴展。主存與CPU的連接通過數據總線 地址總線 控制總線與CPU相連接。
其中:
地址線決定了CPU可尋址的最大內存空間。
控制總線(讀寫)指出總線周期的類型和本次輸入輸出操作完成的時刻。
MDR:數據寄存器,用來存入內存中讀入/寫出的信息。
MAR:地址寄存器,用來存放當前CPU訪問的內存單元地址
主存擴容
位擴展
位擴展是指增加存儲字長,例如,2片1K X4位的芯片,可以組成1K X 8位的存儲器。
滿足下列條件時,采用位擴展的方式:
- 只加長每個存儲單元的字長,而不增加存儲單元的數量
- 芯片數=設計要求的存儲器容量/選擇芯片存儲器容量
- 芯片之間采用並聯的方式
例如下題:
利用1K×4位的SRAM芯片,設計一個存儲容量為1K×8位的SRAM存儲器,問:需要芯片,地址線,數據線的數量各為多少?
分析:顯然從1K X 4 位 ——>1k X 8位,字長不變,只是位長發生了變化。所以使用位擴展。所以,有:
(1)需要芯片數為:
(1K×8)/(1K×4)=2片
(2)需要地址線數為:
1k表明存儲單元個數,1k = 2^10,說明有10根地址線。
(3)需要多少根數據線?
需要組成8位的存儲器,8代表數據線的位數,每片芯片占4根線即可實現位擴展。
字擴展
這種方式僅僅增加了存儲單元數,各單元位數不變。 如下題:
利用1K×8位的DRAM芯片,設計2K×8位的DRAM存儲器(字擴展),問需要芯片,地址線,數據線的數量各為多少?
解析:顯然從1K X 8 位 ——>2k X 8位,字數邊長,位數不變,應該選字擴展。
(1)需要幾片芯片? d=(2K×8)/(1K×8)=2(片)
(2)需要多少地址線? 2K個存儲單元對應11根地址線
(3)需要多少數據線? 8位,即8條
字位同時擴展
這種方式是指即加長存儲單元的數量又增加各單元的位數,字位同時擴展的時候,先進行位擴展,在進行字擴展。 例如下題:
利用1K×4位的存儲芯片,組成4K×8位的存儲器。問需要芯片,地址線,數據線的數量各為多少?擴展過程如何?
數據線條數等於存儲字長,如存儲容量64K*32bit,存儲字長和數據總線是32(也是MDR的位數)
解析:
(1)共需幾塊芯片: (4K×8)/(1K×4)= 4×2=8
(2)需要幾根地址線: 4K地址空間(存儲單元的個數),需要12根地址線
(3)需要幾根數據線: 8根。
(4)擴展過程:先進行位擴展,這個過程相當於分組,將2片1K×4位構成一組,利用位擴展,構成1K X 8位的完整存儲單元(如何構成,繼續往下看)。這樣一共可以分成四組。再將這些分組視為一個完整的存儲單元,進行字擴展。
主存與CPU的連接
我們前面剛剛講了理論上可以構成我們需要的芯片,那么實際上如何通過那些地址線和數據線去連接主存與CPU呢?大致過程可以分成5步。
1. 選擇合理的存儲芯片 合理選擇芯片,是指選擇芯片的數量及其種類(即ROM還是RAM)。通常來說,ROM存放系統程序,標准子程序以及各類常數。RAM則是為用戶編程設置的。在考慮芯片數量的時候,盡量選擇使得連線簡單方便的芯片。
2. 地址線的連接 CPU的地址線通常要比存儲芯片的地址線數要多,常見的做法是:將CPU的低位與存儲芯片的地址線相連,CPU地址的高位一般用於擴充或者片選。例如CPU地址線為16位(A0-A15).1K X4位的存儲器芯片僅有10根地址線A9-A0這個時候就可以將CPU的低地址段A9-A0與芯片A9 - A0相連。
3. 數據線的連接 這里跟地址線的連接不同,這里要求數據線數一定要相同。,如果CPU數據線與存儲芯片的數據線不同,那么要先進行位擴展再連接。
4. 片選線的連接 片選線的連接是CPU與存儲芯片能否正確工作的關鍵。存儲器由許多存儲芯片一起組成,哪一片被選中完全取決於該芯片的片選控制端CS能否接受CPU的片選有效信號.。而片選的有效信號由與CPU的訪問控制信號MREQ有關。
5. 讀寫命令線 讀寫線一般直接與存儲芯片的讀/寫控制端相連,高電平為讀,低電平為寫
圖解字擴展和位擴展
其實一開始學這個有點懵主要是書上給的實例都是立體圖,大家不好觀察,那么我手繪了一下大致的過程(手殘莫嫌棄哈)。 例子我們還用之前提到的,現在我們用下圖表示1K x 4 位的芯片:
位擴展是增加位長,連接方式是並聯:
字擴展是字長,連接方式是串聯(下圖中最后一個數字是2047,我拍完照才發現,就不重畫了,這里糾正一下):
所以很容易得出字為同時擴展的圖片,我就不畫了。
字,位擴展在CPU連線中的區別
問,在位擴展和字擴展中,CS分別是如何連接的?
答:在位擴展中所有片的CS連在一起,而字擴展則是采用將多出的地址線用來片選(通常CPU的位地址與芯片地址相連,高位用於片選)。
這里舉個例子,假設兩個4位的芯片構成一個8位的存儲單元,肯定是要將所有的芯片一同訪問才能訪問到8位。即兩個芯片要一起選(看我畫的圖2),所以也就意味着所有的CS都連在一起。
但是字拓展中,是兩個8位的存儲單元,每次操作只能對其中的一個芯片單元操作,就是到底要選擇哪個芯片的問題。(認真看看我手繪的圖3應該就懂了)
問:那數據線如何連接?
答,在位擴展時,每個芯片的數據線分為低位高位連接。但是字擴展中每個芯片都和所有的數據線進行連接
六、並行存儲器
隨着計算機應用領域的不斷擴大,處理的信息量越來越多,並且現代計算機的I/O設備也在不斷增加,因此,提高訪存的速度已經成為了迫不及待的任務。於是就出現了並行存儲器。 在介紹並行存儲器之前,
先來介紹一個概念: 存儲器的帶寬:表示單位時間內存儲器存取的信息量,可用字/秒或者位/秒表示。是衡量數據傳輸率的重要技術指標。存儲器的帶寬是決定了以存儲器為中心的機器獲得信息的速度。
可以通過下面的幾種方式提高:
1. 縮短存取周期
2. 增加存儲字長
3. 增加存儲體
雙口RAM
為了提高CPU訪問存儲體的速度,可以采用雙端口的存儲器,多模塊存儲器等技術,它們同屬於並行技術。前者為空間並行,后者為時間並行。雙口RAM的模型圖如下:
該模型允許兩個獨立的控制器同時異步地訪問存儲單元。但是這種方式有時也會帶來一些讀取錯誤。例如:
1. 兩個端口對同一個地址單元寫入
2. 兩個端口對同一地址單元,一個寫入,一個讀出。
(熟悉操作系統的朋友應該能看出來,這是個讀者寫者問題的模型),
通常的處理方式是設立一個置忙信號Busy,當遇到上述狀況的時候,將busy置0.暫時關閉一個端口。 可以看出,這是一個從空間上並行的存儲技術。
多模塊存儲器
我們還可以從時間上並行並行存取。我們知道CUP的速度要比存儲器要快,如果我們同時從存儲器中取出幾條指令,那么我們就可以充分利用CPU資源,提高運行效率。 多體並行存儲器,由多體模塊構成,每個模塊都有相同的容量和存取速度,有獨立的讀寫控制電路,地址寄存器和數據寄存器。
多體並行存儲器分為高位交叉編址和低位交叉編址兩種。
高位交叉編址
當程序按體內地址順序存放,即一個體存滿之后,再存入下一個體時,這種方式稱為順序存儲,高位地址表示題號,低位表示體內地址(注意0 1 2 3....的順序是從上往下的):
因此,CPU給出一次存儲訪問總是對一塊連續的存儲單元進行的,在多CPU系統中,不同的CPU訪問不同的存儲塊,達到並行工作。 存儲軌跡可以用下面的線條表示:
低位交叉編址
對應於高位交叉編址,低位交叉編址指的是將程序連續存放在相鄰體中,又稱交叉存儲。(注意,0 1 2 3的順序是從左往右的)
這種做法可以在不改變存取周期的前提下,提高存儲器帶寬,因為可以在一個訪問周期下,訪問多個不同的存儲體。適用於單處理器系統
存儲軌跡可以用下圖表示:
訪存沖突
但是低位交叉存儲可能導致訪存沖突,當訪存地址在相鄰的四次訪存中,出現在同一存儲塊內,就會發生訪存沖突。
比如,下面有一組將要訪問的地址序列(3 9 17 2),采用的是4體低位交叉存儲(即4個存儲體,從0開始編號)。
我們可以通過計算得知3,9,17,2分別位於存儲體3,1,1,2. 由於我們的訪存方式是一次性訪問多個不同的存儲體,
比如這個是4體,一次性同時訪問4個不同的體,那么就分別是 0,1,2,3及其對應的其他存儲單元。
由於訪問的順序存在體數重合,因此有一次訪問是一定失敗的,這就是訪問沖突。
那么如何算給定訪問序列的所在體數呢?
所在體數 = 序列號mod體數,比如3%4 = 3,9%4 = 1
兩種並行存儲器的訪問時間
設存儲器的模塊數為n,存取周期為T,總線傳輸周期為i,當采用流水線方式存取的時候,: 1. 若采用高位交叉編址,那么連續讀取n個字節所需的時間t1為: t1 = T +(n - 1 )i
2. 若采用低位交叉編址,那么連續讀取n個字節所需的時間t2為:t2 = nT
3. 存儲器的交叉模塊數 m >= T/i
七、Cache工作原理
為什么要引入Cache
cache,高速緩沖存儲器,是一種以RAM為材料制成的高速存儲器。引入的原因主要有:
1. I/O設備向主存的訪問級別高於CPU,在I/O訪存期間,CPU將處於空閑狀態。
2. 主存速度的提高始終跟不上CPU的發展,主存與CPU的速度明顯不匹配
局部性原理
程序訪問的局部性原理包括時間局部和空間局部性。前者是指最近未來要用到的信息很可能是正在使用的信息,這是因為程序存在循環。后者是指指令和數據在內存中都是連續存放的並且有些指令和數據往往會被多次調用(如子程序,循環程序和一些常數)。因此只要將CPU近期要用到的程序和數據前從主存送到Cache,這樣大多數情況下,CPU都能直接從Cache中取得指令和數據。
Cache的工作原理
Cache是一種容量小而速度快的高度緩沖器,由快速的SRAM組成,直接做在CPU內,速度幾乎與CPU一樣快,任何時刻都有一些主存塊處於緩存之中,因此,CPU欲訪問主存的時候,有兩種可能: 1. 所需要的字已經在緩存中,於是CPU直接訪問Cache,(通常一次傳送一個字,主存不參與) 2. 所需要的字不在緩存中,那么此時需要將字所在的主存塊整塊一次調入Cache中,(即主存-Cache之間以塊為單位進行傳送 )。主存塊調入緩存的過程,稱為建立對應關系。
我們將第一種情況稱為 CPU訪問Cache命中,簡稱Cache命中。第二種情況為不命中。由於緩存塊數目遠小於主存數,因此每個緩存快要設立一個標識,用來表明當前存放的是哪一個主存塊。 Cache的容量與長度是影響Cache效率的重要因素,通常用命中率來衡量Cache的效率 。 在一個程序執行期間,設總的命中次數為Nc,訪問主存的次數為Nm,那么命中率可以這樣表示:
設Tc為命中時Cache的訪問時間,那么Tm為未命中時的主存訪問時間,那么平均訪問時間為;
其中H為命中率,顯然1 - H就是未命中率。 顯然,越好的Cache,其Ta值越接近Tc(即H接近於1)。
Cache與主存之間的映射
在Cache中,地址映射是指把主存地址空間映射到Cache地址空間,在將主存塊復制到Cache中的時候遵循一定的映射規則,標志位為1時候,表示其Cache映射的主存塊數據有效。(注意與地址變換的區別,地址變換是指CPU在訪存的時候,將主存地址按照映射規則換算成Cache地址的過程 )。 地址映射有三種方式:直接映射,全相聯映射,組相聯映射、
1. 直接映射
這種方式主存塊只能裝入Cache的唯一位置,若該位置已有內容,則產生塊沖突,原來在Cache中的塊將無條件被替換出去,直接映射的關系可以定義為:
j = i mod2^c
其中,j為Cache的塊號或者行號。i為主存塊號,2^c為Cache的總塊數,因此主存的
只能映射到第0行,依次類推,其地址結構為:
CPU的訪存過程:首先根據地址中間的Cache字塊地址,直接找到對應的Cache塊號,若塊號的有效位為1,則表示命中,否則為不命中此時從主存中讀取該地址所在的主存塊號,並將其內容送到對應的Cache塊並將有效位置1,同時將內容送到CPU。 缺點:這種方式映射不夠靈活
2. 全相聯映射 這種方式可以把主存數據塊裝入Cache的任意一塊, 方式可以從已占滿的Cache存儲塊中,替換出任一舊塊,顯然這種方式靈活,命中率也高,縮短了塊沖突,與直接相聯映射相比,其主存字塊位數增加,使得Cache標記位增多地址變換速度慢。通常使用“按內容尋址的”相聯存儲器。其地址結構為:
3. 組相聯映射
將Cache空間分成大小相同的組,主存的一個數據塊可以裝到組內的任一個位置,即組間采取直接映射,組內采取全相聯映射。 如果把Cache分成Q組,每組有R塊,那么有: i= j % q 其中i為緩存的組號,j為主存塊號主存地址分為三個字段:
當組內2塊的時候,稱為2路組相聯映射。
CPU訪存過程:首先根據中間的組地址,找到對應的Cache組,若其標記位為1,說明命中,此時根據塊內地址,在對應得Cache行中,存取信息,若不命中,那么此時從主存中讀出該地址所在的主存號塊,送到對應的Cache組的任一行,有效位置1,同時將內容送到CPU中。
下一篇將介紹一下Cache相關的算法跟計算。
七、Cache塊中的替換算法
前面我們提到過,在Cache與主存之間的映射過程當中,當遇到已有的主存塊的時候,我們的操作是直接進行替換的。因為對於直接映射來說,每一個主存塊都對應映射到固定的一個Cache行中,因此在替換的過程中,也就不需要什么替換算法了,直接進行替換就好。
替換算法
其他的兩種方式,都需要考慮替換算法 常見的替換算法有:
- FIFO算法:即先進先出的算法,選擇最早調入Cahce的字塊進行替換,這種方式實現簡單。但是由於總是以最早調入的Cache塊為替換目標,沒有按照程序的局部性進行。所以並不能提高Cache的命中率。因為最早調入的信息,以后可能還會用到。
- LRU算法:近期最少使用算法,這種做法替換的是近期用的最少的字塊,較好的利用了局部性原理,但是需要時刻記錄Cache各個字塊的使用情況,以便確定那哪個字塊是近期最少使用的。
- LFU算法:將一段時間內訪問次數最少的存儲塊換出,每行設立一個計時器,每訪問一次,計時器的數值加1,替換的時候,將最數值最小的Cache塊替換出去。
- Rand算法:顧名思義,隨機替換。
注意:Cache對於用戶來說是透明的,用戶編程的時候,所用的地址是主存地址,用戶並不知道這些主存塊是否已經調入了Cache塊中,因為主存與Cache之間的替換是由機器自動實現的。
Cache寫策略
Cache的寫操作比較復雜,因為對Cache塊內寫入信息,必須與映射的主存塊內的信息完全一致,那么如何使得cache與主存的內容一致呢?目前常用的方式有以下兩種:
1. 全寫法(write—through):又稱寫直達法,即在進行寫操作的同時,寫入Cache和主存,這樣主存中的數據與Cache中的數據就能時刻保持一致。但是這樣會導致訪存次數的增加。
2. 寫回法(write—back):即寫操作的時候,只把數據寫入Cache中,待到Cache塊要被換出的時候,再寫出到主存中,,為了識別Cahce中的數據是否與主存中的一致,於是在Cache中每一塊都增設一個標志位(也稱為“臟”位)。臟位有兩種狀態,清:表示未被修改過,這個塊當然也與主存間的數據塊的內容一致了;濁:則表示被修改過,內容與主存不一致,於是替換算法就將此塊替換出去。並將濁位置為清。顯然在計算機中用0和 1 來表示這兩種狀態
而上面的兩種狀態,都是對應於寫命中的情況(也就是CPU要寫的單元都在Cache上面),那么當CPU訪問的數據塊不在Cache中,那又該如何?
我們也常常有兩種做法:
- 寫分配法:加載主存的塊到Cache中,然后更新這一塊。(所以常常跟寫回法一同使用 )
- 寫不分配法:對應於上面的做法,這個做法就是只是將要修改的內容寫入到主存塊而已,不進行與Cache之間的調塊
Cache的改進
Cache的特性決定了它不能大容量的存儲,所以目前我們普遍采用多個Cache,主要的改進方面有1,增加Cache的級數。2將統一的Cache變成分立的Cache。於是有了多級緩存的概念。將緩存分為多個級別,越接近CPU,速度就越快,容量也就越小。所以指令Cahce和數據Cache一般都在L1(靠近CPU)的那一級別。隨着集成電路的發展,又把一級緩存直接與CPU做 在同一個芯片上,稱為片內緩存。其他的稱之為片外緩存。
下面來看一道Cahce——主存映射的題目
其實有三問,但是我們只需要了解一問就好了。接下來讀題:
第一,主存容量為16mb,也就是2的24次方b,所以主存地址的總字段長度為24位。(不然表示不了那么多的地址)
第二,Cache容量的為8kb,根據前面的數據,我們可以知道這個機器是用字節存儲的,所以每個字塊8個字,每個字32位。32位就是4個字節,即8 X 4B.,所以塊內地址一共需要5位。
第三,我們要確定組內地址,也就是說Cache要被分成幾組。我們剛剛得到了塊內的地址,那么這個時候我們就知道了Cache一共有8kb/2^5 =2的8次方,也就是2的8次方塊。 於是的得出組數為:2的8次方除以4(4塊為一組) = 2的6次方。 所以組內地址字段為6.
第四,用總長度減去已知的兩個長度,於是得到標記字段。
八、補充知識點:
- SRAM和DRAM在與CPU的連接上有什么不同?
答:在實際中,DRAM芯片采用的是地址復用技術,至於什么是地址復用技術,自行查閱資料。做題只需要知道一點,那就是其地址線變為原來所需要的一半。片選的時候用兩個跟線,一根用來選行,一根用來選列。(分別稱為行通選線和列通選線)。
2. 按字編址與按字節編址。
一般的我們常常使用 字數X位數的方式來表示計算機容量。比如8K X16位 代表的是這個存儲器一共有8K個存儲單元,每個存儲單元存放16位字。 我們知道 1B = 8bit。
所以上面的8K X16位可以寫成8K X 2B也就是16KB,所以上面的式子表示的容量又可以寫成是16KB。因此,如果按字節編址,上面的式子應該表示為:
16K X 1B
如果按字編址,那么寫法應該是這樣的:
8K X16位(這個位數跟機器字長有關,題目會給)
3. 主存塊與主存單元的區別。 主存塊,是為了與Cache或者是與虛擬存儲器更好的映射,從而按照一定大小分成的塊(這里是個人理解,未經證實,慎重參考)。而存儲單元是主存中一個個有編號的單元,就像8K X16位就有8k個這樣的單元。從0開始編號。所以某個主存有8k個存儲單元不等於其有8K個塊,至於它在第幾塊,除一下就知道了。(后面有參看的題目)
4. 交叉存儲方式什么時候會發生訪存沖突? 交叉存儲的特點就是一次性並行訪問多個存儲體,並且邊訪問邊傳輸,達到提高訪存速度的目的。假設有這樣的一個4體交叉訪問存儲系統:
訪問序列為 0 1 2 3 ,這個時候恰好剛剛一次訪問完畢,因為各個序列號都位於不同的儲存體內,訪存不會發生沖突。但是如果序列號為0 2 3 4呢?4顯然跟0在同一個存儲體,由於事先訪問了0,於是在結束這一行的並行訪問的時候,是在占用存儲體1的,這個時候也就導致4訪問不到。於是發生訪存沖突。 所以得出結論,只要在相鄰的m個序列中,存在位於同一個存儲體中的序列,他們就會發生訪存沖突。(假設有m個體)
5. 怎么計算所需要的地址線與數據線? 先回顧一下地址線與數據線的作用: 地址線:單向輸入,其位數與存儲字的位數有關 數據線:雙向輸入,其位數與讀出或者寫入的數據位有關。 地址線10根,數據線8根,那么芯片的容量可以表示為: 2^10 X 8 = 8K位,所以用這種方式很容易知道數據線與地址線的個數
第一題
分析:這道題考查的是DRAM與SRAM之間的區別,基本概念題。放在這里只是希望能再熟悉一下基本的特點。秒選23.
第二題
分析:這兩道都是概念題,記住就好。無論是SRAM還是DRAM都是易失性存儲器。由於ROM是只讀的,斷電不會失去數據,所以為非易失性。SRAM速度快,被廣泛用於Cache的制作。刷新的問題就不說了。所以11選A。
再看看第二題,閃存是一種只讀存儲器(ROM),所以屬於非易失性,采用隨機存儲方式,是理想的磁盤替代者。那么為什么A不對。因為我們說過,ROM的寫入都是要擦除才能進行寫入的。而讀取操作不需要對主存進行什么改變,因此寫操作一定是要比讀操作要慢的,畢竟寫之前要擦除。
第三題
分析:這四道題都是一類題。所以放在一起,一次性攻克。
引腳數,是指所有連線的個數(包括地址線,數據線,片選等等)。
1024 = 2^10.,數據線顯然是8根。加上片選線,讀,寫線。加起來最少為21.
第二題倒是干脆利落,32k = 2^15,秒選C
第三題,按照正常思維,我們需要10根地址線,8根數據線,但是題目說了地址復用技術,所以地址線減半,為5根。所以光是地址線+數據線就需要 5+8 = 13(根),加上兩根讀寫線,兩根通選線,所以最少為13+2+2 = 17(根)
第四題,有了上一題就好辦了,注意題目問的是該DRAM的地址引腳跟數據引腳,沒問其他的。所以4M = 2^22,需要22根地址線,但是注意了,DRAM是地址復用的,所以需要的是 11+8 = 19(根)。
第四題
分析:這是一道簡單的計算題。如果題目沒有特殊說明,一般的刷新周期取2ms。
1.異步刷新是按行一次刷新,縮短死時間,每一行之間間隔(2ms/64)刷新一次,然后向下取整,結果為31us。
2.集中刷新,其刷新一次所需要的時間 = 要刷新的行數 X 存取周期。死時間為6.4us,死時間率是指死時間占刷新周期的比例,結果為0.32%。
第五題
分析:這道題目很有味道,可以說很經典,首先我們要知道字位擴展的原理,擴展后的地址變化,二進制與16進制之間的轉換。很精彩,我就手寫一次。
第六題
分析:上一道題是給出容量算地址,這道題反過來,給出地址算容量。我們先確定這個地址空間包含多少個可用的地址: 5FFFH - 4000H + 1 = 2000H(為什么加1?因為地址從0開始數的)。
一個16進制數用4個二進制數表示,所以2000H是2^13B(題目說了按字節編址)。也就是8KB。所以RAM地區為64 -8 = 56KB,所以,所需要的芯片數為(56K X 8位)/(8K X 4位) = 14