存儲器的層次和結構
從不同角度對存儲器進行分類:
1.按在計算機中的作用(層次)分類
(1)主存儲器。簡稱主存,又稱內存儲器(內存),用來存放計算機運行期間所需的大量程序和數據,CPU 可以直接隨機地對其進行訪問,也可以和告訴緩沖存儲器(Cache)及輔助存儲器交換數據,其特點是容量較小、存取速度較快、單位價格較高。
(2)輔助存儲器。簡稱輔存,又稱外存儲器(外存),是主存儲器的后援存儲器,用來存放當前暫時不用的程序和數據,以及一些需要永久性保存的信息,它不能與 CPU 直接交換信息。其特點是容量極大、存取速度較慢、單位成本低。
(3)高速緩沖存儲器。簡稱 Cache,位於主存和 CPU 之間,用來存放正在執行的程序段和數據,以便 CPU 能高速地使用它們。Cache 地存取速度可與 CPU 的速度匹配,但存儲容量小、價格高。目前的高檔計算機通常將它們制作在 CPU 中。
2.按存儲介質分類
按存儲介質,存儲器可分為磁表面存儲器(磁盤、磁帶)、磁芯存儲器、半導體存儲器(MOS型存儲器、雙極型存儲器)和光存儲器(光盤)。
3.按存取方式分類
(1)隨機存儲器(RAM)。存儲器的任何一個存儲單元的內容都可以隨機存取,而且存取時間與存儲單元的物理位置無關。其優點是讀寫方便、使用靈活,主要用作主存或高速緩沖存儲器。RAM 又分為靜態 RAM (以觸發器原理寄存信息,SRAM)和動態 RAM(以電容充電原理寄存信息,DRAM)。
(2)只讀存儲器(ROM)。存儲器的內容只能隨機讀出而不能寫入。信息一旦寫入存儲器就固定不變,即使斷電,內容也不會丟失。因此,通常用它存放固定不變的程序、常數和漢字字庫,甚至用於操作系統的固化。它與隨機存儲器可共同作為主存的一部分,統一構成主存的地址域。
由 ROM 派生出的存儲器也包含可反復重寫的類型,ROM 與 RAM 的存取方式均為隨機存取。廣義上的只讀存儲器已可已可通過電擦除等方式進行寫入,其“只讀”的概念沒有保留,但仍然保留了斷電內容保留、隨機讀取特性,但其寫入速度比讀取速度慢得多。
(3)串行訪問存儲器。對存儲單元進行 讀/寫 操作時,需按其物理地址的先后順序尋址,包括順序存取存儲器(如磁帶,SAM)與直接存取存儲器(如磁盤,DAM)。
順序存取存儲器的內容只能按照某種順序存取,存取時間的長短與信息在存儲體上的物理位置有關,其特點是存取速度緩慢。直接存取存儲器既不像 RAM 那樣隨機地訪問任何一個存儲單元,又不像順序存取存儲器那樣完全按照順序存取,而是介於兩者之間。存取信息時通常先尋找整個存儲器中的某個小區域(如磁盤上的磁道),再在小區域內順序查找。
4.按信息的可保存性分類
斷電后,存儲信息消失的存儲器稱為易失性存儲器,如 RAM。斷電后,信息仍然保持的信息存儲器稱為非易失性存儲器,如 ROM、磁表面存儲器和光存儲器。若某個存儲單元所存儲的信息被讀出時,原存儲信息被破壞,則稱為破壞性讀出;若讀出時,被讀單元存儲信息不被破壞,則稱為非破壞性讀出,具有破壞性讀出的存儲器,每次讀出操作后,必須緊接一個再生的操作,以便恢復被破壞的信息。。
存儲器有 3 個主要性能指標,即存儲容量、單位成本和存儲速度。這 3 個指標相互制約,設計存儲器系統所追求的目標就是大容量、低成本和高速度。
(1)存儲容量 = 存儲字數 * 字長(如 1M * 8 位)。存儲字數表示存儲器地址空間的大小,字長表示一次存取操作的數據量。
(2)單位成本:每位價格 = 總成本 / 總容量。
(3)存儲速度:數據傳輸率 = 數據的寬度 / 存儲周期。
-
- 存取時間(Ta) :存取時間是指從啟動一次存儲器操作到完成該操作所經歷的時間,分為讀出時間和寫入時間。
- 存取周期(Tm):存取周期又稱讀寫周期或訪問周期。它是指存儲器進行一次完整的讀寫操作所需的全部時間,即連續兩次獨立訪問存儲器操作(讀或寫操作)之間所需的最小時間間隔。
- 主存帶寬(Bm):主存帶寬又稱數據傳輸率,表示每秒從主存進出信息的最大數量,單位為 字/秒、字節/秒(B/s) 或 位/秒(b/s)。
存取時間不等於存儲周期,通常存儲周期大於存儲時間。這是因為對任何一種存儲器,在讀寫操作之后,總要有一段時間恢復內部狀態的復原時間。對於破壞性讀出的存儲器,存取周期往往比存取時間大得多,因為存儲器中的信息讀出后需要馬上進行再生。

