按存儲介質分類
(1)半導體存儲器:
TTL,MOS,SSD。
易失
(2)磁表面存儲器:
磁頭,載磁體
非易失
(3)磁芯存儲器:
硬磁材料,環狀元件
非易失
(4)光盤存儲器:
激光,慈光
非易失程序員
按存取方式
(1)存取時間與物理地址無關 (隨機存取)
類比於數據結構中的線性表數組(取數組某個元素的時間和物理地址無關,只和index有關)
(a)隨機存儲器:程序執行過程當中可讀可寫
(b)只讀存儲器:程序執行過程當中只讀
(2)存取時間與物理地址有關(串行訪問)
類比於數據結構中的鏈表
(a)順序存取存儲器:磁帶
(b)直接存取存儲器:磁盤(根據物理地址,直接移動磁頭)算法
按在計算機中的做用分類
(1)主存
(a)RAM:操做系統被加載到RAM
SRAM:(Static Random Access Memory)靜態隨機存儲器。經常使用製做二級緩存。
沒必要刷新電路就能保存數據。但體積大,集成度低
DRAM:(Dynamic Random Access Memory)動態隨機存取存儲器。經常使用語製做系統內存
DRAM用電容存儲數據,須要定時充電,刷新電路,不然出處的數據丟失。集成度高
(b)ROM:存儲機器自檢和引導程序,BIOS等程序
MROM:(Mask Read-Only Memory)掩模式只讀存儲器。MROM的內容在出廠前一次寫入,以後不能更改
PROM:(Programmable Read-Only Memory)-可編程只讀存儲器。只能寫入一次數據的只讀存儲器,寫入錯誤只能更換存儲芯片
EPROM:(Erasable Programmable Read Only Memory)可擦除可編程只讀寄存器
EEPROM: (Electrically Erasable Programmable Read-Only Memory),電可擦可編程只讀存儲器。SSD
(2)輔存
磁盤,磁帶,光盤編程
存儲結構綜述
(1)cpu只能和主存,cache進行數據交互,而不能直接得到輔存的數據
(2)輔存的數據只能調入主存,不能直接進入緩存中。
(3)輔存到主存的映射是由OS操做系統管理的。可是主存和輔存之間的一個映射關係被放到TLB中,TLB在cache中。
(4)虛擬存儲中的頁表,段表,段頁表被放到了主存中。cpu經過頁表訪問輔存時,發現缺頁中斷,就會先暫停程序的執行,先把數據調到內存windows
主存中存儲單元地址的分配
(1)尋址的個數有2個因素:
(a)地址線的個數:這是內存中總的可尋址字節數
(b)一個地址所佔用的字節數:代表了一個內存單元,佔用多少個字節
(2)\(\frac{內存可尋址的總字節數}{多少字節造成一個內存單元} = 可尋址數\)
(3)eg:地址線24根,按字節尋址,可尋址\(2^24 = 16M\)個
若字長爲16位,按字尋址,可尋址8M個
若字長爲32位,按字尋址,可尋址4M個數組
主存的指標
(1)存儲容量:存放二進制代碼的總位數
(2)存取速度:
存取時間:存儲器的訪問時間(讀出時間,寫入時間)
存取週期:連續兩次獨立的讀寫存儲器操做之間,最小的時間間隔。用於讀電路,寫電路,地址電路清空一次
(3)存儲器帶寬 (位/秒)緩存
半導體存儲片的基本結構
(1)地址線單向,數據線雙向。
(2)半導體芯片的容量由地址線和數據線一塊兒決定。
地址線和數據線的根數表示了內存實際的大小,而cpu理論上的最大尋址範圍,由MAR和MDR的大小決定,爲\(2^{MAR}*MDR\)
|地址線|數據線|芯片容量|
|:---------:|:-------:|:-------:|
|10根|4根|\(2^{10} * 4\)bit|
|14根|1根|\(2^{14} * 1\)bit|
(3)片選線的做用
eg:用16K1位的存儲芯片組成64K8位的存儲器
(a)由於半導體芯片是用存儲矩陣設計的,存儲矩陣的一行能夠當作一層樓,這層樓有多個小房間。
所以,先把8個161K的存儲器放在一行,構成一層樓。再安排4層這樣的樓層,構成64K8的大樓
(b)由於,一個地址線的地址過來後,先經過片選線(地址爲的最高几位),選擇樓層,
而後用剩下的地址線低位地址,選擇是樓層的那個房間
(c)eg:當上例子中,地址線過來的數據是65535,轉換成二進制是1111 1111。
上面樓層有4層,因此地址線的前兩位進行片選,也就是11,所以選擇最高層。數據結構
半導體存儲芯片的譯碼方式:
(1)線選法:每一個小存儲單元佔用一行,構成多行的線性結構
每一個小存儲單元佔用一行,構成多行的線性結構
eg:161 bit的存儲矩陣,佔16行,由於要選擇16行,因此要有4位片選線,連接全部的16個存儲單元。
這種設計致使電路設計異常複雜。
(2)重合法 : 組合多個存儲單元爲一行:
經過組合多個存儲單元爲一行,來減小行數,達到減小片選線位數的目的,簡化電路設計。但此時的存儲矩陣,每行有多列存儲單元,所以,用X地址譯碼器(肯定行),用Y地址譯碼器(肯定列),來選到具體的某個存儲單元。
eg:256 1bit重合片選法:把8個bit存儲單元做爲一行,設計32行便可。
由於有32行,所以X地址譯碼器有5位,由於有8列,所以Y地址譯碼器有3位
dom
SRAM
(1)SRAM:靜態隨機存儲器,不用刷新電路,使用雙穩態管存儲數據,不掉電狀況下數據存在。
(2)SRAM基本電路異步
DRAM
(1)DRAM:動態隨機存儲器,定時刷新電路,使用電容存儲數據,不掉電狀況下也須要定時對電容充電。
(2)DRAM的存儲矩陣是二維的,有行有列。因此要對行和列進行片選。行列片選的片選片進行復用,即同一個針腳,先選擇行,後選擇列。
(3)動態RAM刷新 (刷新與行地址有關:默認數據能保持2ms)ide
(a)集中刷新(存取週期0.5\(\mu s\))
集中刷新是一次刷新存儲矩陣中全部的存儲單元。即,在數據能保持的這2ms內,分爲能讀寫的週期時間,和不能讀寫的電路刷新時間。這個刷新時間,也稱爲"死區「。電路刷新,一次刷新存儲矩陣的1行,這個刷新一行的時間等於一個存取週期
eg:當存儲矩陣爲128128,存取週期爲0.5\(\mu s\)時,刷新時間=128 0.5 = 64\(\mu s\),即死區時間佔64\(\mu s\),其死區時間率爲\(\frac{64}{2000} = 3.2%\)
(b)分散刷新(存取週期爲1\(\mu s\))
分散刷新是,在每次讀寫數據後,馬上刷新改行存儲矩陣。即一個存取週期=讀寫時間+電路刷新時間。而讀寫時間等於電路刷新時間,因此,1個存取週期等於2個讀寫時間,爲20.5=1\(\mu s\)。
分散刷新不存在死區,可是使得一次存取時間變成原來的2倍
(c)異步刷新
異步刷新不在一次刷新全部行,也再也不每次讀寫後馬上刷新,而是保證在2ms內,每一行獲得刷新便可。因此其死區時間爲0.5\(\mu s\)。若是將刷新安排在指令譯碼階段,則不會有死區時間(指令譯碼階段,不產生cpu去內存的io)
eg:對於128128的存儲矩陣,把2ms平均到每行爲2/128=15.6\(\mu s\),即每隔15.6\(\mu s\)順着存儲矩陣的行編號,向下個編號刷新。
存儲容量的擴展
(1)位擴展
用2片1K4位存儲芯片組成1K8位存儲器
位擴展沒有增長房間號,只是房間裏面多住人了。即地址線不變,增長數據線,其餘沒變化
(2)字擴展(增長存儲字的數量)
用1K8位存儲芯片組成2K8位的存儲器:原來的1K字即10根地址線,變成如今的2K即11根地址線,多出來的1根地址線用來進行片選。
(3)字位擴展
用8片1K4位的存儲芯片組成4K8位的存儲器。即地址線先擴展4位成\(D_0到D_7\),而後地址線由原來的10根擴展成12根,新增的2根進行限片選,一次選擇2個芯片。此時的片選線變成片選譯碼器
存儲器與CPU的鏈接
(1)地址線的鏈接:先鏈接芯片固有的
(2)數據線的鏈接:先鏈接芯片固有的
(3)讀寫控制線的鏈接:每一個芯片都要鏈接,包括增長的
(4)片選線的鏈接:用增長的地址線進行片選線
(5)芯片選擇:選擇芯片數量組少的解決方案
eg:設CPU有16根地址線,8根數據線。現有如下幾種存儲芯片:1K4位RAM,4K8位RAM,8K8位RAM,
2K8位ROM,4K8位ROM,8K8位ROM,和74138譯碼器。請畫出CPU和存儲器的鏈接圖。要求:
主存地質分配以下:6000H~67FFH爲系統程序區。6800H~6BFFH爲用戶程序區。
(1) 寫出地址對應的二進制碼
所謂系統存儲區,指的是單片機中存儲系統程序的那部分芯片,一般被燒製在ROM裏,而用戶程序是單片機中跑的程序,運行在RAM中。如上圖所示,應該選擇1片2K8位ROM,和2片1K4位RAM。
(2)分配地址線:
\(A_{0}~A_{10}\)地址線鏈接ROM,
\(A_{0}~A_{9}\)地址線鏈接RAM
(3)肯定片選片信號
如上圖,只有1片ROM,並且2片RAM是位擴展,不會引發片選,因此只要區分RAM和ROM便可。如圖發現,\(A_{12},A_{11},A_{10}\)便可區分ROM和RAM.所以這3位地址線成爲片選線。
單體多字系統
(1)把原來的單字長寄存器改變爲多字長的寄存器,使得內存一次能夠讀出多個字。從而增長訪存速度
(2)這種設計實際上不存在,由於多字長在跳轉指令時會產生順序讀取的數據無效,下降效率
雙口RAM
(1)雙口RAM是含有兩套相互獨立的讀寫控制電路而得名。同時進行2次獨立的讀寫操做,因此會增長存儲器
(2)當兩套讀寫電路同時操做同一塊內存地址時,會產生寫衝突。所以,增長一個busy標誌(低電平)
多體並行 - 高位交叉,順序編址
(1)多體並行是編址方式的一種轉變。存儲矩陣有多個行,每一個行成爲一個體。
(2)高位交叉編址的意思是:用地址的高位表示是哪一個體。因此4體高位交叉編址就變成了高位分別爲00,01,10,11$,低位做爲體內地址。所以造成順序編址。
多體並行 - 低位交叉編址,各體輪流編址
(1)低位爲體號,高位爲體內地址。正好使得連續地址分佈在不一樣的體
(2)低位交叉編制,使得讀取連續地址的數據時,採用流水線方式:
流水線爲2步,分爲通知體傳輸和體傳輸時間。
通知體的時間爲cpu發出信號到體的時間,即總線傳輸時間。體傳輸時間爲體讀取數據的時間。
爲了使流水線能夠對齊,要求1個存取週期內,正好通知到全部體,因此存取週期爲體數的整數倍。
eg:設4體交叉存儲器,存取週期爲T,總線傳輸週期爲\(\tau\),則爲實現流水線存取方式,應知足\(T = 4\tau\)。由於每一個體的存取週期爲n\(\tau\),最後一個體用一個\(\tau\)的時間在T內,因此總的傳輸時間爲T+(n-1)\(\tau\)
高性能存儲芯片
(1)SDRAM(同步DRAM):系統時鐘控制下進行讀出和寫入,CPU無需等待
(2)RDRAM:由Rambus開發,解決存儲器帶寬問題
(3)帶cache的DRAM:在DRAM的芯片中集成了一個由SRAM組成的cache
cache工做原理
(1)主存單位稱爲塊,cache稱爲行,實質是一個東西
(2)CPU讀主存時,把地址同時送給cache和主存,cache經過地址查看此字是否在cache中,若在則當即傳送給cpu。
若不在,則用主存讀週期把此字從主存中讀出送到cpu,與此同時,把含有此字的整個數據塊從主存讀出送到cache的行中
cache與內存的映射關係(讀方式)
(1)全關聯:full associative cache
將內存也當作line的方式存儲,全關聯是指,內存的任意一個line能夠映射到cache中的任意一個line。
全相連映射的主存地址分爲2部分:主存塊號|字塊內地址;cache標記位爲主存地址除了字塊內地址的所有高位。
這就須要一個表,記錄主存塊號到cache行號的映射
這種方式,在查找內存是否在cache中時,要查找全部的tag。 並且查表的比較器很難實現
(2)直接映射:Direct Associated Cache
將內存按照cache大小劃分爲n個Page,內存中Page的line0對應cache的line0。所以直接映射下,cache標誌位標誌的是內存的page號。
另外一種理解方式:主存中的幾個特定行,映射到cache的一個特定行。多對一的關係。這種關係知足公式 i = j mod c
其中,i:cache行的行號。j:主存塊的塊號。c:cache的行數。標誌位=j/c向下取整
直接映射至關於多體高位交叉順序編址。體至關於整個cache,主存包含多個體。採用順序編址,使得主存地質分紅三部分: 體號(第幾個cache)|cache塊號|塊內地質。因此cache把主存中的最高几位(cache體號)做爲標記位
當剛好訪問的幾個主存地質,映射到了相同的cache行,就會產生抖動
(3)組相聯:Set Associated Cache
i. 組相聯映射把cache劃分爲過個way,每一個way的結構同樣。內存按照way的大小劃分Page,page間採用直接映射方式,page內採用全相聯映射方式 。
即:page號到組號的映射關係是多對一且固定的。
u爲cache的way個數,v爲way中的行數 。 v路組相聯:把幾行做爲一個way
這種方式,把主存地址分爲3部分:主存自塊標記|組內地址(不用有way號,由於是映射出來的)|字內地址。分別對應cache的標記位,way內的行號
ii. c64+DSP的配置中,L1P使用1個way,L1D使用2個way,L2不區分程序和數據,使用4個cache way
eg:假設主存的容量爲512K16位,cache容量爲409616位,塊長爲4個16位字,訪存地址爲字地址。
(1)直接映射下,設計主存地址格式:
解:直接映射是主存的每塊映射到cache的固定塊。因此,主存地址應包含cache塊號的標記。
由於按字編址,每一個字爲16位,因此主存地址容量爲\(2^{19}\),cache容量爲\(2^{12}\)。因此主存地址爲19位,cache地址爲12位。由於每塊4個字,因此快內地質佔2位。cache塊號佔10位,主存地址的剩餘7位爲標記位
tag爲(7)|cache塊號(10)|cache快內地址(2)
(2)全相連方式下,主存地址的設計
解:全相聯方式下,主存任意一塊能夠映射到cache任意一塊,因此主存地址脂粉味2部分,tag和快內地址。
快內地址佔2位,tag佔17位
(3)二路組相聯模式下,主存地址的設計
二路組相聯模式下,每個分組有2行,快內地址佔1位,因此有\(2^{12}/2/2=2^{9}\)個分組,因此組號佔9位。剩下tag位佔19-9-2=8位
一. 頁式虛擬存儲
概念
(1)程序員在比實際主存大得多的邏輯地址空間中編寫程序
(2)程序執行時,把當前須要的程序段和數據塊掉入主存,其餘暫不使用的放在磁盤上
(3)執行指令時,經過硬件將邏輯地址轉化爲物理地址。虛擬地址高位爲虛頁號,低位爲頁內偏移地址
(4)當程序發生數據訪問或程序訪問失效(缺頁時),由操做系統把信息從磁盤調入主存中
分頁
(1)基本思想:
內存被分紅固定長度且長度較小的存儲塊(頁框,實頁,物理頁)
每一個進程也被劃分爲固定長度的程序塊(頁,虛頁,邏輯頁)
經過頁表,實現邏輯地址想物理地址的轉化
(2)邏輯地址
程序中指令所使用的地址(進程所在地址空間)
(3)物理地址
存放指令或數據的實際內存地址
「主存-磁盤」層次
(1)與「cache-主存」層次相比,頁大小遠比cache的行大小要大(windows中的頁位4k)
(2)採用全相聯映射方式:磁盤中的任意一個頁能用射到內存中的任意一個頁
由於缺頁致使中斷時,操做系統從磁盤拿數據一般要耗費幾百萬個時鐘週期。增大頁大小,能夠減小缺頁中斷
(3)爲何讓軟件處理「缺頁」
由於訪問磁盤須要好粉幾百萬個時鐘週期,硬件即便能馬上把地址打給磁盤,磁盤也不能當即響應
(4)爲何地址轉換用硬件實現
硬件實現地址轉換能夠加快指令的執行速度
(5)爲何頁寫會策略採用write back
避免頻繁的慢速磁盤訪問
頁表結構
頁表的首地址放在基址寄存器。採用基址尋址方式
每一個頁表項前面有一個虛頁號:從0開始遞增的序號。頁表項又分爲幾個結構:
(1)裝入位:該頁是否在內存中
(2)修改位:該也在內存中是否被修改
(3)替換控制位:用於clock算法
(4)其餘
(5)實頁號(8進制)
TLB
(1)一次磁盤引用須要訪問幾回主存?2次,一次查頁表,一次查物理地址。因而,把常常查的頁表放到cache中。這種在cache頁表項組成的頁表稱爲TLB(Translation Lookside Buffer)
(2)TLB的頁表結構:tag + 主存中的頁表項
當採用全相連映射時,tag爲頁表項前面的虛頁號。須要把tag和虛頁號一一比較
當採用組相聯映射時,tag被分爲tag+index,虛頁號的高位爲tag,虛頁號的低位爲index,作組內索引(屬於組內第幾行)
二. 段式虛擬存儲
三. 段頁式虛擬存儲
eg:
(1)某計算機的cache塊工16塊,採用二路組相聯映射方式,每一個主存塊大小爲32字節,按照字節編制。則主存129號單元的主存塊硬裝如刀cache的組號是:(C)A、0 B、2 C、4 D、6
解:二路組相聯,因此每組2塊,共有16/2=8組,因此組號佔3位。
每塊32字節,因此塊內地址佔5位。
129轉化爲二進制:1000 0001:前3位爲組號,100:=4
(2)假設用若干個2K4位的芯片組成一個8K8位的存儲器,則地址0B1FH所在芯片的最小地址爲:
解:用2片組成一行,共4行,因此片選地址佔2位。片內地址有2k=\(2^{11}\),因此佔11位
0B1FH:000|0 1|011 0001 1111 這三段爲前綴,片選地址,片內地址。
該片芯片的最小地址是片內地址全0:000|0 1|000 0000 0000 = 0800H
(3)某計算機的主存地址空間大小爲256MB,按字節編址,指令cache和數據cache分離,均有8個cache行,每行大小爲64B,數據cache採用直接映射方式,現有兩個程序A,B對數組int a[256][256]進行遍歷,程序A按行遍歷,程序B按列遍歷。假定int類型數據用32位補碼錶示,數組a按行優先方式存儲,其地址爲320(十進制)。
問:(1) 若不考慮cache一致性維護和替換算法所需的控制位,則數據cache的總容量佔多少?
(2) 數組元素a[0][31]和a[1][1]各自所在主存塊對應的cache行號分別爲多少(cache從0行開始)?
(3)程序A和B的數據訪問命中率各自爲多少?哪一個程序的執行時間更短?
解:(1) 由於cache的總容量是cache每行的數據存儲大小+tag位+數據是否有效位+其餘一致性控制位。
主存地址空間256MB,佔28位。直接映射方式,8行,行號佔3位。每行64B,因此塊內地址佔6位,所以,tag佔28-3-6=19位
每行有一個數據有效位。所以,cache共(19+1+648)8 = 532字節
(2) 由於int類型佔32位,因此一個int佔4B。a[0][31] = 320 + 314 = 444 a1 = 320 + 4(256+1) = 1348。
塊內地址佔6位,直接映射下行號佔3位,所以444 = 110 | 111100,因此行號爲6
1348 = 10 | 101 | 000100,因此行號爲5
(3) 由於1行cache佔64B,每一個int數佔4B,因此一行有16個數。第一個數會因cache缺失而不命中,而後調入cache。,使得後面的15個int訪問所有命中。因此命中率爲\(\frac{15}{16}\) 對於程序B,每次調入16個數,小於數組每行的128個元素,所以每次都不會命中,命中率爲0