1. 程式人生 > >計算機體系結構——儲存體系

計算機體系結構——儲存體系

本章重點是頁式虛擬儲存器映象及地址變換過程;LRU,FIFO的替換演算法;LRU的堆疊分析過程;Cache組相聯地址映象和LRU塊替換;虛存,Cache的效能分析,要求達到綜合應用的水平。本章是重點章。要求掌握的基本概念有:LRU,FIFO ,全相聯、直接映象,組相聯,快表、命中率,地址變換,頁式,段式,段頁式管理,虛擬儲存器,快取記憶體等等。

一、訪存的區域性性原理

計算機對儲存器的要求是高速度、大容量、低價格。

從大量的統計中得到的一個規律是,程式中對於儲存空間90%的訪問侷限於儲存空間的10%的區域中,而另外10%的訪問則分佈在儲存空間的其餘90%的區域中。這就是通常說的區域性性原理。訪存的區域性性規律包括兩個方面:

  • 1、時間區域性性:如果一個儲存項被訪問,則可能該項會很快被再次訪問。

  • 2、空間區域性性:如果一個儲存項被訪問,則該項及其鄰近的項也可能很快被訪問。

人們為了解決儲存器容量和速度的矛盾,應用了訪問區域性性原理,把儲存體系設計成為層次化的結構以滿足使用要求。在這個層次化儲存系統中,一般由暫存器、快取記憶體(Cache)、主存(記憶體)、外存(硬碟等)組成。其中暫存器是最高層次的儲存部件,容量最小,速度最快。暫存器對程式設計師是不透明的,對它的訪問需按暫存器名訪問而不是按地址。

二、儲存體系構成的基本原理

由於儲存體系採用了分層的結構,因此儲存體系中各層次之間的資料訪問如何的管理就顯得相當重要。一般都把管理功能分佈在各個層次上,每個層次的儲存管理控制器控制這一層和與之相關一層的資料訪問。層間傳遞資料

的單位稱為塊或頁

命中率指命中的訪問次數和總訪問次數之比、失效率是失效的訪問次數和總訪問次數之比。命中時間包括判斷是否命中所需時間和對上層儲存器訪存所需時間,失效時間則包括對下層儲存器的訪問時間和將下層儲存器中資料調入上層儲存器所需時間(傳輸時間)

儲存器設計的目標是降低平均訪問時間而不是單單提高命中率。也就是說層次化儲存器的速度效能指標是訪存的平均時間。另外還有頻寬(頻寬)、儲存週期等指標。

平均訪問時間=命中時間+失效時間×失效率

層次化儲存體系必須解決的三個問題:

  • 1.定位問題:資料塊在較高層儲存器中存放在哪個位置?怎樣確定並且找到該塊?這是塊的標識和定址問題。一般用查表法來映象塊或頁的定位、標識和定址。

  • 2.替換問題:不命中時,要從下層調入上層資料塊,若上層滿,則此時如何將上層中的資料置換出去?什麼方法好。這就是替換策略的問題。

  • 3.更新問題:在需要寫訪問時,何時將上層中得到的結果寫到下層儲存器中? 因為上層資料在經過運算後比下層的資料新,則這種寫的方式就是為了解決上下層資料一致性的問題。

本章的內容就是圍繞著這三個問題的解決而展開的。解決好這三個問題,層次化儲存體系管理的主要問題也就解決了。

三、高速緩衝儲存器(Cache)

這一節的內容就是講述關於Cache快取記憶體如何解決上述三個問題展開的內容,其他各層的管理基本上與它的解決辦法類似。

快取記憶體是位於CPU和主存之間的高層儲存子系統。採用快取記憶體的主要目的是提高儲存器的平均訪問速度,從而使儲存器的速度也CPU的速度相匹配。

1、Cache的基本工作原理和結構

