1.2 存儲器系統程序員
存儲器是用來存放程序和數據的部件,它是一個記憶裝置,也是計算機可以實現「存儲程序控制」的基礎。在計算機系統中,規模較大的存儲器每每分紅若干級,稱爲存儲器系統。傳統的存儲器系統通常分爲高速緩衝存儲器(Cache)、主存、輔存三級。主存可由 CPU直接訪問,存取速度快,但容量較小,通常用來存放當前正在執行的程序和數據。輔存設置在主機外部,它的存儲容量大,價格較低,但存取速度較慢,通常用來存放暫時不參與運行的程序和數據,CPU 不能夠直接訪問輔存,輔存中的程序和數據在須要時才傳送到主存,所以它是主存的補充和後援。當 CPU 速度很高時,爲了使訪問存儲器的速度能與 CPU 的速度相匹配,又在主存和 CPU 間增設了一級 Cache。Cache 的存取速度比主存更快,但容量更小,用來存放當前最急需處理的程序和數據,以便快速地向 CPU 提供指令和數據。所以,計算機採用多級存儲器體系,確保可以得到儘量高的存取速率,同時保持較低的成本。多層級的存儲體系之因此能用低投入換來較高的存取速率,得益於局部性原理。局部性原理是指程序在執行時呈現出局部性規律,即在一較短的時間內,程序的執行僅侷限於某個部分。相應地,它所訪問的存儲空間也僅侷限於某個區域。程序局部性包括時間局部性和空間局部性,時間局部性是指程序中的某條指令一旦執行,不久之後該指令可能再次執行。產生時間局部性的典型緣由是因爲程序中存在着大量的循環操做;空間局部性是指一旦程序訪問了某個存儲單元,不久之後,其附近的存儲單元也將被訪問,即程序在一段時間內所訪問的地址可能集中在必定的範圍內,其典型狀況是程序順序執行。算法
存儲器中數據經常使用的存取方式有順序存取、直接存取、隨機存取和相聯存取四種。編程
(1) 順序存取:存儲器的數據以記錄的形式進行組織。對數據的訪問必須按特定的線性順序進行。磁帶存儲器採用順序存取的方式。緩存
(2) 直接存取:與順序存取類似,直接存取也使用一個共享的讀寫裝置對全部的數據進行訪問。可是,每一個數據塊都擁有惟一的地址標識,讀寫裝置能夠直接移動到目的數據塊所在位置進行訪問。存取時間也是可變的。磁盤存儲器採用直接存取的方式。dom
(3) 隨機存取:存儲器的每個可尋址單元都具備本身惟一的地址和讀寫裝置,系統能夠在相同的時間內對任意一個存儲單元的數據進行訪問,而與先前的訪問序列無關。主存儲器採用隨機存取的方式。性能
(4) 相聯存取:相聯存取也是一種隨機存取的形式,可是選擇某一單元進行讀寫是取決於其內容而不是其地址。與普通的隨機存取方式同樣,每一個單元都有本身的讀寫裝置,讀測試
寫時間也是一個常數。使用相聯存取方式,能夠對全部的存儲單元的特定位進行比較,選擇符合條件的單元進行訪問。爲了提升地址映射的速度,Cache 採起相聯存取的方式。優化
1.2.1 主存儲器spa
主存用來存放計算機運行期間所須要的程序和數據,CPU 可直接隨機地進行讀/寫。主存具備必定容量,存取速度較高。因爲 CPU 要頻繁地訪問主存,因此主存的性能在很大程度上影響了整個計算機系統的性能。根據工藝和技術不一樣,主存可分爲隨機存取存儲器和只讀存儲器。操作系統
隨機存取存儲器(Random Access Memory,RAM)既能夠寫入也能夠讀出,但斷電後信息沒法保存,所以只能用於暫存數據。RAM 又可分爲 DRAM(Dynamic RAM,動態 RAM) 和 SRAM(Static RAM,靜態 RAM)兩種,DRAM 的信息會隨時間逐漸消失,所以須要定時對其進行刷新維持信息不丟失;SRAM 在不斷電的狀況下信息可以一直保持而不會丟失。DRAM 的密度大於 SRAM 且更加便宜,但 SRAM 速度快,電路簡單(不須要刷新電路),然而容量小,價格高。
只讀存儲器(Read Only Memory,ROM)能夠看做 RAM 的一種特殊形式,其特色是: 存儲器的內容只能隨機讀出而不能寫入。這類存儲器經常使用來存放那些不須要改變的信息。因爲信息一旦寫入存儲器就固定不變了,即便斷電,寫入的內容也不會丟失,因此又稱爲固定存儲器。ROM 通常用於存放系統程序 BIOS(Basic Input Output System,基本輸入輸出系統)。
不一樣的計算機,存儲器編址的方式不一樣,主要有字編址和字節編址。
內存通常以字節(8 位)爲單位,或者以字爲單位(字的長度可大可小,例如 16 位或者 32 位等,在這類試題中,通常會給出字的大小)。
例如,內存地址從 AC000H 到 C7FFFH,則共有 C7FFFFH-AC000H=1BFFFH 個地址單元
(轉換爲十進制後,爲 112KB)。若是該內存地址按字(16bit)編址,則共有 112KB*16 位。假設該內存由 28 片存儲器芯片構成,已知構成此內存的芯片每片有 16KB 個存儲單元, 則該芯片每一個存儲單元存儲(112KB*16)/(28*16KB)=4 位。
1.2.2 輔助存儲器
一臺硬盤驅動器中有多個磁盤片,每一個盤片有兩個記錄面,每一個記錄面對應一個磁頭, 因此記錄面號就是磁頭號,如圖 1-2(a)所示。全部的磁頭安裝在一個公用的傳動設備或支架上,磁頭一致地沿盤面徑向移動,單個磁頭不能單獨地移動。在記錄面上,一條條磁道造成一組同心圓,最外圈的磁道爲 0 號,往內則磁道號逐步增長,如圖 1-2(b)所示。在一個盤組中,各記錄面上相同編號(位置)的各磁道構成一個柱面,如圖 1-2(c)所示。
若每一個磁盤片有 m 個磁道,則該硬盤共有 m 個柱面。引入柱面的概念是爲了提升硬盤的存儲速度。當主機要存入一個較大的文件時,若一條磁道存不完,就須要存放在幾條磁道上。這時,應首先將一個文件儘量地存放在同一柱面中。若是仍存放不完,再存入相鄰的柱面內。
一般將一條磁道劃分爲若干個段,每一個段稱爲一個扇區或扇段,每一個扇區存放一個定長信息塊(例如,512 個字節),如圖 1-2(b)所示。一條磁道劃分多少扇區,每一個扇區可存放多少字節,通常由操做系統決定。磁道上的扇區編號從 1 開始,不像磁頭或柱面編號從 0 開始。
在磁盤上進行信息的讀寫時,首先須要定位到目標磁道,這個過程稱之爲尋道,尋道所消耗的時間稱爲尋道時間,定位到目標磁道後,須要定位到目標扇區,此過程經過旋轉盤片完成,平均旋轉半圈可到目標位置。故磁盤訪問時間爲:
磁盤訪問時間(存取時間) = 尋道時間+旋轉延遲時間
1.2.3 Cache 存儲器
Cache 的功能是提升 CPU 數據輸入輸出的速率,突破所謂的「馮•諾依曼瓶頸」,即 CPU 與存儲系統間數據傳送帶寬限制。高速存儲器能以極高的速率進行數據訪問,但因其價格高昂,若是計算機的內存徹底由這種高速存儲器組成,則會大大增長計算機的成本。一般在CPU 和內存之間設置小容量的 Cache。Cache 容量小但速度快,內存速度較低但容量大, 經過優化調度算法,系統的性能會大大改善,彷彿其存儲系統容量與內存至關而訪問速度近似 Cache 。
Cache 一般採用相聯存儲器(ContentAddressable Memory,CAM)。CAM 是一種基於數據內容進行訪問的存儲設備。當對其寫入數據時,CAM 可以自動選擇一個未用的空單元進行存儲;當要讀出數據時,不是給出其存儲單元的地址,而是直接給出該數據或者該數據的一部份內容,CAM 對全部存儲單元中的數據同時進行比較,並標記符合條件的全部數據以供讀取。因爲比較是同時、並行進行的,因此,這種基於數據內容進行讀寫的機制,其速度比基於地址進行讀寫的方式要快不少。
1.Cache 基本原理
使用 Cache 改善系統性能的依據是程序的局部性原理。根據程序的局部性原理,最近的、將來要用的指令和數據大多侷限於正在用的指令和數據,或是存放在與這些指令和數據位置上鄰近的單元中。這樣,就能夠把目前經常使用或將要用到的信息預先放在 Cache 中。當CPU 須要讀取數據時,首先在 Cache 中查找是否有所需內容,若是有,則直接從 Cache 中讀取;若沒有,再從內存中讀取該數據,而後同時送往 CPU 和 Cache。若是 CPU 須要訪問的內容大多都能在 Cache 中找到(稱爲訪問命中),則能夠大大提升系統性能。
若是以 h 表明對 Cache 的訪問命中率(「1-h」稱爲失效率,或者稱爲未命中率),t1 表示 cache 的週期時間,t2 表示內存的週期時間,以讀操做爲例,使用「Cache+主存儲器」 的系統的平均週期爲 t3。則:
t3 =t1′h+t2′(1-h)
系統的平均存儲週期與命中率有很密切的關係,命中率的提升即便很小也能致使性能上的較大改善。
例如,設某計算機主存的讀/寫時間爲 l00ns,有一個指令和數據合一的 Cache,已知該Cache 的讀/寫時間爲 10ns,取指令的命中率爲 98%,取數的命中率爲 95%。在執行某類程序時,約有 1/5 指令須要存/取一個操做數。假設指令流水線在任什麼時候候都不阻塞,則設置 Cache 後,每條指令的平均訪存時間約爲:
(2%′100ns+98%′10ns)+1/5′(5%′100ns+95%′10ns)=14.7ns
2.映射機制
當 CPU 發出訪存請求後,存儲器地址先被送到 Cache 控制器以肯定所需數據是否已在 Cache 中,若命中則直接對 Cache 進行訪問。這個過程稱爲 Cache 的地址映射(映像)。在 Cache 的地址映射中,主存和 Cache 將均分紅容量相同的塊(頁)。常見的映射方法有直接映射、全相聯映射和組相聯映射。
(1)直接映像
直接映像方式以隨機存取存儲器做爲 Cache 存儲器,硬件電路較簡單。在進行映像時, 主存地址被分紅三個部分,從高到低依次爲:區號、頁號以及頁內地址,如圖 1-3 所示。
在本例中,內存容量爲 1GB,Cache 容量爲 8MB,頁面的大小爲 512KB。直接映像中, 先分區,再分頁。一個區的大小就是 Cache 容量的大小,因此一共分:1GB/8MB=128 個區, 區號 7 位。每一個區分:8MB/512KB=16 個頁,因此頁號爲 4 位。
在直接映像方式中,每一個主存頁只能複製到某一固定的 Cache 頁中,如圖 1-4 所示。直接映像方式的映像規律是:主存中每一個區的第 0 頁,只能進入到 Cache 的第 0 頁。即: 若當前時刻 Cache 中 0 號頁已被佔據,而 1-15 號頁空閒,如今要將 1 區第 0 頁(即內存的 16 頁)調入 Cache 是會發生衝突的。因此直接映像的塊衝突率很是高。
在 Cache 中,爲每個頁設立一個 Cache 標記,該標記用於識別當前的 Cache 塊來自於哪一個內存頁。直接映像中,因爲每一個區的 N 號頁,都必須進入到 Cache 的 N 號頁,
因此只須要記錄區號便可。因此此時標記位的長度是 7 位。
直接映像方式的優勢是比較容易實現,缺點是不夠靈活,有可能使 Cache 的存儲空間得不到充分利用。
(2)全相聯映像
全相聯映像使用相聯存儲器組成的 Cache 存儲器。在全相聯映像方式中,主存的每一頁能夠映像到 Cache 的任一頁。若是淘汰 Cache 中某一頁的內容,則可調入任一主存頁的內容,於是較直接映像方式靈活。
在全相聯映像方式中,主存地址分爲兩個部分,分別爲地址部分(主存頁標記)和數據部分(頁內地址)。數據部分用於存放數據,而地址部分則存放該數據的存儲器地址。如圖 1-5 所示。
全相聯映像方式的 Cache 組織如圖 1-6 所示。
當進行映像時,在咱們給定的例子中,當程序訪存時,則高 11 位給出主存頁號,低19 位給出頁內地址。由於每一個 Cache 頁可映像到 2048 個主存頁中的任一頁,因此每頁的Cache 標記也須要 11 位,以代表它如今所映像的主存頁號。所以,Cache 標記信息位數增長,比較邏輯成本隨之增長。
在全相聯映像方式中,主存地址不能直接提取 Cache 頁號,而是須要將主存頁標記與Cache 各頁的標記逐個比較,直到找到標記符合的頁(訪問 Cache 命中),或者所有比較完後仍無符合的標記(訪問 Cache 失敗)。所以這種映像方式速度很慢,失掉了高速緩存的做用,這是全相聯映像方式的最大缺點。若是讓主存頁標記與各 Cache 標記同時比較,則成本又過高。全相聯映像方式因比較器電路難於設計和實現,只適用於小容量 Cache。
(3)組相聯映像
組相聯映像(頁組映像)介於直接映像和全相聯映像之間,是這兩種映像的一種折衷方案。全相聯映像方式以頁爲單位,可自由映像,沒有固定的對應關係。直接映像方式中,主存分組,主存組內的各頁與 Cache 的頁之間採起的是固定的映像關係,但各組都可映像到Cache 中。在組相聯映像方式中,主存與 Cache 都分組,主存中一個組內的頁數與 Cache 的分組數相同,如圖 1-7 所示。
在圖 1-7 給出的例子中,主存分 128 個區,每一個區 8 個組,每一個組 2 個頁。組相聯映像
方式的主存地址組織如圖 1-8 所示。
組相聯映像的規則是:主存中的組與 Cache 的組造成直接映像關係,而每一個組內的頁是全相聯映像關係。如主存 1 區 0 頁,他在 0 組中,因此只能進入 Cache 的 0 組中,至於
進入到 Cache 的 0 組 0 頁,仍是 0 組 1 頁,並沒有強制要求,可任意放置。
在組相聯映像中,Cache 中每一頁的標記位長度爲 8 位,由於此時除了要記錄區號,還得記錄組號,即區號 7 位加組號 1 位等於 8 位。
容易看出,若是 Cache 中每組只有一頁,則組相聯映像方式就變成了直接映像方式。若是 Cache 中每組頁數爲 16 頁(即 Cache 只分一組),則就是全相聯映像。所以,在具體設計組相聯映像時,能夠根據設計目標選取某一折衷值。
在組相聯映像中,因爲 Cache 中每組有若干可供選擇的頁,於是它在映像定位方面較直接映像方式靈活;每組頁數有限,所以付出的代價不是很大,能夠根據設計目標選擇組內頁數。
希賽教育專家提示:爲保障性能,內存與 Cache 之間的映射每每採用硬件完成,因此Cache 對於程序員而言是透明的,程序員編程時,徹底不用考慮 Cache。
3.替換算法
當 Cache 產生了一次訪問未命中以後,相應的數據應同時讀入 CPU 和 Cache。可是當Cache 已存滿數據後,新數據必須替換(淘汰)Cache 中的某些舊數據。最經常使用的替換算法有如下三種:
(1) 隨機算法。這是最簡單的替換算法。隨機法徹底無論 Cache 塊過去、如今及未來的使用狀況,簡單地根據一個隨機數,選擇一塊替換掉。
(2) 先進先出(First In and First Out,FIFO)算法。按調入 Cache 的前後決定淘汰的順序,即在須要更新時,將最早進入 Cache 的塊做爲被替換的塊。這種方法要求爲每塊作一記錄,記下它們進入 Cache 的前後次序。這種方法容易實現,並且系統開銷小。其缺點是可能會把一些須要常用的程序塊(如循環程序)替換掉。
(3) 近期最少使用(Least Recently Used,LRU)算法。LRU 算法是把 CPU 近期最少使用的塊做爲被替換的塊。這種替換方法須要隨時記錄 Cache 中各塊的使用狀況,以便肯定哪一個塊是近期最少使用的塊。LRU 算法相對合理,但實現起來比較複雜,系統開銷較大。一般須要對每一塊設置一個稱爲「年齡計數器」的硬件或軟件計數器,用以記錄其被使用的狀況。
4.寫操做
由於須要保證緩存在 Cache 中的數據與內存中的內容一致,相對讀操做而言,Cache 的寫操做比較複雜,經常使用的有如下幾種方法。
(1) 寫直達(write through)。當要寫 Cache 時,數據同時寫回內存,有時也稱爲寫通。當某一塊須要替換時,也沒必要把這一塊寫回到主存中去,新調入的塊能夠當即把這一塊覆蓋掉。這種方法實現簡單,並且能隨時保持主存數據的正確性,但可能增長屢次沒必要要的主存寫入,會下降存取速度。
(2) 寫回(write back)。CPU 修改 Cache 的某一塊後,相應的數據並不當即寫入內存單元,而是當該塊從 cache 中被淘汰時,才把數據寫回到內存中。在採用這種更新策略的cache 塊表中,通常有一個標誌位,當一塊中的任何一個單元被修改時,標誌位被置「1」。在須要替換掉這一塊時,若是標誌位爲「1」,則必須先把這一塊寫回到主存中去以後,才能再調入新的塊;若是標誌位爲「0」,則這一塊沒必要寫回主存,只要用新調入的塊覆蓋掉這一塊便可。這種方法的優勢是操做速度快,缺點是因主存中的字塊未隨時修改而有可能出錯。
(3) 標記法。對 Cache 中的每個數據設置一個有效位。當數據進入 Cache 後,有效位置「1」;而當 CPU 要對該數據進行修改時,數據只需寫入內存並同時將該有效位置「0」。當要從 Cache 中讀取數據時須要測試其有效位,若爲「l」則直接從 Cache 中取數,不然, 從內存中取數。