操作系統保存在硬盤上,首先需要將其引導到主存中,而引導程序通常存放在 ROM 中,程序運行時需要進行讀寫操作,因此應采用 RAM。
存儲器的層次化結構
為了解決存儲系統大容量、高速度和低成本 3 個相互制約的矛盾,在計算機系統中,通常采用多級存儲器結構,如下圖所示。在圖中由上至下,價位越來越低,速度越來越慢,容量越來越大,CPU 訪問的頻度也越來越低。

實際上,存儲系統層次結構主要體現在 “Cache - 主存” 層次和 “主存 - 輔存” 層次。前者主要解決 CPU 和主存速度不匹配的問題,后者主要解決存儲系統容量的問題。在存儲體系中,Cache、主存能與 CPU 直接交換信息,輔存則要通過主存與 CPU 交換信息;主存與 CPU、Cache、輔存都能交換信息。

三級存儲系統的層次結構及其構成
主存和 Cache 之間的數據調動是由硬件自動完成的,對所有程序員均是透明的;而主存和輔存之間的數據調動則是由硬件和操作系統共同完成的,對應用程序員是透明的。
在 “主存 - Cache” 和 “主存 - 輔存” 層次中,上一層的內容都只是下一層中內容的副本,也即 Cache(主存)中的內容只是主存(輔存)中內容的一部分。
半導體隨機存儲器

74138 譯碼器當選通端G1為高電平,另兩個為低電平時,才可將地址端的二進制編碼在一個對應的輸出端以低電平譯出。
SRAM 的工作原理
靜態隨機存儲器(SRAM)的存儲元是用雙穩態觸發器(六管 MOS)來記憶信息的,因此即使信息被讀出后,它仍保持其原狀態而不需要再生(非破壞性讀出)。但是,只要電源被切斷,原來的保存信息便會丟失,故它屬於易失性半導體存儲器。SRAM 的存取速度快,但集成度低,功耗較大,所以一般用來組成告訴緩沖存儲器。
DRAM 的工作原理
動態隨機存儲器(DRAM)是利用存儲元電路中的柵極電容上的電荷來存儲信息的,常見的 DRAM 的基本存儲電路通常分為三管式和單管式。DRAM 采用地址復用技術,地址線是原來的 1/2,且地址信號分行、列兩次傳送。相對於 SRAM 來說,DRAM 具有容易集成、價位低、容量大和功耗低等優點,但 DRAM 的存取速度比 SRAM 慢,一般用來組成大容量主存系統。
DRAM 保存的信息會自動消失(易失性存儲器),為此,每隔一段時間必須刷新,通常取 2ms,這個時間稱為刷新周期。常用的刷新方式有 3 種:集中刷新、分散刷新和異步刷新。
(1)集中刷新:指在一個刷新周期內,利用一段固定的時間,依次對存儲器的所有行進行逐一再生,在此期間停止對存儲器的讀寫操作,稱為“死時間”,又稱訪存“死區”。集中刷新的優點是讀寫操作時不受刷新工作的影響,因此系統的存取速度較高;缺點是在集中刷新期間(死區)不能訪問存儲器。
(2)分散刷新:把對每行的刷新分散到各個工作周期中。這樣,一個存儲器的系統工作周期分為兩部分:前半部分用於正常讀、寫或保持;后半部分用於刷新某一行。這種刷新方式增加了系統的存取周期,如存儲芯片的存取周期為 0.5μs,則系統的存取周期為 1μs。分散刷新的優點是沒有死區;缺點是加長了系統的存取周期,降低了整機的速度。
(3)異步刷新:異步刷新是前兩種方法的結合,它既可以縮短“死時間”,又能充分利用最大刷新間隔為 2ms 的特點。具體做法是將刷新周期除以行數,得到兩次刷新操作的時間間隔 t,利用邏輯電路每隔時間 t 產生一次刷新請求。這樣可以避免使 CPU 連續等待過長的時間,而且減少了刷新次數,從根本上提高了整機速度。
DRAM 的刷新需注意以下問題:(1)刷新對 CPU 是透明的,即刷新不依賴外部的訪問;(2)動態 RAM 的刷新單位是行,故刷新操作時僅需要行地址;(3)刷新操作類似於讀操作,但又有所不同。刷新操作僅給柵極電容補充電荷,不需要信息輸出。另外,刷新時不需要選片,即整個存儲器中的所有芯片同時被刷新。
SRAM 和 DRAM 都滿足斷電內容消失,但需要刷新的只有 DRAM,而 SRAM 不需要刷新。
| 特點 \ 類型 | SRAM | DRAM |
| 存儲信息 | 觸發器 | 電容 |
| 破壞性讀出 | 非 | 是 |
| 需要刷新 | 不要 | 需要 |
| 送行列地址 | 同時送 | 分兩次送 |
| 運行速度 | 快 | 慢 |
| 集成度 | 低 | 高 |
| 發熱量(功耗) | 大 | 小 |
| 存儲成本 | 高 | 低 |
| 主要用途 | 高速緩存 | 主機內存 |
ROM 器件有兩個顯著的優點:
(1)結構簡單,所以位密度比可讀寫存儲器高。
(2)具有非易失性,所以可靠性高。
根據制造工藝不同,ROM 可分為掩膜式只讀存儲器(MROM)、一次可編程只讀存儲器(PROM)、可擦除可編程只讀存儲器(EPROM)、閃速存儲器(Flash Memory)和固態硬盤(Solid State Drives)。
MROM 寫入后任何人無法改變其內容。PROM 允許用戶利用專門的設備(編程器)寫入自己的程序,一旦寫入,內容就無法改變。EPROM不僅可以由用戶利用編程器寫入信息,而且可以對其內容進行多次改寫。需要修改 EPROM 內容時,先將其全部內容擦除,然后編程。
主存容量的擴展:位擴展法,字擴展法,字位同時擴展法。
雙端口 RAM 和多模塊存儲器
雙端口 RAM 是指同一個存儲器有左、右兩個獨立的端口,分別具有兩組相互獨立的地址線、數據線和控制線,允許兩個獨立的控制器同時異步地訪問存儲單元。當兩個端口的地址不相同時,在兩個端口上進行讀寫操作一定不會發生沖突。