Cache通常由兩部分組成,塊表快速儲存器。Cache的基本結構可見教材圖7.4,其工作原理是:處理機按主存地址訪問儲存器,儲存器地址的高段通過主存-Cache地址映象機構藉助查表判定該地址的儲存單元是否在Cache中,如果在,則Cache命中,按Cache地址訪問Cache。否則,Cache不命中,則需要訪問主存,並從主存中調入相應資料塊到Cache中,若Cache中已寫滿,則要按某種演算法將Cache中的某一塊替換出去,並修改有關的地址映象關係。

從這個工作原理我們可以看出,它已經涉及到了兩個問題。首先是定位、然後是替換的問題。

Cache的存在對程式設計師是透明的。其地址變換和資料塊的替換演算法均由硬體實現。通常Cache被整合到CPU內以提高訪問速度。

2.下面就要展開來講述Cache中是如何進行地址映象和變換的。

因為處理機訪問都是按主存地址訪問的,而Cache的空間遠小於主存,如何知道這一次的訪問內容是不是在Cache中,在Cache中的哪一個位置呢? 這就需要地址映象,即把主存中的地址對映成Cache中的地址。讓Cache中一個儲存塊(空間)與主存中若干塊相對應,如此,訪問一個主存地址時,就可以對應地知道在cache中哪一個地址了。地址映象的方法有三種:直接映象、全相聯映象和組相聯映象。

直接映象就是將主存地址映象到Cache中的一個指定地址。任何時候,主存中儲存單元的資料只能調入到Cache中的一個位置,這是固定的,若這個位置已有資料,則產生衝突,原來的塊將無條件地被替換出去。

全相聯映象就是任何主存地址可映象到任何Cache地址的方式。在這種方式下,主存中儲存單元的資料可調入到Cache中的任意位置。只有在Cache中的塊全部裝滿後才會出現塊衝突。

組相聯映象指的是將儲存空間的頁面分成若干組,各組之間的直接映象,而組內各塊之間則是全相聯映象。

下面將三種地址映象方式進行對比。

直接映象 全相聯映象 組相聯映象
過程 (1)主存地址分成區號、塊號、塊內地址
(2)在主存地址中擷取與Cache地址對就部分作為Cache地址
(3)以塊號為地址訪問目錄表讀出區號與主存地址中區號比較
(4)若相等,命中
(5)若不相等,塊失效,停止Cache訪問。訪主存,並調塊
(1)主存地址分成主存塊號和塊內地址
(2)用主存塊號同目錄表相聯比較
(3)若相同,則取出Cache塊號,Cache塊號與塊內地址拼接成Cache地址,訪問Cache
(4)若無相同的,則產生缺塊、調塊
(1)主存地址分割槽號、組號、塊號、塊內地址
(2)用組號選出一組
(3)對該組用區號+塊號全相聯比較
(4)或找不到,則塊失效
(5)若找到一樣,則將讀出的Cache塊號與組號和塊內地址拼接形成Cache地址。
目錄表 長:Cache大小
寬:主存地址位-Cache地址位
長:Cache 大小
寬:(主存塊號+Cache塊號)位
主存塊號位參與比較
長:2ncbCache大小
寬:(區號+2塊號)位
(區號+塊號)位參與與比較
優點 (1)硬體省,目錄表小,成本低
(2)訪問Cache與訪問區號表同時進行
(1)塊衝突最低
(2)Cache空間利用率最高
集中全相聯和直接映象的優點彌補他們的缺點
缺點 (1)塊衝突概率很大
(2)Cache空間利用率很低
(1)映象表太長
(2)查錶速度慢
塊衝突仍大於全相聯
利用率低於全相聯
目錄表大於直接方式

3.替換策略及更新主存策略

Cache從主存讀取資料塊時有三種方式:需要時讀取、預讀取和選擇讀取。這三種方式各有優缺點,請注意比較。課本中提到"共享的資料放在主存中比放在Cache中合適,特別是在多處理機系統中",因為共享的資料經常由別的處理過程改寫,若放到cache中,則經常涉及到資料的一致性問題,因此放在主存中可保證其單一性,不致發生資料一致性錯誤的問題。

