原文地址:https://blog.csdn.net/redRnt/article/details/83445031程序員
重要考大題算法
1、存儲器的分類編程
存儲器是計算機系統中的記憶設備,用來存放程序和數據,從不一樣的角度對存儲器能夠作不一樣的分類。數組
一、按存儲介質分緩存
二、按存取方式分異步
三、按計算機中做用分工具
2、計算機的層次結構性能
存儲器有三個性能指標,速度,容量,每位價格(位價)。
就通常而言,速度較高,位價越越高,容量越小。反之,速度越低,位價也越低,容量也就越大。
存儲系統的層次結構主要體如今緩存——主存和主存——緩存兩個存儲層次上。如圖:spa
3、半導體隨機存儲芯片操作系統
半導體隨機存儲器芯片內集成有記憶功能的存儲矩陣,譯碼驅動電路和讀/寫電路等等。
讀寫電路:包括讀出放大器和寫入電路,用來完成讀/寫操做。
地址線:單向輸入,其位數與芯片的容量有關
片選線:肯定哪一個芯片被選中(用來選擇芯片)
數據線:雙向輸入,其位數與芯片可讀出或者寫入的位數有關,也與芯片容量有關。
一般咱們將存儲容量表示爲:
字數 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存儲原件所使用的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常見的刷新方式有三種:集中刷新,分散刷新,異步刷新
刷新的過程爲:以行爲單位,讀出一行中所有單元的數據嗎,通過信號放大後,同時寫回。讀出時候必定斷開存儲器的輸出。
集中刷新:
作法:在刷新週期內,對所有存儲單元集中一段時間進行刷新(逐行進行),此時必須中止讀寫操做。
看看下面的例題:
設對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訪問存儲器),那麼也就不存在死區。
4、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卡至關於外存,硬盤 。筆記本也用閃存替代原來的磁盤。
5、主存擴容及其鏈接
因爲單片存儲芯片的容量老是有限的,但很難知足實際的須要,所以必須將存儲芯片連在一塊兒才能組成足夠的容量。這個過程簡稱主存擴容。常見的擴容方式有:字擴展。位擴展 字位同時擴展。主存與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呢?大體過程能夠分紅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,我拍完照才發現,就不重畫了,這裏糾正一下):
因此很容易得出字爲同時擴展的圖片,我就不畫了。
問,在位擴展和字擴展中,CS分別是如何鏈接的?
答:在位擴展中全部片的CS連在一塊兒,而字擴展則是採用將多出的地址線用來片選(一般CPU的位地址與芯片地址相連,高位用於片選)。
這裏舉個例子,假設兩個4位的芯片構成一個8位的存儲單元,確定是要將全部的芯片一同訪問才能訪問到8位。即兩個芯片要一塊兒選(看我畫的圖2),因此也就意味着全部的CS都連在一塊兒。
可是字拓展中,是兩個8位的存儲單元,每次操做只能對其中的一個芯片單元操做,就是到底要選擇哪一個芯片的問題。(認真看看我手繪的圖3應該就懂了)
問:那數據線如何鏈接?
答,在位擴展時,每一個芯片的數據線分爲低位高位鏈接。可是字擴展中每一個芯片都和全部的數據線進行鏈接
6、並行存儲器
隨着計算機應用領域的不斷擴大,處理的信息量愈來愈多,而且現代計算機的I/O設備也在不斷增長,所以,提升訪存的速度已經成爲了火燒眉毛的任務。因而就出現了並行存儲器。 在介紹並行存儲器以前,
先來介紹一個概念: 存儲器的帶寬:表示單位時間內存儲器存取的信息量,可用字/秒或者位/秒錶示。是衡量數據傳輸率的重要技術指標。存儲器的帶寬是決定了以存儲器爲中心的機器得到信息的速度。
能夠經過下面的幾種方式提升:
1. 縮短存取週期
2. 增長存儲字長
3. 增長存儲體
爲了提升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
7、Cache工做原理
cache,高速緩衝存儲器,是一種以RAM爲材料製成的高速存儲器。引入的緣由主要有:
1. I/O設備向主存的訪問級別高於CPU,在I/O訪存期間,CPU將處於空閒狀態。
2. 主存速度的提升始終跟不上CPU的發展,主存與CPU的速度明顯不匹配
程序訪問的局部性原理包括時間局部和空間局部性。前者是指最近將來要用到的信息極可能是正在使用的信息,這是由於程序存在循環。後者是指指令和數據在內存中都是連續存放的而且有些指令和數據每每會被屢次調用(如子程序,循環程序和一些常數)。所以只要將CPU近期要用到的程序和數據前從主存送到Cache,這樣大多數狀況下,CPU都能直接從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中的時候遵循必定的映射規則,標誌位爲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相關的算法跟計算。
7、Cache塊中的替換算法
前面咱們提到過,在Cache與主存之間的映射過程中,當遇到已有的主存塊的時候,咱們的操做是直接進行替換的。由於對於直接映射來講,每個主存塊都對應映射到固定的一個Cache行中,所以在替換的過程當中,也就不須要什麼替換算法了,直接進行替換就好。
其餘的兩種方式,都須要考慮替換算法 常見的替換算法有:
- FIFO算法:即先進先出的算法,選擇最先調入Cahce的字塊進行替換,這種方式實現簡單。可是因爲老是以最先調入的Cache塊爲替換目標,沒有按照程序的局部性進行。因此並不能提升Cache的命中率。由於最先調入的信息,之後可能還會用到。
- LRU算法:近期最少使用算法,這種作法替換的是近期用的最少的字塊,較好的利用了局部性原理,可是須要時刻記錄Cache各個字塊的使用狀況,以便肯定那哪一個字塊是近期最少使用的。
- LFU算法:將一段時間內訪問次數最少的存儲塊換出,每行設立一個計時器,每訪問一次,計時器的數值加1,替換的時候,將最數值最小的Cache塊替換出去。
- Rand算法:顧名思義,隨機替換。
注意: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,主要的改進方面有1,增長Cache的級數。2將統一的Cache變成分立的Cache。因而有了多級緩存的概念。將緩存分爲多個級別,越接近CPU,速度就越快,容量也就越小。因此指令Cahce和數據Cache通常都在L1(靠近CPU)的那一級別。隨着集成電路的發展,又把一級緩存直接與CPU作 在同一個芯片上,稱爲片內緩存。其餘的稱之爲片外緩存。
其實有三問,可是咱們只須要了解一問就行了。接下來讀題:
第一,主存容量爲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.
第四,用總長度減去已知的兩個長度,因而獲得標記字段。
8、補充知識點:
答:在實際中,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