兩個端口同時存取存儲器地同一地址單元時,會因數據沖突造成數據存儲或讀取錯誤。兩個端口對同一主存操作有以下4 種情況:
- 兩個端口不同時對同一地址單元存取數據。
- 兩個端口同時對同一地址單元讀出數據。
- 兩個端口同時對同一地址單元寫入數據。
- 兩個端口同時對同一地址單元操作,一個寫入數據,另一個讀出數據。
其中,第 1 種和第 2 種情況不會出現錯誤;第 3 種情況會出現寫入錯誤;第 4 種情況會出現讀出錯誤。
為提高訪存速度,常采用多模塊存儲器,常用的有單體多字存儲器和多體低位交叉存儲器。

1.單體多字存儲器
單體多字系統的特點是存儲器中只有一個存儲體,每個存儲單元存儲 m 個字,總線寬度也為 m 個字。一次並行讀出 m 個字,地址必須順序排列並處於同一存儲單元。
單體多字系統在一個存取周期內,從同一地址取出 m 條指令,然后將指令逐條送至 CPU 執行,每隔 1/m 存取周期,CPU 向主存取一條指令。這增大了存儲器的帶寬,提高了單體存儲器的工作速度。
缺點:指令和數據在主存內必須是連續存放的,一旦遇到轉移指令,或操作數不能連續存放,這種方法的效果就不明顯。
2.多體並行存儲器
多體並行存儲器由多體模塊組成。每個模塊都有相同的容量和存取速度,各模塊都有獨立的讀寫控制電路、地址寄存器和數據寄存器,它們既能並行工作,又能交互工作。多體並行存儲器分為高位交叉編址(順序方式)和低位交叉編址(交叉方式)兩種。
(1)高位交叉編址:高位地址表示體號,低位地址為體內地址。采用高位交叉編址方式的存儲器仍是順序存儲器。
(2)低位交叉編址:低位地址為體號,高位地址為體內地址。由於程序連續存放在相鄰體中,因此采用此編址方式的存儲器稱為交叉存儲器。

多體模塊結構的存儲器采用低位交叉編址后,可在不改變每個模塊存取周期的前提下,采用流水線的方式並行存取,提高存儲器的帶寬。