在層次式的儲存體系中,訪問某層儲存器的內容時將從該層取資料塊層層複製到上層儲存器中,而上層的儲存器容量總比下層的少,則在複製到上層時,就會發生替換掉原有資料塊的問題。若被替換的塊中有新寫入的資料(如計算結果)則這些資料還得先寫到下層儲存器的相應塊中,這就涉及更新策略。

直接映象方式下,不存在塊替換的演算法,因為每一塊的位置映象是固定的,需要哪一塊資料就可直接確定地將該塊資料調入上層確定位置。而其他兩種映象就存在替換策略的問題,就是要選擇替換到哪一個Cache塊。即替換演算法。

選擇替換演算法的依據是儲存器總體效能,主要是上層儲存器的訪問命中率。下面將常用的幾種替換演算法作一比較:

思想 優點 缺點
隨機演算法RAND 用軟的或硬的隨機數產生器產生上層中要被替換的頁號 簡單、易於實現 沒有利用上層儲存器使用的"歷史資訊",沒有反映等程式區域性性,命中率低。
先進先出FIFO 選擇最早裝入上層的頁作為被替換的頁 實現方便,利用了主存歷史的資訊 不能正確反映程式區域性性原理,命中率不高,可能出現一種異常現象。
近期最少使用法LRU 選擇近期最少訪問的頁作為被替換的頁 比較正確反映程式區域性性,利用訪存的歷史資訊,命中率較高 實現較複雜
優化替換演算法OPT 將未來近期不用的頁換出去 命中率最高,可作為衡量其他替換演算法的標準 不現實,只是一種理想演算法

對於塊的替換策略,要掌握FIFO特別是LRU演算法的替換過程,能畫出其分配情況的表並作分析。

為了保持Cache中資料和主存中資料的一致性,就要對Cache和主存的資料進寫操作,一般的更新策略有兩種:

更新策略 思想 優點 缺點
寫回法 是指在CPU執行寫操作時,資訊只寫入Cache中,僅當需要替換時,才將改寫過的Cache塊先送回主存(寫回),然後再調塊 有利於省去許多將中間結果寫入主存的無謂開銷。 需設修改位增加Cache的複雜性
全寫法(寫直達法) 在寫操作時,將資料同時寫入Cache和主存 實現開銷小、簡單 為了寫中間結果浪費了不少時間

另外,當寫不命中時(也就是寫Cache塊時,這塊早被人替換出去而在Cache中找不到時)是不是要把這塊再取回Cache中,有兩個解決方法:一是不按寫分配法,就是直接寫到主存裡,不再把該地址對應的塊調回Cache中.二是按寫分配法,就是寫到主存,而且把這一塊從主存中調入到Cache.一般寫回法用按寫分配法,全寫法則採用不按寫分配。

4.資料Cache、指令Cache和一體化Cache

將Cache分別用來存放資料和指令,則可分成上面兩種Cache,一體化Cache則既存放資料又存放指令。一般來說,分離後的Cache命中率有所提高。

5.Cache的效能分析(簡單應用)

Cache的命中率對計算機速度的影響很大。實踐證明,Cache的尺寸越小,地址映象方法和替換策略對命中率的影響越大。

在組的大小一定情況下,Cache的容量越大則命中率越高。
當Cache的大小確定時,組的大小或塊的大小將影響不命中率,由於塊的內部是全相聯的,因此塊越大則命中率越高。

我們知道,衡量儲存系統的速度效能要以平均訪存時間為指標,計算平均讀訪存時間的公式為:

Ta=HcTc+(1-Hc)Tm
其中Hc是指命中率,Tc是命中時訪問時間,Tm為訪主存時間。若是多層Cache也可按此公式推出計算方法。即上層的儲存器命中時間加上不命中時訪問下層儲存器的時間。

四、主儲存器頻寬拓寬方法

前面我們學了層次儲存體系中的高層儲存器Cache,現在討論主存。

儲存器的主要效能指標是容量、速度和價格.儲存器的速度指標包括訪問時間、訪存週期時間和頻寬。提高主存頻寬的措施主要有:

  • 1.增加儲存器的資料寬度。(也就是增加資料位數)

  • 2.採用儲存器的多體交叉技術。

儲存器的多體交叉是提高其資料頻寬的有效方法。這裡用我自己的理解解釋一下高位交叉儲存器和低位交叉儲存器:

  我們知道,儲存器的每個儲存單元都要給定一個地址才能被訪問到。並行儲存器是由多個儲存體組成,並行存取可以加快存取速度,但是這和編址方法有關。

   比如主存空間有8個儲存單元(2的3次方,設得小一些好懂些,實際上的單元數比這大得多),那麼整個儲存空間地址就由一組3位二進位制陣列成:從000到111, 如果這個空間用兩個儲存體實現,有兩種編址方法。

   一種是"高位交叉"編址,就是把地址的碼的前一位數分配給兩個儲存體,第一個為0,第二個為1(如果有四個儲存體的話,就要分給前面的兩位數,依次類推)第一個儲存體裡面的單元就是以這個碼開始的編碼:000,001,010,011 (看到第一位數都是0了嗎);第二個儲存體的儲存單元的四個地址是:100,101,110,111。
這樣,當訪問兩個地址相鄰儲存單元的資料時,比如110和111兩個單元的資料,都放在第二個儲存體中,只能在這個體中存取,而第一個儲存體就閒著沒人訪問了。而一般在存放資料時,多是將資料存放在地址連續的記憶體區域中的。現在可以知道了,為什麼高位交叉編址的儲存器適合於多機系統,就是說,因為各處理機通常訪問各自所需的資料,這些資料放在不同的儲存體中時,兩個儲存器可以同時工作,也就加快了速度。

   另一種方法就是低位交叉編址。如上的例子,地址碼的最後一位就是分配給儲存體的地址碼,第一個儲存器裡的儲存單元就是000,010,100,110(最後一位總是0), 第二個儲存器裡的儲存單元就是001,011,101,111,這種方法使得相鄰地址的儲存單元分佈在不同的儲存體中,所以在訪問相鄰單元的資料時,多個並行儲存體可以同時工作進行存取,因此比較適於單處理機內的高速資料存取。

增加儲存器資料寬度的方法也是拓寬頻寬的方法,一般採用單體多字方法。多體交叉的儲存器的實際頻寬比單體多字的高。

五、虛擬儲存器

虛擬儲存器是主存的擴充套件,虛擬儲存器的空間大小取決於計算機的訪存能力而不是實際外存的大小,實際儲存空間可以小於虛擬地址空間。從程式設計師的角度看,外存被看作邏輯儲存空間,訪問的地址是一個邏輯地址(虛地址),虛擬儲存器使儲存系統既具有相當於外存的容量又有接近於主存的訪問速度。

虛擬儲存器的訪問也涉及到虛地址與實地址的映象、替換演算法等,這與Cache中的類似,前面我們講的地址映象以塊為單位,而在虛擬儲存器中,地址映象以頁為單位。設計虛擬儲存系統需考慮的指標是主存空間利用率和主存的命中率。

虛擬儲存器與Cache儲存器的管理方法有許多相同之處,它們都需要地址映象表和地址變換機構。但是二者也是不同的,請注意比較。

虛擬儲存器的三種不同管理方式:按儲存映象演算法,分為段式、頁式和段頁式等,這些管理方式的基本原理是類似的。

段式管理:把主存按段分配的儲存管理方式。它是一種模組化的儲存管理方式,每個使用者程式模組可分到一個段,該程式模組只能訪問分配給該模組的段所對應的主存空間。段長可以任意設定,並可放大和縮小。

系統中通過一個段表指明各段在主存中的位置。段表中包括段名(段號)、段起點、裝入位和段長等。段表本身也是一個段。段一般是按程式模組分的。

頁式管理:是把虛擬儲存空間和實際空間等分成固定大小的頁,各虛擬頁可裝入主存中的不同實際頁面位置。頁式儲存中,處理機邏輯地址由虛頁號和頁內地址兩部分組成,實際地址也分為頁號和頁內地址兩部分,由地址映象機構將虛頁號轉換成主存的實際頁號。

頁式管理用一個頁表,包括頁號、每頁在主存中起始位置、裝入位等。頁表是虛擬頁號與物理頁號的對映表。頁式管理由作業系統進行,對應用程式設計師的透明的。

段頁式管理:是上述兩種方法的結合,它將儲存空間按邏輯模組分成段,每段又分成若干個頁,訪存通過一個段表和若干個頁表進行。段的長度必須是頁長的整數倍,段的起點必須是某一頁的起點。

目前作業系統一般都採用段頁式管理。下面將三種管理方式作一比較:

段式管理 優點 缺點
地址變換過程 多使用者(模組)地址可分成:程式號、段號、段內偏移量三部分,地址變換過程如下:
(1)由程式號找到相應的段表基址暫存器,其中存有段表始址和段表長度。
(2)由段表長度與段號相比較,檢查是否越界。正常轉(3)
(3)段表始址和段號找到其段表中相應表項,其中存有主存地址,裝入位,訪問位、段長、輔存地址等。
(4)檢查裝入位是否為"1"(在主存),為"1"轉(5),否則產生缺段中斷,從輔存中調入一段到主存。
(5)由主存地址+段內偏移形成真正實體地址。
(1)多個程式分段編制,多個程式或並行程式設計,縮段程式設計時間;
(2)各段相對獨立,其修改、擴充都不會影響其他段;
(3)實現虛擬儲存;
(4)便於共享和保護。
(1)分段管理主存,主存利用率不是很高,大量零頭;
(2)為形成一次有效地址,需多次訪存,降低了訪存速度;
(3)分配和回收空閒區比較複雜;
(4)段表中地址欄位和段長欄位較長,降低查錶速度。
頁式管理 使用者邏輯地址分成:使用者標誌、使用者虛頁號、頁內偏移三部分。過程如下:
(1)由使用者標誌找到相應頁表基址暫存器,其中有頁表地址。
(2)由頁表始址和頁號找到頁表中相應表項。
(3)檢查裝入位是否"1"(在主存),為'1'轉(4)否則產生缺頁中斷。
(4)由主存塊號和頁內偏移形成有效地址。
(1)頁表表項短,減少訪表時間。
(2)零頭較少。
(3)調入速度快。
(1)強制分頁,頁無邏輯意義,不利於儲存保護和擴充。
(2)一次有效地址生成需多次訪存,訪存速度下降。
段頁式管理 使用者邏輯地址被分成:使用者標誌、段號、頁號、頁內偏移四部分。過程如下:
(1)由使用者標誌找到段表基址暫存器。
(2)段表長與段號作是否越界檢查。
(3)段表始址+段號找到段表中相應表項。
(4)做裝入位、段長的檢查。
(5)由頁表始址+頁號找到頁表中相應表項。
(6)作裝入位等檢查。
(7)實頁號+頁內偏移形成有效地址。
具有段式、頁式的優點 一次有效地址形成需3次訪存,速度較慢。

請注意對照課本上各管理方法示意圖進行理解。

頁式虛擬儲存器結構及其實現:主要要解決的問題是頁面失效的處理及虛地址到實地址的變換速度。另外還有虛擬儲存器的保護問題。

虛擬儲存器中進行地址變換時,需要虛頁號變換成主存中實頁號的內部地址變換,這一般通過查內頁表實現,若頁頁失效,還需通過查外頁表變換地址再從外存調入頁面。 所以提高頁表的訪問速度是提高地址變換速度的關鍵。根據訪存的區域性性原理,將一部分使用概率高頁表項放在快速硬體構成的表格中,而將整個表格放在主存中,這就引出了快表和慢表的概念。查表時,快表和慢表同時進行查詢。快表的存在對所有的程式設計師都是透明的

·對於多道程式系統和多使用者系統,虛存的保護是必不可少的。儲存系統的保護分儲存區域的保護和訪問方式的保護。對虛擬儲存器的保護方式有映象表保護法、鍵保護法和環式保護法等。