1 主存簡單模型
1.1 主存邏輯模型
-
地址寄存器:接收外部部件傳輸到主存中的具體地址
-
存儲體:存儲具體的二進制位
-
數據寄存器:暫存輸入/輸出的數據信號
-
時序控制邏輯單元:協調地址寄存器、存儲體和數據寄存器三者的相互配合
1.2 主存的物理模型
-
控制電路:控制譯碼器、地址寄存器、數據線等元器件之間的協調工作
- 片選線:整個控制電路芯片的開關,有兩種模式:高/低電頻有效
- 讀控制線:決定本次操作是否是讀取操作
- 寫控制線:決定本次操作是否是寫入操作
-
地址線:一般對應於存儲單元的個數,n 根地址線對應 \(2^n\) 個存儲單元
-
數據線:一般對應於數據線的根數,n 根數據線對應 n 位存儲字長
-
總容量 = 存儲單元個數 * 存儲字長(例:8K * 8 位:即 \(2^{13}*8bit\) ,13 根地址線,8 根數據線,則總容量為 8KB)
-
\(K:2^{10}\ \ \ \ \ M:2^{20}\ \ \ \ \ G:2^{30}\ \ \ \ \ T:2^{40}\)
2 尋址
假設主存的總容量為 1KB,則:
-
按字節尋址:每個單元 1B,共有 1K 個單元,那么地址線根數為 \(log_21024=10\) 根
-
按字尋址:每個單元 4B,共有 256 個單元,那么地址線根數為 \(log_2256=8\) 根
-
按半字尋址:每個單元 2B,共有 512 個單元,那么地址線根數為 \(log_2512=9\) 根
-
按雙字尋址:每個單元 8B,共有 128 個單元,那么地址線根數為 \(log_2128=7\) 根
-
多字節存放
-
大端模式:數據的最高有效字節存放在內存的低地址
-
小端模式:數據的最高有效字節存放在內存的高地址
-
3 存儲器
3.1 基本結構
- 存儲矩陣:由大量相同的位存儲單元陣列構成
- 譯碼驅動:將來自地址總線的地址信號翻譯成對應存儲單元的選通信號,該信號在讀寫電路的配合下完成對被選中單元的讀/寫操作
- 讀寫電路:包括讀出放大器和寫入電路,用來完成讀/寫操作
- 讀/寫控制線:決定芯片進行讀/寫操作
- 片選線:確定哪個存儲芯片被選中。可用於容量擴充
- 地址線:是單向輸入的,其位數與存儲字的個數有關
- 數據線:是雙向的,其位數與讀出或寫入的數據位數有關,數據線數和地址線數共同反映存儲芯片容量的大小
3.2 半導體隨機存取存儲器(RAM)
特點 / 類型 | SRAM(靜態) | DRAM(動態) |
---|---|---|
存儲信息 | 觸發器 | 電容 |
破壞性讀寫 | 非 | 是 |
需要刷新 | 不要 | 需要 |
送行列地址 | 同事送 | 分兩次送 |
運行速度 | 快 | 慢 |
集成度 | 低 | 高 |
發熱量 | 大 | 小 |
存儲成本 | 高 | 低 |
作用 | Cache | 主存 |
-
存儲信息(都只存儲 0、1 兩種信息)
- SRAM:有兩種穩定的狀態,觸發器可以穩定的保持某種狀態
- DRAM:電容存放時,需要不停的進行充放電
- 共同點:都屬於易失性存儲器,斷電就會丟失信息
-
破壞性讀出
- SRAM:讀時查看觸發器狀態;寫時改變觸發器狀態
- DRAM:讀時連接電容,檢測電流狀態;寫時要給電容充放電
-
是否要刷新
- SRAM:能穩定地保持兩種狀態,不需要刷新,只需改變觸發器狀態即可
- DRAM:電容上的電荷只能保持 2ms 左右,因此每隔 2ms 就要重復刷新依次
-
送行列地址
- SRAM:先分列,再分行,每行地址可能長度不一,需要將整個地址同時放到地址線上
- DRAM:先送進去行地址,再送進去列地址,然后根據行列地址來確定具體位置,需要分兩次來送,因此地址線可以實現服用,線數可以少一半
-
運行速度
- SRAM:穩定的狀態,不需要重復刷新和充放電,因此速度較快
- DRAM:需要不斷的充放電,重復刷新,因此速度較慢
-
集成度、發熱量、存儲成本
- SRAM:由 6 個邏輯元件構成,因此運行時發熱量大,制造成本也較高
- DRAM:由 1 或 3 個邏輯元件構成,因此運行時發熱量第,制造成本也較低
3.3 DRAM 的刷新
假設:DRAM 內部結構排列成 128 * 128 的形式,存取周期(讀寫周期)為 \(0.5 \mu s\) ,則 \(2ms\) 內共有 \(2ms/0.5\mu s=4000\) 個周期,則:
-
刷新周期:一般為 2ms
-
刷新數量:以行為單位,每次刷新一行存儲單元
-
為什么要用行列地址:可以減少選通線的數量
-
刷新方式:有硬件支持,讀出一行的信息后重新寫入,占用一個存取周期
-
刷新時間
-
分散刷新:每次讀寫結束都刷新一行,導致系統的讀寫周期增加
-
集中刷新:一個刷新周期中,集中安排時間進行刷新,此時無法訪問存儲器,稱為訪存“死區”
-
異步刷新:一個刷新周期中,值安排一次刷新,則每個刷新周期會有一段時間的“死時間”
-
3.4 SRAM 的讀寫周期
-
存取周期構成:存取時間 + 恢復時間
-
讀周期
-
寫周期
3.5 半導體只讀存儲器(ROM)
- 掩膜式只讀存儲器(MROM):存儲內容由半導體制造廠家按照用戶的要求直接在芯片生產過程中寫入,無法修改
- 一次可編程制度存儲器(PROM):存儲內容由用戶使用專門的設備(編程器)一次性寫入,無法修改
- 可擦除可編程只讀存儲器(EPROM):修改次數有限,寫入時間很長
- 紫外線擦除(UVEPROM)
- 電擦除(EEPROM)
- 閃速存儲器(Flash Memory):如 U 盤等,寫入速度較快
- 固態硬盤(Soild State Drives):控制單元 + FLASH 芯片
3.6 存儲器的分類
-
按照作用分類
- 主存儲器(主存、內存),使用 DRAM 和 ROM
- 高速緩沖存儲器(Cache),使用 SRAM
- 輔助存儲器(外存、輔存)
-
按照信息可保存性分類
- 斷電后信息是否消失
- 易失性:RAM
- 非易失性
- 讀出是否破壞信息
- 破壞性讀出:DRAM
- 非破壞性讀出
- 斷電后信息是否消失
-
按照存儲介質分類
- 磁芯存儲器
- 磁表面存儲器(磁盤、磁帶)
- 半導體存儲器
- 光存儲器(光盤)
-
按照存取方式分類
- 隨機存取
- DRAM、SRAM
- ROM
- 串行訪問
- 順序存儲:磁帶
- 直接存取:磁盤
- 隨機存取
3.7 存儲器的性能指標
- 存儲容量:存儲字數 * 字長(如 1M×8位)
- 單位成本:每位價格 = 總成本 / 總容量
- 存儲速度:數據傳輸率 = 數據的寬度 / 存儲周期
- 存取時間(\(T_a\)):存取時間是指從啟動一次存儲器操作到完成該操作所經歷的時間,分為讀出時間和寫入時間
- 存取周期(\(T_m\)):存取周期又稱為讀寫周期或訪問周期。它是指存儲器進行次完整的讀寫操作所需的全部時間,即連續兩次獨立地訪問存儲器操作(讀或寫操作)之間所需的最小時間間隔
- 主存帶寬(\(B_m\)):主存帶寬又稱數據傳輸率,表示每秒從主存進出信息的最大數量,單位為字/秒、字節/秒(\(B/s\))或位/秒(\(b/s\))
3.8 存儲器的層次化結構
4 主存與 CPU 的連接
4.1 主存容量擴展
-
位擴展:將新的存儲器芯片,地址線、數據線、讀寫控制線並行的與 CPU 的地址線、數據線、讀寫控制線分別相連
-
字擴展
-
線選法
- 原理:將新的存儲器芯片,地址線、數據線、讀寫控制線並行的與 CPU 的地址線、數據線、讀寫控制線分別相連,然后再從 CPU 的空閑地址線中分別連出 n 條地址線到 n 個存儲器芯片中,來分別控制擴展的存儲器芯片
- n 條地址線,只能對應 n 個選片信號
-
譯碼片選法
- 原理:將新的存儲器芯片,地址線、數據線、讀寫控制線並行的與 CPU 的地址線、數據線、讀寫控制線分別相連,然后從 CPU 的空閑地址線中連出一條地址線到兩個存儲器芯片中,其中一條加上一個非門邏輯電路
- n 條地址線,可以對應 \(2^n\) 個選片信號
-
使用譯碼器實現字擴展
-
原理:當輸入端輸入的二進制數對應的時信號輸出端的下標為 \(i\) 的芯片時,芯片 \(i\) 才會工作,其他狀態下均不工作
-
高電平有效:對應的下標為 1 時,才會工作
-
低電平有效:對應的下標為 0 時,才會工作
-
連接方法:CPU 低位的地址線直接連接到各個芯片,數據線、讀寫控制線也依次和 CPU 的數據線、讀寫控制線相連接,然后使用 CPU 空閑的 n 根地址線與譯碼器的輸入端連接,就可以同時控制 \(2^n\) 中芯片信號
-
-
線選法 | 譯碼片選法 |
---|---|
n 條線對應 n 個選片信號 | n 條線對應 \(2^n\) 個選片信號 |
電路簡單 | 電路復雜 |
地址空間不連續 | 地址空間可連續,可以增加邏輯設計 |
-
字位同時擴展
-
原理:將多個芯片作為一個小組,將多個小組的數據線分別依次連接到 CPU 的數據線上,先完成位的擴展;然后使用譯碼器連接 CPU 空閑地址線,實現不同芯片的選片,實現字的擴展
-
4.2 主存擴展例題
【例】設 \(CPU\) 有 16 根地址線,8 根數據線,並用 \(\overline {MREQ}\) 作為訪存控制信號(低電平有效),用 \(\overline {WR}\) 作為讀 / 寫控制信號(高電平為讀,低電平為寫)。現有下列存儲芯片:\(1K×4\ 位\ RAM\), \(K×8\ 位\ RAM\),\(8K×8\ 位\ RAM\),\(2K×8\ 位\ ROM\) ,\(4K×8\ 位\ ROM\),\(K×8\ 位\ ROM\) 及 \(74LS138\) 譯碼器和各種門電路。畫出 \(CPU\) 與存儲器的連接圖,要求:
1)主存地址分配:\(6000H - 67FFH\) 為系統程序區,\(6800H-6BFFH\) 為用戶程序區
2)合理選用上述存儲芯片,說明各選幾片?
3)詳細畫出存儲芯片的片選邏輯圖
-
確認地址線、數據線、選擇存儲芯片(系統程序區用 ROM,用戶程序區用 RAM)
-
設計圖
5 雙端口 RAM
兩個端口對同一主存操作有以下 4 種情況
- 兩個端口不同時對同一地址單元存取數據
- 兩個端口同時對同一地址單元讀出數據
- 兩個端口同時對同一地址單元寫入數據(會發生寫入錯誤)
- 兩個端口同時對同一地址單元,一個寫入數據,另一個讀出數據(會發生讀出錯誤)
針對以上可能出錯的地方,可以用加“忙”線來解決
- 置“忙”信號為 0,由判斷邏輯決定暫時關閉一個端口(即被延時),未被關閉的端口正常訪問,被關閉的端口延長一個很短的時間段后再訪問
6 多模塊存儲器
-
單體多字存儲器
-
每個存儲單元存儲 m 個字,總線寬度也為 m 個字,一次並行讀出 m 個字
-
缺點:指令和數據在主存內必須是連續存放的
-
-
多體並行存儲器
-
每個模塊都有相同的容量和存取速度,各模塊都有獨立的讀寫控制電路、地址寄存器和數據寄存器
-
它們既能並行工作,又能交又工作
-
-
高位交叉編址 VS 低位交叉編址
-
內存訪問一般都是連續的內存,因此可以看出,低位交叉編址耗時較短,類似於“流水線”過程
-
7 高速緩沖存儲器
7.1 局部性原理
- 空間局部性:在最近的未來要用到的信息(指令和數據),很可能與現在正在使用的信息在存儲空間上是鄰近的
- 時間局部性:在最近的未來要用到的信息,很可能是現在正在使用的信息
工作原理:
7.2 性能分析
- 命中率(H): \(CPU\) 欲訪問的信息已在 \(Cache\) 中的比率
- 設一個程序執行期間, \(Cache\) 的總命中次數為 \(N_c\) ,訪問主存的次數為 \(N_m\) ,則命中率為:\(H=\frac{N_c}{N_c+N_m}\)
- 缺失率(M):\(CPU\) 欲訪問的信息不在 \(Cache\) 中的比率,\(M=1-H\)
- 設 \(t_c\) 為命中時的 \(Cache\) 訪問時間,\(t_m\) 為未命中時的訪問時間,則主系統的平均訪問時間 \(T_a=Ht_c+(1-H)t_m\)
【例】假設 \(Cache\) 的速度是主存的 5 倍,且 \(Cache\) 的命中率為 \(95%\) ,則采用 \(Cache\) 后存儲器性能提高多少(設 \(Cache\) 命中則中斷訪問主存)?
-
若 \(Cache\) 和主存同時被訪問
-
若先訪問 \(Cache\) 再訪問主存
7.3 Cache 地址映射
-
全相聯映射:主存字塊標記 + 字塊內地址
-
直接映射:主存字塊標記 + Cache 字塊地址 + 字塊內地止
-
組相連映射:按號分組,組內隨意放,主存字塊標記 + 組地址 + 字塊內地址
-
三種映射方式邏輯圖
7.4 Cache 替換算法
- 隨機算法(\(RAND\) ):隨機地確定替換的 \(Cache\) 塊。它的實現比較簡單,但沒有依據程序訪問的局部性原理,故可能命中率較低
- 先進先出算法(\(FIFO\)):選擇最早調入的行進行替換。它比較容易實現,但也沒有依據程序訪問的局部性原理,可能會把一些需要經常使用的程序塊(如循環程序)也作為最早進入\(Cache\) 的塊替換掉
- 近期最少使用算法(\(LRU\)):依據程序訪問的局部性原理選擇近期內長久未訪問過的存儲行作為替換的行,平均命中率要比 \(FIFO\) 要高,是堆棧類算法
- \(LRU\) 算法對每行設置一個計數器, \(Cache\) 每命中一次,命中行計數器清零,而其他各行計數器均加 1,需要替換時比較各特定行的計數值,將計數值最大的行換出
- 最不經常使用算法(\(LFU\)):將一段時間內被訪問次數最少的存儲行換出。每行也設置一個計數器,新行建立后從 0 開始計數,每訪問一次,被訪問的行計數器加 1,需要替換時比較各特定行的計數值,將計數值最小的行換出
7.7 寫策略
-
命中時的寫策略
- 寫回法 :當 \(CPU\) 對 \(Cache\) 寫命中時,只修改 \(Cache\) 的內容,而不立即寫入主存,只有當此塊被換出時才寫回主存
- 全寫法(直寫法):當 \(CPU\) 對 \(Cache\) 寫命中時,必須把數據同時寫入 \(Cache\) 和主存,一般使用寫緩沖
-
未命中時的寫策略
- 寫分配法:把主存中的塊調入 Cache ,在 Cache 中修改,搭配寫回法使用
- 非寫分配法:值寫入主存,不調入 Cache,搭配全寫法使用
-
小結
-
寫回法 + 寫分配法:可以減少訪存次數,需要使用一個臟位來控制一致性的實現
-
全寫法 + 非寫分配法:有一個寫緩沖,很好地保持了一致性,但是可能會溢出
-
多級 Cache
-
7.8 替換算法例題
【例】設主存地址的空間大小為 1KB,按字節編址,Cache 由 8 個塊組成,每個 Cache 塊的大小為 16B,CPU 依次訪問以下地址:0001001110、1001110010、0001001111、0011000010、0101001000、1011110010、1111010000、0011001001(十進制分別為 78、626、79、194、328、754、976、201),求:
-
假設地址映射方式為全相連映射,采用 FIFO、LRU、LFU 替換算法時,分別求 Cache 的命中次數
-
假設地址映射方式為直接映射,求 Cache 的命中次數
-
假設地址映射方式為二路組相連映射,采用 FIFO、LRU、LFU 替換算法時,分別求 Cache 的命中次數
-
假設配置同上,采用寫回法和直寫法時,Cache 的總容量分別為多少
8 虛擬存儲器
8.1 定義
- 定義:虛擬存儲器是一個邏輯模型
- 功能:用戶給出一個地址,叫做虛地址或者邏輯地址,虛擬存儲器要給改地址相對應的數據
- 實現:由輔助硬件將虛地址映射到主存當中的某個單元中,主存單元地址稱為實地址或者物理地址
8.2 分類
-
頁式虛擬存儲器
- 虛擬空間與主存空間都被划分為同樣大小的頁,主存的頁稱為實頁,虛存的頁稱為虛頁
-
段式虛擬存儲器
-
中的段是按程序的邏輯結構划分的,各個段的長度因程序而異
-
虛擬地址分為兩部分:段號和段內地址
-
段表:每一行記錄了與某個段對應的段號、裝入位、段起點和段長等信息
-
由於段的長度可變,所以段表中要給出各段的起始地址與段的長度
-
-
段頁式虛擬存儲器
- 把程序按邏輯結構分段,每段再划分為固定大小的頁,主存空間也划分為大小相等的頁,
程序對主存的調入、調出仍以頁為基本傳送單位每個程序對應一個段表,每段對應一個頁表 - 虛擬地址:段號 + 段內頁號 + 頁內地址
- 把程序按邏輯結構分段,每段再划分為固定大小的頁,主存空間也划分為大小相等的頁,
8.3 快表 TLB
-
頁表、段表存放在主存中,收到虛擬地址后要先訪問主存,査詢頁表、段表,進行虛實地址轉換
-
放在主存中的頁表稱為慢表(\(Page\) )
-
提高變換速度 \(\rightarrow\) 用高速緩沖存儲器存放常用的頁表項快表(\(TLB\) )
-
訪問過程
9 總結
-
思維導圖總結