概念
存儲器的層次化結構
概念結構
Cache-主存層次:硬件實現,解決速度不匹配問題。
主存-輔存層次:硬件+操作系統實現,解決容量問題,逐漸形成虛擬存儲系統。
存儲器分類
作用(層次)
- 主存儲器(主存、內存):使用DRAM和ROM
- 高速緩沖存儲器(Cache):使用SRAM
- 輔助存儲器(輔存、外存)
存儲介質
- 磁芯存儲器
- 磁表面存儲器:磁盤、磁帶
- 半導體存儲器
- 光存儲器
存取方式
-
隨機存取:RAM(DRAM、SRAM),ROM
任何一個存儲所需時間都相同,與存儲單元所在的物理位置無關
-
串行訪問:順序存取(磁帶)、直接存取(磁盤)
讀寫某個存儲單元所需時間與存儲單元的物理位置有關
-
按內容訪問:相聯存儲器(CAM)
可以按照內容檢索到存儲位置進行讀寫,"快表"就是一種相聯存儲器
信息可保存性
- 斷電后存儲信息是否消失:易失性(RAM)、非易失性(磁盤,光盤)
- 讀出是否破壞信息:破壞性讀出(DRAM)、非破壞性讀出(SRAM,磁盤,光盤)
性能指標
-
存儲容量:存儲字數\(\times\)字長(如1M$\times$8位)
-
單位成本:每位價格=總成本/總容量
-
存儲速度:數據傳輸率=數據的寬度(存儲字長)/存儲周期
- 存取時間(\(T_a\)):存取時間是指從啟動一次存儲器操作到完成該操作所經歷的時間,分為讀出時間和寫入時間。
- 存取周期(\(T_m\)):存取周期又稱為讀寫周期或訪問周期。它是指存儲器進行一次完整的讀寫操作所需的全部時間,即連續兩次獨立地訪問存儲器操作(讀或寫操作)之間所需的最小時間間隔。
- 主存帶寬(\(B_m\)):主存帶寬又稱數據傳輸率,表示每秒從主存進出信息的最大數量,單位為字/秒,字節/秒(B/s)或位/秒(b/s)。
存儲器芯片的基本結構
片選線:高電平有效,當輸入信號為高電平時,整個芯片工作,反之則不工作。(高電平有效)
讀/寫控制線:控制存儲器當前操作是讀還是寫。
地址線、數據線:共同決定存儲器的容量。
- 地址線:用來接收外部單元傳輸到存儲器的地址信號,決定的是要進行操作的存儲單元在存儲矩陣的位置。
- 數據線:用來傳輸到外部單元的要進行讀/寫的數據。
容量:
n位地址-> \(2^n\)個存儲單元
\(總容量=存儲單元個數 \times 存儲字長=2^3 \times 8bit=2^3 \times 1Byte=8B\)
\(8 \times 8\) 位的存儲芯片:
常用的描述:
- \(8K \times 8\)位,即\(2^{13} \times 8 bit\) ,8KB
- \(8K \times 1\)位,即\(2^{13} \times 1 bit\) ,8Kb=1KB
- \(64K \times 16\)位,即\(2^{16} \times 16 bit\)
尋址
設存儲矩陣為4列,總容量為1Kb,即有字長為4B,
按字節尋址:1K個單元,每個單元1B
按字尋址:256個單元,每個單元4B
按半字尋址:512個單元,每個單元2B
按雙字尋址:128個單元,每個單元8B
多字節存放:有大端方式與小端方式
半導體存儲器
基本結構
-
存儲矩陣:由大量相同的為存儲單元陣列構成。
-
譯碼驅動:將來自地址總線的地址信號翻譯成對應存儲單元的選通信號,該信號在讀寫電路的配合下完成對被選中單元的讀/寫操作。
-
讀寫電路:包括讀出放大器和寫入電路,用來完成讀/寫操作。
-
讀/寫控制線:決定芯片進行讀/寫操作。
-
片選線:確定哪個存儲芯片被選中。可用於容量擴充。
-
地址線:是單向輸入的,其位數與存儲字的個數有關。
-
數據線:是雙向的,其位數與讀出或寫入的數據位數有關。
-
數據線數和地址線數共同反映存儲芯片容量的大小。
如地址線10根,數據線8根,則芯片容量=\(2^{10} \times 8=8K\)位。
半導體隨機存取存儲器
SRAM(Static Random Access Memort):靜態隨機存儲器
DRAM(Dynamic Random Access Memort):動態隨機存儲器
都以電信號的形式存儲0/1->斷電就丟失信息:易失性存儲器
特點類型 | SRAM | DRAM |
存儲信息 | 雙穩態觸發器 | 柵極電容 |
破壞性讀出 | 非 | 是 |
需要刷新 | 不要 | 需要 |
送行列地址 | 同時送 | 分兩次送 |
運行速度 | 快 | 慢 |
集成度 | 低 | 高 |
發熱量 | 大 | 小 |
存儲成本 | 高 | 低 |
需要"刷新" | 不需要 | 需要 |
送行列地址 | 同時送 | 分兩次送 |
常用作 | Cache | 主存 |
現在主存使用SDRAM:同步動態隨機存儲器
DRAM的刷新
刷新周期:一般為2ms
以行為單位,每次刷新一行存儲單元
用行列地址以減少選通線的數量
刷新:由硬件支持,讀出一行的信息后重新寫入,占用一個讀/寫周期
刷新思路:
-
分散刷新:每次讀寫完都刷新一行
-
集中刷新:2ms內集中安排時間全部刷新
有一段時間專門用於刷新,無法訪問存儲器,稱為訪存"死區"。
-
異步刷新:2ms內每行刷新一次即可
每隔一段時間有一段很短的"死時間"。
DRAM的地址線復用技術
ROM:Read-Only Memory
特點:結構簡單,位密度比RAM高;非易失性,可考性高
- 掩膜式只讀存儲器(MROM):存儲內容由半導體制造廠按用戶提出的要求在芯片的生產過程中直接寫入,無法修改。
- 一次可編程只讀存儲器(PROM):存儲內容由用戶用專門的設備(編程器)一次性寫入,之后無法修改。
- 可擦除可編程只讀存儲器(EPROM):修改次數有限,寫入時間很長。可進行多次重寫
- 紫外線擦除(UVEPROM):擦除所有信息
- 電擦除(EEPROM):擦除特定的字
- 閃速存儲器(Flash Memory):如U盤,寫入速度較快。可進行多次快速擦除重寫,“寫”的速度要比‘讀”速度更慢
- 固態硬盤(Solid State Drives):控制單元+FLASH芯片。可進行多次快速擦除重寫
計算機內的重要ROM
主存與CPU的連接
單塊存儲芯片與CPU連接
現在的計算機:
主存容量擴展
位擴展
8片\(8k\times 1\)位的存儲芯片->1片\(8k\times 8\)位的存儲芯片,容量8KB
字擴展
線選法 | 譯碼片選法 |
---|---|
n條線->n個選片信號 | n條線->\(2^n\)個選片信號 |
電路簡單 | 電路復雜 |
地址空間不連續 | 地址控制可連續,可以增加邏輯設計 |
線選法:
加個非門:
譯碼片選法:
字位同時擴展
連接
系統程序區用ROM,用戶程序區用RAM。
雙口RAM多模塊存儲器
存取周期
雙端口RAM
兩個端口對同一主存操作有以下4鍾情況:
- 兩個端口不同時對同一地址單元存取數據。
- 兩個端口同時對同一地址單元讀出數據。
- 兩個端口同時對同一地址單元寫入數據。
- 兩個端口同時對同一地址單元,一個寫入數據,另一個讀出數據。
可以看出第一、二種是不會發生錯誤的,而第三種會發生寫入錯誤以及第四種會發生讀出錯誤。
解決方法:置"忙"信號為0,有判斷邏輯決定暫時關閉一個端口(即被延時),未被關閉的端口正常范圍,被關閉的端口延長一個很短的時間段后再訪問。
多模塊存儲器
普通存儲器:每行為1個存儲單元
單體多字存儲器
每個存儲單元存儲m個字;總線寬度也為m個字;一次並行讀出m個字。
指令和數據在主存內中必須是連續存放的。
多體並行存儲
每個模塊都有相同的容量和存取速度。
各模塊都有獨立的讀寫控制電路、地址寄存器和數據寄存器。
它們既能並行工作,又能交叉工作。
高位交叉編址多體存儲器:
連續取n個存儲字->耗時nT
低位交叉編址多體存儲器:
連續取n個存儲字->耗時\(T+(n-1) \tau\)
流水線
微觀(計算題)
模塊數m=4,存儲周期為T,字長W,數據總線寬度為m,總線傳輸周期為r,連續存取n個字,求交叉存儲器的帶寬。
連續存器n個字耗時=\(T+(n-1)r\ \ m \ge T/r\)
帶寬=\(n \times W/(T+(n-1)r)\)
n較大時,寬度->\(W/r\) 相當於m個存儲體並行工作
對比單個存儲體的帶寬:\(W/T\)
宏觀(概念題)
一個存儲周期內,交叉存儲器可以提供的數據量為單個模塊的m倍。
存儲周期T,存取時間(/總線傳輸周期)為r,為了使流水線不間斷,應保證模塊數\(m\ge T/r\)
Cache(高速緩沖存儲器)
局部性原理
空間局部性:在最近的未來要用到的信息(指令和數據),很可能與現在正在使用的信息在存儲空間上是鄰近的。
時間局部性:在最近的未來要用到的信息,很可能是現在正在使用的信息。
性能分析
命中率H:CPU欲訪問的信息已在Cache中的比率。
設一個程序執行期間,Cache的總命中次數為\(N_c\),訪問主存的總次數為\(N_m\),則\(H=N_c/(N_c+N_m)\)。
缺失率M:\(M=1-H\)
設\(t_c\)為命中時的Cache訪問時間,\(t_m\)為未命中時的訪問時間
Cache-主存系統的平均訪問時間\(T_a\)為\(T_a=Ht_c+(1-H)t_m\)
\(系統的效率=Cache訪問時間/平均訪問時間\)
題目:訪問策略不同
地址映射方式
主存與Cache之間以“塊”為單位進行數據交換
每次被訪問的主存塊,一定會被立即調入Cache
Cache中存儲的內容:標記項+數據
標記項:主存子塊標記、有效位...
Cache與主存地址映射方式有:
-
空位隨意放:全相聯映射
主存子塊標記 子塊內地址 -
對號入座:直接映射
主存子塊標記 Cache子塊地址 子塊內地址 -
按號分組,組內隨意放:組相聯映射
主存子塊標記 組地址 子塊內地址
替換算法與寫策略
相聯存儲器:並行比較標記,若有標記與當前將要訪問的地址的標記相同,且有效位為1,則命中。
注:相聯存儲是是一種不根據地址而是根據存儲內容來進行存取的存儲器。
替換算法
-
隨機算法(RAND):隨機地確認替換的Cache塊。它的實現比較簡單,但沒有依據程序訪問的局部性原理,故可能命中率較低。
-
先進先出算法(FIFO):選擇最早調入的行進行替換。它比較容易實現,但也沒有依據程序訪問的局部性原理,可能會把一些需要經常使用的程序塊(如循環系統)也作為最早進入Cache的塊替換掉。
-
近期最少使用算法(LRU):依據程序訪問的局部性原理選擇近期內長久未訪問過的存儲行作為替換的行,平均命中率要比FIFO要高,是堆棧類算法。LRU算法對每行設置一個計數器,Cache每命中一個,命中行計數器請0,而其他各行計數器均加1,需要替換時比較各特定行的計數值,將計數值最大的行換出。
若被頻繁訪問的主存塊數量>Cache行的數量,則有可能發生“抖動”
計算機實現:
-
最不經常使用算法(LFU):將一段時間內被訪問次數最少的存儲行換出。每行也設置一個計數器,新行建立后從0開始計數,每訪問一次,被訪問的行計數器加1,需要替換時比較各特定行的計數值,將計數值最小的行換出。
寫策略
命中:
-
寫回法(write-back):當CPU對Cache寫命中時,只修改Cache的內容,而不立即寫入主存,只有當此塊被換出時才寫回主存。
減少了訪存次數,存在數據不一致的隱患
-
全寫法(寫直通法,write-through):當CPU對Cache寫命中時,必須把數據同時寫入Cache和主存,一般使用寫緩沖(write buffer)。
訪存次數增加,速度變慢,但更能保證數據一致性。
未命中:
- 寫分配法(write-allocate):把主存中的塊調入Cache,在Cache中修改。搭配寫回法使用。
- 非寫分配法(not-write-allocate):只寫入主存,不調入Cache。搭配全寫法使用
多級Cache
虛擬存儲器
虛擬存儲器是一個邏輯模型。
功能:用戶給出一個地址,叫做虛地址或邏輯地址,虛擬存儲器要給出該地址對應的數據。
實現:有輔助硬件將虛地址映射到主存當中的某個單元,主存單元地址稱為實地址或物理地址。
[注]:邏輯地址(虛地址):程序員視角看到的地址;物理地址(實地址):實際在主存的地址
頁式虛擬存儲器
虛擬地址與主存地址都被划分成同樣大小的頁,主存的頁稱為實頁,虛存的頁稱為虛頁。
虛存地址:
虛頁號 | 頁內地址 |
---|
主存地址:
實頁號 | 頁內地址 |
---|
頁內地址可以直接貼過去,而需要對虛頁號轉換為實頁號。
頁表:
..... | 1 |
---|
1稱為裝入位,表示所指向的地址是放在主存當中。否則是放在輔存當中。
硬件有一個頁表基址寄存器,它會提供一個頁表起始地址;頁表起始地址和虛頁號共同組成一個頁表項地址。
頁表起始地址 | 頁內地址 |
---|
對應可得到虛頁號對應的實頁號。實頁號+頁內地址便可得到主存地址。
段式虛擬存儲器
段式虛擬存儲器中的段是按程序的邏輯結構划分的,各個段的長度因程序而異。
虛擬地址分為兩個部分:段號和段內地址。
段表:每一行記錄了與某個段對應的段號、裝入位、段起點和段長度等信息。由段的長度可變,所以段表中要給出各段的起始地址與段的長度。
段頁式虛擬存儲器
把程序按邏輯結構分段,每端再划分位固定大小的頁,主存空間頁划分為大小相等的頁,程序對主存的調入、調出仍以頁為基本傳送單位。每個程序對應一個段表,每段對應一個頁表。
虛擬地址:段號+段內頁號+頁內地址
快表TLB
頁表、段表存放在主存中,收到虛擬地址后要先訪問主存,查詢頁表、段表,進行虛實地址轉換。放在主存中的頁表稱為慢表(Page)。
提高變換速度->用高速緩沖存儲器存放常用的頁表項->快表(TLb)
快表是一種“相聯存儲器”,可以按內容尋訪
訪問過程: