概述
在計算機運行過程中,存儲器是各種信息存儲和交換的中心,而計算機所有存儲器所構成的存儲系統更是整個計算機系統的核心組成部分。在一台計算機中通常有多個存儲器:主存儲器
、Cache
、通用寄存器
、磁盤寄存器
、各種緩沖存儲器
、光盤存儲器
等。
為了評定不同存儲器的性能差異,人們制定了一些主要的性能指標:速度,容量和價格。
其中速度我們用存儲器的訪問周期、讀出時間、頻帶寬度等來進行表示。容量用字節B、千字節KB、兆字節MB和千兆字節GB等表示。價格則是用單位容量的價錢表示,例如$C/bit
。
講了這么多存儲器的內容,那什么叫做存儲體系
哪?
下邊我們引入存儲體系的定義:
兩個或兩個以上速度、容量和價格各不相同的存儲器用硬件、軟件、或軟件與硬件相結合的方法連接建立起來的一個系統。
簡單來說,就是一個將不同類型的存儲器用軟件或者硬件方法結合成一個整體。該系統對程序員透明,並且,從應用程序員來看,它僅僅是一個存儲器。這個存儲器的速度接近速度最快的那個存儲器,存儲容量與容量最大的那個存儲器相等,單位容量的價格接近最便宜的那個存儲器。
為了更加便於理解存儲體系速度、容量和價格的關系,我們畫出下圖用更加嚴謹的方式來進行表述。
符號說明
各個存儲器的各個性能指標和其構成的存儲體系的性能指標之間的關系為:
存儲體系的分類
在計算機系統中一般來說存儲器類別主要有Cache、主存儲器和輔助存儲器三類組成,按照不同的組合方式構成了兩種存儲體系:
Chache存儲體系
:由Cache和主存儲器構成- 主要目的:提高存儲器速度,或者說是為了貪圖Cache的存儲速度
- 系統程序員看:速度接近Cache,存儲器容量等於主存,每位的價格接近主存儲器
虛擬存儲體系
:由主存儲器和磁盤存儲器構成- 主要目的:擴大存儲器容量,或者說貪圖磁盤存儲器的容量。
- 應用程序員看:速度接近主存儲器,存儲容量是虛擬地址空間,每位價格接近磁盤存儲器。
看到這里可能大家會有疑問,三種存儲器兩兩組合方式組中結果不是應該是三種嗎?
或者說應該還有一種組合方式即Cache+磁盤存儲器??
坦白來講此種存儲體系理論上講是可以有的,但是實際應用中,由於Cache和虛擬存儲器的速度差別太大,強行相互結合,根本不可能發揮出Cache存儲器的速度優勢,實際上還會大大拖累Cache的運行。因此此種組合方式在實際應用過程中根本不可能存在。
存儲效率
關於速度的評定我們一般通過,訪問周期、存取周期、存儲周期、存取時間等來進行表示。
關於這些指標的計算我們詳細可以參照百度百科
提到了存儲器的速度,我們就提另一個指標存儲效率
。
首先我們給出命中率的定義:
在\(M_1\)存儲器中達到的訪問效率,給出以下公式
其中:
$ N_1 \(是\)M_1$存儲器訪問到的效率。
\(N_2\)是對\(M_2\)存儲器的訪問次數
進而我們引出存儲系統的訪問效率:
從上邊的公式中我們可以得出提高存儲系統的兩條途徑:
- 提高命中率H
- 兩個存儲器的速度差別不應太大
在實際操作中有時第二條途徑做不多(如虛擬存儲器),因此,在實際操作過程中我們通過提高命中率來提高存取效率。
那此處可能就又有一個問題:如何提高命中率?
我們一般采用預取技術
來提高命中率
措施:在未命中時,把\(M_2\)存儲器中相鄰幾個單元組成的一個數據塊都取出來送入到\(M_1\)存儲其中。
在引入預取技術
之后我們可以的出新的命中率公式:
其中:
\(H^{\prime}\)是采用預取技術之后的命中率
\(H\)是原來的命中率
\(n\)是數據塊大小與數據重復使用次數的乘積。
為了更加深入的理解命中率我們做下邊一個例題
例:在一個Cache存儲系統中,當Cache的塊大小為一個字時,命中率為H=0.8;假設數據的重復利用率為5,Cache的塊大小為4個字
- 計算Cache存儲系統的命中率是多少?
- 假設\(T_2=5T_1\),分別計算訪問效率。
存儲體系原理
存儲體系具體操作過程中可能會遇到容量不足或者速度不夠的問題,下邊我們分成兩個專題分別對其進行討論和解決。
容量不足的問題
第一種方案:增加主存容量
解決容量不足的問題,我們最容易想到的便是增加主存容量。正如缺啥補啥,缺少容量我們增加主存容量必然可以在一定程度上解決容量不足的問題,但是提到任何一種方案,不考慮經濟因素便是耍流氓。我們要知道主存的價格並不是非常便宜,隨着主存容量的增加,存儲器價格總量必然增加。從而導致單位容量存儲器價格增加。顯然這不是最終的解決的方案。
第二種方案:采用兩級存儲器
既然僅僅增加主存容量我們不能根本上解決該問題,因此我們也提出了第二種方案來進行補充--將主存和輔存結合在一起采用兩級存儲結構,利用低價格的輔存來擴充存儲容量。
當然能夠用輔存擴充容量且能達到主存的速度,其背后是有如下依據的:
首先計算機中所有的信息可以分為如下三類:
- 活躍的信息,即當前正在使用的信息
- 待命的信息,將要使用的信息
- 靜止的信息,已被使用而不再處理的信息
因此我們按照不同的使用頻率,可以將不同的信息放置到不同的存儲器中。可將活躍的信息和部分待命的信息放在主存中,其余部分放到輔存,以減少主存容量的要求,從而實現擴充容量的同時又不會顯著的增加成本。
由於信息本身的使用頻率不是固定的,或者說同一個信息在不同的時間段可能被分為不同的類別,因此在使用兩級存儲之后,主輔存之間的信息調出和調入可能會有一些問題。
程序的調入和調出由程序員考慮和安排,一定程度上增加了程序員的負擔。因此使用輔助機構自動定位,從而引出了虛擬存儲器。
可以將高速輔存(如磁盤)偽裝成主存訪問,信息在主存、輔存之間的調進和調出完全由輔助機構自動完成。
速度不足的問題
存儲器的速度往往是整個計算機速度的第一個瓶頸。
方法一,同樣也是從主存入手,提高主存的速度。此法也在采用,但此法隨存儲器速度的提高成本也會顯著增加。
方法二也是引入二級存儲結構,只不過引入的是Cache+主存
此體系的結構圖如下:
讓CPU直接與它速度匹配的Cache訪問,此法也需要CPU和cache之間利用輔助機構來完成cache與主存之間信息的調入與調出。
輔助機構的功能
上邊解決兩個問題都需要用到輔助機構,那么我們到此處可能會有疑問了,那輔助機構到底有什么功能那?
首先,第一個是地址映像功能:
解決\(M_2\) 中的信息采用何種規則調入到\(M_1\)中(即調入規則的問題)。
第二個功能叫做地址變換功能:
根據映像規則,將包括\(M_2\)在內的大空間的地址轉換成CPU能夠直接訪問的\(M_1\)中的地址(即地址變換問題)。
第三個功能是進行頁面替換:
在\(M_1\)中裝滿信息的條件下,采用何種算法,算出調用\(M_1\)的部分信息,使\(M_2\)中的部分功能調到\(M_1\)中(即替換算法問題)。
關於這三部分功能下邊我們會分成三個小專題分別來進行講述。
存儲體系中的頁式管理
因為存儲器本身的物理結構並不適合信息的存儲於組織,因此我們在對存儲器使用之前需要對其抽象出一層邏輯結構來進行信息組織,因此此處我們引入頁式管理
的概念。
頁的定義
首先我們要明白頁式管理
中"頁"是何含義。
頁式管理
中將虛擬存儲空間和實際存儲空間等分成固定大小的頁,使虛擬頁可裝入主存中不同的實際頁面位置。
頁式管理中的地址表示
頁式管理
將物理的存儲結構進行一層抽象,引入了“頁”來進行管理,從而使得對存儲地址的訪問也需要某種新的地址表示。
- 虛地址(邏輯地址,程序地址):包括\(M_2\)在內的大空間地址。
其中,
\(N_v\):虛頁號
\(N_r\):頁內地址
- 實地址(物理地址):為CPU能直接訪問的\(M_1\)中的地址。
其中:
\(n_v\):實頁號
\(n_r\):頁內地址
當然引用兩種地址表示不是目的,為了解決虛地址
和實地址
,因此下邊我們引入了頁表
的概念。
頁表是一種特殊的數據結構,放在系統空間的頁表區,存放邏輯頁與物理頁幀的對應關系。
頁表
具有以下特點:
頁表
所需行數和虛頁號數相等,虛頁號與頁表行號對應,因此無需虛頁號字段。頁表
中每行內容分為兩個字段:實頁號\(n_v\)以及裝入位(1位,其中0表示該頁已裝入,1表示該頁未被裝入)
針對上邊的兩個特點我們可以設計出結構如下的頁表:
此時可能會有同學問了,虛頁號到哪里去了??
這個很容易解釋,根據第一個特點,虛頁號和頁表行號一致的,而頁表行號實際上是從零開始逐行“+1“的。也即我們看到的上邊那個兩行的頁表實際上等同於下邊這種三行結構的頁表。
頁式管理的地址變換(關鍵)
①根據\(N_v\)去查頁表中的某一行m。
②查該行的裝入位。
③裝入位=1時,命中。表示該虛頁已裝入。
- 從該行中送出\(n_v\)(實頁號)。
- 再將\(N_r\)直送\(n_r\),
- 即完成\(N_vN_r\) → \(n_v n_r\)。
④裝入位=0時,失效,表示該虛頁未裝入\(M_1\)中。
為了加深理解我們做下邊一個例題,
某虛擬存儲器共8個頁面,每頁為1024個字,實際主存為4096個字,采用頁表法進行地址映象。映象表的內容如下表所示:
1)列出會發生頁面失效的全部虛頁號;
2)按以下虛地址計算主存實地址:
0、3728、1023、1024、2055、7800、4096、6800
地址映象及其變換
在上一小節,我們簡單介紹了虛地址和實地址之間的轉換。但實際上如果存儲系統使用的是不同地址映像方式的話,可能地址變換方式可能也會有很大的不同。一般來說我們常用的地址映像方式有以下四種:
- 全相聯
- 直接相聯
- 組相聯
- 段相聯
下邊我們分四個小專題分別對其進行介紹。
全相聯映象及其變換
首先我們給出`全相聯映象的含義:
對輔存中的任何一個頁面都可以放到主存中任何一個頁面的映像規則,稱為全相聯映射。
按照其定義我們給出以下示意圖:
我們不難全相聯映射
具有如下特點:
輔存中的任何一個頁面都可能映射到主存中。
地址變換
地址表示的示意圖如下:
當然上邊具體變換方法不只一種,除了上一章節介紹的頁表法
外還有一種方法叫做目錄表法
全相聯目錄表法
該種方法要求用相聯存儲器作為目錄表(相聯存儲器是一種可按照內容的特征字段來訪問的一種存儲器,是一個小容量高速存儲器)。
目錄表的結構具有如下特點:
- 目錄表的行數與主存頁面數相等
- 目錄表中每行的內容:
- \(N_v\)為相聯比較字段;
- \(n_v\)為主存頁號(非相聯比較字段)。
具體變換過程如下:
當然為了便於理解,我們畫出其詳細的變換過程
具體過程如下:
- 將虛地址中的\(N_V\)送目錄表中去進行相聯比較(一個\(t_m\))。
- 當有某個比較器比較相等(比較的時候是比較的是\(N_v\)相關聯的字段)時,將該行\(n_V\)送出,同時\(N_r\)→\(n_r\),實現了\(N_vN_r\)→\(n_vn_r\)的變換(命中).
- 若沒有相等的,不命中,等待調入。
通過以上過程我們不難分析出全相連目錄表法具有如下特點:
- 產生頁面沖突的可能性很小(因為頁表的行數和主存行數相同);
- 與頁表放入主存中相比,查表的速度快(因為目錄表是放到相聯存儲器中的,輸入高速存儲器);
當然該方法也有以下缺點:
- 可擴展性差(因為相聯存儲器容量在一定程度上限制了主存的擴展,不能太大超過相聯存儲器的行數)
- 主存容量增加時,目錄表的造價高,速度降低(成本原因,在工程上很常見)。
直接映象及其變換
該方法現將輔存按照主存大小分為若干塊,在輔存的每一塊內都有與主存相同的頁面數,輔存每塊內的頁面只能調入到與主存相同的頁面上。
該方法與全相聯映射相比我們發現,直接映象輔存中的某塊具體某一頁能夠調度的位置是固定的(或者說是固定的幾個位置)。
下面我們畫出直接映象的規則示意圖:
其中:
- \(N_d\) :塊號
- \(N_v′\):塊內頁號
從圖中我們可以看到,該方法先將輔存按主存大小分為若干塊,在輔存的每塊內都有與主存相同的頁面數,輔存每塊內的頁面只能調入到與主存相同的頁面上(可以簡單理解為一個蘿卜一個坑😄😄)
地址變換
在展開說明直接映象的地址變換之前我們先了解下直接相聯請情況下,實地址和虛地址是如何表示的。
由於直接映象引入了“塊”,因此我們在給定虛地址時肯定要給出塊號,然后我們通過塊號(\(N_d\))、塊內頁號(\(N_v'\))以及頁內地址(\(N_r\))三部分來最終定位到具體的數據地址,此處我們給出示意圖便於理解。
實地址和硬件是高度相關的,因此基本不會發生變化,和前邊一樣由兩部分組成實頁號(\(n_v\))頁內地址(\(n_r\)),示意圖如下:
同樣的,由於引入了“塊”的概念因此在進行地址變換的時候我們需要一個新的表--塊表
。
塊表
具有如下特點:
- 塊表長度與主存頁面數相等。
- 塊表行中的內容:塊號\(N_d\)。
有了前邊兩點的鋪墊之后,我們下邊可以詳細講述一下地址變換的過程:
給出地址變換的一個簡單示意圖:
- 根據塊內頁號\(N_v′\)去查塊表中的\(N_v′\)行,獲取到對應的塊號
- 將虛地址中的塊號\(N_d\)與所選塊表中的 \(N_d\)比較。
- 相同時則命中,直接將\(N_v′\)→\(n_v\),\(N_r\)→\(n_r\)。
- 不同時,則表示未命中
從上邊的分析中我們可以總結出直接相連映象具有如下特點:
- 可將查表與訪存同時進行,有利於訪問速度的提高(命中時)。
- 產生頁面沖突的可能性極大(因無靈活的存放余地)。
組相聯映象及地址變換
組相連映像
則是先將主存分為頁面數相同的若干組,再將輔存按主存划分為若干區,組內采用全相聯映象,組間采用直接映象。
這個很明顯通過分組融合了全相連映象和直接映象,說起來還有點小期待:happy::happy:。
同樣的,我們先給出示意圖:
其中:
- \(Nd\):區號
- \(s\) :組號
- \(q\):組內頁號——輔存
- \(s'\):組號
- \(q′\)組內頁號——主存
從圖中我們可以明顯看到:組間是直接相聯的,而組內則是全相聯。
地址變換
同樣的我們先給出其地址的表示方法
由於映象方式的改變,我們在進行地址變換的時候,需要引入一個新的表--隨機存儲器表
。
該表具有如下特點:
- 表的行數與組數相等(本例2組,即2行)。
- 每 行 大 字 段 數與組內頁面數相等(本例2個 )。
- 每 個 大 字 段 又分為三個小字段。
- 每個大字段還有一個比較器。
為了便以理解我們畫出其示意圖:
具體的變換過程如下:
- 根據虛地址中的s去查RAM表中的某一行。
- 將虛地址中的\(N_d\)、q同時送各比較器與所選行中的\(N_d\)、q進行比較。
- 當有一個比較器相等時:
- 將s→s’(組間直接)。
- 將相等大字段中q’送出作q’。
- 再將\(N_r\)→\(n_r\),即實現了將虛址(\(N_d\),s ,q ,\(N_r\) )→( s′, q′,\(n_r\))命中時的地址變換
最后我們總結出組相聯映象的特點:
既有直接映象中對號入座部分(組間直接),可減少查表范圍,縮短查表時間,又有全相聯中的靈活存放規則(組內全相聯),從而可降低頁面沖突。
缺點: 控制機構復雜
段相聯映象
所謂段相連映象
,其實跟組相聯特別相似--對主輔的划分與組相聯映象相同,但為區分兩種不同的映象規則,將組相聯中的組改為段,段間采用全相聯,段內采用直接映象。
其示意圖如下:
四種映象規則的關系
-
在組相聯映象中,當每組只有一頁時,此時的組相聯就是直接映象。
當把主存只分為一個組時,此時的組相聯也就是全相聯映象,即直接映象和全相聯映象是組相聯映象的兩個特例。
-
在段相聯映象中,當每段只有一頁時,此時的段相聯映象就是全相聯映象。
當把主存只分為一個段時,此時的段相聯也就是直接映象。
總結
本文主要從存儲體系由來、分類以及原理角度來講解一個存儲體系的設計,努力做到全面。當然由於個人水平有限,文章難免可能會有錯誤,如若發現,懇請指出,不勝感激。