高速緩沖存儲器
高速緩沖技術是利用程序訪問的局部性原理,把程序中正在使用的部分存放在一個高速的、容量較小的Cache中。使 CPU 的訪存操作大多數針對 Cache 進行,從而大大提高程序的執行速度。
Cache 位於存儲器層次結構的頂層,通常由 SRAM 構成。
CPU 與 Cache 之間的數據交換以字為單位,而 Cache 與主存之間的數據交換則以 Cache 塊為單位。
在Cache 中,地址映射是指把主存地址空間映射到 Cache 地址空間,即把存放在主存中的程序按照某種規則裝入Cache。地址映射不同於地址變換。地址變換是指 CPU 在訪存時,將主存地址按映射規律換算成 Cache 地址的過程。地址映射的方式有以下 3 種。
1.直接映射
主存數據塊只能裝入 Cache 中唯一的位置。若這個位置已有內容,則產生塊沖突,原來的塊將無條件地被替換出去(無須使用替換算法)。直接映射的塊沖突概率最高,空間利用率低。直接映射的關系可定義為 j = i mod 2c
直接映射的地址結構為
| 主存字塊標記 | Cache 字塊地址 | 字塊內地址 |
2.全相聯映射
可以把主存數據塊裝入 Cache 中的任何位置。
全相聯映射的地址結構為
| 主存字塊標記 | 字塊內地址 |
3.組相聯映射
將 Cache 空間分成大小相同的組,主存的一個數據塊可以裝入一組內的任何一個位置,即組間采取直接映射,而組內采取全相聯映射。兩個 Cache 塊為一組即二路組相聯。
組相聯映射的地址結構為
| 主存字塊標記 | 組地址 | 字塊內地址 |

Cache 總容量包括:存儲容量、標記列陣容量(有效位、標記位、一致性維護位、替換算法控制位)。
每個 Cache 行對應一個標記項(有效位、標記位……)
Cache 中主存塊常用的替換算法有隨機(RAND)算法、先進先出(FIFO)算法、近期最少使用(LRU)算法和最不經常使用(LFU)算法。與操作系統算法類似,不再贅述。
Cache 中的內容是主存塊的副本,當對 Cache 中的內容進行更新時,就需選用寫操作策略,使 Cache 內容和主存內容保持一致。此時分兩種情況:
對於 Cache 寫命中(write hit),有兩種處理方法。
(1)全寫法(寫直通法、write - through)。當 CPU 對 Cache 寫命中時,必須把數據同時寫入 Cache 和主存。
(2)寫回法(write - back)。當 CPU 對 Cache 寫命中時,只修改 Cache 的內容,而不立即寫入主存,只有當此塊被換出時才寫回主存。這種方法減少了訪存次數,但存在不一致的隱患。采用這種策略時,每個 Cache 行必須設置一個標志位(臟位),以反應此塊是否被修改過。
對於 Cache 不命中,也有兩種處理方法
(1)寫分配法(write - allocate)。加載主存中的塊到 Cache 中,然后更新這個 Cache 塊。它試圖利用程序的空間局部性,但缺點是每次不命中都需要從主存中讀取一塊。
(2)非寫分配法(not - write - allocate)。只寫入主存,不進行調塊。
Cache的寫命中和寫未命中,就是磁盤或者內存上的存儲區域之前有沒有寫過數據。如果有,這次再寫到相同的區域叫寫命中;如果寫到其他區域,叫寫未命中。
非寫分配法常與全寫法合用,寫分配法通常和寫回法合用。
對於由高速緩存、主存、硬盤構成的三級存儲體系,CPU 訪問該存儲系統時發送的地址為主存物理地址。當 CPU 訪存時,先要到 Cache 中查看該主存地址是否在 Cache 中,所以發送的是主存物理地址。只有在虛擬存儲器中,CPU 發出的才是虛擬地址。磁盤地址是外存地址,外存中的程序由操作系統調入主存中,然后在主存中執行,因此 CPU 不可能直接訪問磁盤。
采用 指令Cache 和 數據Cache 分離的主要目的是減少指令流水線的資源沖突。
局部性原理的基本含義是:在程序執行過程中,程序對主存的訪問是不均勻的(即局部)。
頁式虛擬存儲方式和段頁式都以頁為單位和主存交互。
虛存對應用程序員透明,對系統程序員不透明。
在虛擬存儲器中,當程序正在執行時,由操作系統完成地址映射。
若 Cache 行長太大,Cache 項數變少,因而命中的可能性減小。
以上內容均來自王道書籍及相關課程等
