計算機組成原理(三)--存儲器的層次結構

第三章 存儲器的層次結構

3.1 存儲器分類

  1. 按存儲介質分類
    (1)半導體存儲器:
            TTL,MOS,SSD。
            易失
    (2)磁表面存儲器:
            磁頭,載磁體
            非易失
    (3)磁芯存儲器:
            硬磁材料,環狀元件
            非易失
    (4)光盤存儲器:
            激光,慈光
            非易失程序員

  2. 按存取方式
    (1)存取時間與物理地址無關 (隨機存取
            類比於數據結構中的線性表數組(取數組某個元素的時間和物理地址無關,只和index有關)
            (a)隨機存儲器:程序執行過程當中可讀可寫
            (b)只讀存儲器:程序執行過程當中只讀
    (2)存取時間與物理地址有關(串行訪問
            類比於數據結構中的鏈表
            (a)順序存取存儲器:磁帶
            (b)直接存取存儲器:磁盤(根據物理地址,直接移動磁頭)算法

  3. 按在計算機中的做用分類
    (1)主存
            (a)RAM:操做系統被加載到RAM
                    SRAM:(Static Random Access Memory)靜態隨機存儲器。經常使用製做二級緩存。
                                    沒必要刷新電路就能保存數據。但體積大,集成度低
                    DRAM:(Dynamic Random Access Memory)動態隨機存取存儲器。經常使用語製做系統內存
                                    DRAM用電容存儲數據,須要定時充電,刷新電路,不然出處的數據丟失。集成度高
            (b)ROM:存儲機器自檢和引導程序,BIOS等程序
                    MROM:(Mask Read-Only Memory)掩模式只讀存儲器。MROM的內容在出廠前一次寫入,以後不能更改
                    PROM:(Programmable Read-Only Memory)-可編程只讀存儲器。只能寫入一次數據的只讀存儲器,寫入錯誤只能更換存儲芯片
                    EPROM:(Erasable Programmable Read Only Memory)可擦除可編程只讀寄存器
                    EEPROM: (Electrically Erasable Programmable Read-Only Memory),電可擦可編程只讀存儲器。SSD
    (2)輔存
            磁盤,磁帶,光盤編程

3.2 存儲器的存儲結構

  1. 存儲結構綜述
    (1)cpu只能和主存,cache進行數據交互,而不能直接得到輔存的數據
    (2)輔存的數據只能調入主存,不能直接進入緩存中。
    (3)輔存到主存的映射是由OS操做系統管理的。可是主存和輔存之間的一個映射關係被放到TLB中,TLB在cache中。
    (4)虛擬存儲中的頁表,段表,段頁表被放到了主存中。cpu經過頁表訪問輔存時,發現缺頁中斷,就會先暫停程序的執行,先把數據調到內存windows

  2. 主存
    (1)主存的基本結構
    image.png-9.5kB
    (2)主存和CPU的聯繫
         image.png-5.4kB
  3. 主存中存儲單元地址的分配
    (1)尋址的個數有2個因素:
           (a)地址線的個數:這是內存中總的可尋址字節數
           (b)一個地址所佔用的字節數:代表了一個內存單元,佔用多少個字節
    (2)\(\frac{內存可尋址的總字節數}{多少字節造成一個內存單元} = 可尋址數\)
    (3)eg:地址線24根,按字節尋址,可尋址\(2^24 = 16M\)
                   若字長爲16位,按字尋址,可尋址8M個
                   若字長爲32位,按字尋址,可尋址4M個數組

  4. 主存的指標
    (1)存儲容量:存放二進制代碼的總位數
    (2)存取速度:
           存取時間:存儲器的訪問時間(讀出時間,寫入時間)
           存取週期:連續兩次獨立的讀寫存儲器操做之間,最小的時間間隔。用於讀電路,寫電路,地址電路清空一次
    (3)存儲器帶寬 (位/秒)緩存

  5. 半導體存儲片的基本結構
    image.png-12.5kB
    (1)地址線單向,數據線雙向。
    (2)半導體芯片的容量由地址線和數據線一塊兒決定。
           地址線和數據線的根數表示了內存實際的大小,而cpu理論上的最大尋址範圍,由MAR和MDR的大小決定,爲\(2^{MAR}*MDR\)
    |地址線|數據線|芯片容量|
    |:---------:|:-------:|:-------:|
    |10根|4根|\(2^{10} * 4\)bit|
    |14根|1根|\(2^{14} * 1\)bit|
    (3)片選線的做用
           eg:用16K1位的存儲芯片組成64K8位的存儲器
           (a)由於半導體芯片是用存儲矩陣設計的,存儲矩陣的一行能夠當作一層樓,這層樓有多個小房間。
                    所以,先把8個161K的存儲器放在一行,構成一層樓。再安排4層這樣的樓層,構成64K8的大樓
           (b)由於,一個地址線的地址過來後,先經過片選線(地址爲的最高几位),選擇樓層,
                    而後用剩下的地址線低位地址,選擇是樓層的那個房間
           (c)eg:當上例子中,地址線過來的數據是65535,轉換成二進制是1111 1111。
                    上面樓層有4層,因此地址線的前兩位進行片選,也就是11,所以選擇最高層。數據結構

  6. 半導體存儲芯片的譯碼方式:
    (1)線選法:每一個小存儲單元佔用一行,構成多行的線性結構
           每一個小存儲單元佔用一行,構成多行的線性結構
           eg:161 bit的存儲矩陣,佔16行,由於要選擇16行,因此要有4位片選線,連接全部的16個存儲單元。
           這種設計致使電路設計異常複雜。
    (2)重合法 : 組合多個存儲單元爲一行
           經過組合多個存儲單元爲一行,來減小行數,達到減小片選線位數的目的,簡化電路設計。但此時的存儲矩陣,每行有多列存儲單元,所以,用X地址譯碼器(肯定行),用Y地址譯碼器(肯定列),來選到具體的某個存儲單元。
           eg:256
    1bit重合片選法:把8個bit存儲單元做爲一行,設計32行便可。
                  由於有32行,所以X地址譯碼器有5位,由於有8列,所以Y地址譯碼器有3位
           image.png-12.2kBdom

3.3 半導體隨機存儲器

  1. SRAM
    (1)SRAM:靜態隨機存儲器,不用刷新電路,使用雙穩態管存儲數據,不掉電狀況下數據存在。
    (2)SRAM基本電路異步

  2. DRAM
    (1)DRAM:動態隨機存儲器,定時刷新電路,使用電容存儲數據,不掉電狀況下也須要定時對電容充電。
    (2)DRAM的存儲矩陣是二維的,有行有列。因此要對行和列進行片選。行列片選的片選片進行復用,即同一個針腳,先選擇行,後選擇列。
    (3)動態RAM刷新 (刷新與行地址有關:默認數據能保持2ms)ide

    (a)集中刷新(存取週期0.5\(\mu s\))
    集中刷新是一次刷新存儲矩陣中全部的存儲單元。即,在數據能保持的這2ms內,分爲能讀寫的週期時間,和不能讀寫的電路刷新時間。這個刷新時間,也稱爲"死區「。電路刷新,一次刷新存儲矩陣的1行,這個刷新一行的時間等於一個存取週期
    eg:當存儲矩陣爲128128,存取週期爲0.5\(\mu s\)時,刷新時間=128 0.5 = 64\(\mu s\),即死區時間佔64\(\mu s\),其死區時間率爲\(\frac{64}{2000} = 3.2%\)
    (b)分散刷新(存取週期爲1\(\mu s\)
    分散刷新是,在每次讀寫數據後,馬上刷新改行存儲矩陣。即一個存取週期=讀寫時間+電路刷新時間。而讀寫時間等於電路刷新時間,因此,1個存取週期等於2個讀寫時間,爲20.5=1\(\mu s\)
    分散刷新不存在死區,可是使得一次存取時間變成原來的2倍
    (c)異步刷新
    異步刷新不在一次刷新全部行,也再也不每次讀寫後馬上刷新,而是保證在2ms內,每一行獲得刷新便可。因此其死區時間爲0.5\(\mu s\)。若是將刷新安排在指令譯碼階段,則不會有死區時間(指令譯碼階段,不產生cpu去內存的io)
    eg:對於128
    128的存儲矩陣,把2ms平均到每行爲2/128=15.6\(\mu s\),即每隔15.6\(\mu s\)順着存儲矩陣的行編號,向下個編號刷新。

3.4 主存與CPU的鏈接

  1. 存儲容量的擴展
    (1)位擴展
         用2片1K4位存儲芯片組成1K8位存儲器
         位擴展沒有增長房間號,只是房間裏面多住人了。即地址線不變,增長數據線,其餘沒變化
    (2)字擴展(增長存儲字的數量)
    用1K8位存儲芯片組成2K8位的存儲器:原來的1K字即10根地址線,變成如今的2K即11根地址線,多出來的1根地址線用來進行片選。
    image.png-118.6kB
    (3)字位擴展
    用8片1K4位的存儲芯片組成4K8位的存儲器。即地址線先擴展4位成\(D_0到D_7\),而後地址線由原來的10根擴展成12根,新增的2根進行限片選,一次選擇2個芯片。此時的片選線變成片選譯碼器
    image.png-286.7kB

  2. 存儲器與CPU的鏈接
    (1)地址線的鏈接:先鏈接芯片固有的
    (2)數據線的鏈接:先鏈接芯片固有的
    (3)讀寫控制線的鏈接:每一個芯片都要鏈接,包括增長的
    (4)片選線的鏈接:用增長的地址線進行片選線
    (5)芯片選擇:選擇芯片數量組少的解決方案
    eg:設CPU有16根地址線,8根數據線。現有如下幾種存儲芯片:1K4位RAM,4K8位RAM,8K8位RAM,
    2K
    8位ROM,4K8位ROM,8K8位ROM,和74138譯碼器。請畫出CPU和存儲器的鏈接圖。要求:
    主存地質分配以下:6000H~67FFH爲系統程序區。6800H~6BFFH爲用戶程序區。
    (1) 寫出地址對應的二進制碼
    image.png-22.2kB
    所謂系統存儲區,指的是單片機中存儲系統程序的那部分芯片,一般被燒製在ROM裏,而用戶程序是單片機中跑的程序,運行在RAM中。如上圖所示,應該選擇1片2K8位ROM,和2片1K4位RAM。
    (2)分配地址線:
         \(A_{0}~A_{10}\)地址線鏈接ROM,
         \(A_{0}~A_{9}\)地址線鏈接RAM
    (3)肯定片選片信號
         如上圖,只有1片ROM,並且2片RAM是位擴展,不會引發片選,因此只要區分RAM和ROM便可。如圖發現,\(A_{12},A_{11},A_{10}\)便可區分ROM和RAM.所以這3位地址線成爲片選線。

3.5 雙口RAM和多模塊存儲器 -- 提升訪存速度的手段

  1. 單體多字系統
    (1)把原來的單字長寄存器改變爲多字長的寄存器,使得內存一次能夠讀出多個字。從而增長訪存速度
    (2)這種設計實際上不存在,由於多字長在跳轉指令時會產生順序讀取的數據無效,下降效率

  2. 雙口RAM
    (1)雙口RAM是含有兩套相互獨立的讀寫控制電路而得名。同時進行2次獨立的讀寫操做,因此會增長存儲器
    (2)當兩套讀寫電路同時操做同一塊內存地址時,會產生寫衝突。所以,增長一個busy標誌(低電平)

  3. 多體並行 - 高位交叉,順序編址
    (1)多體並行是編址方式的一種轉變。存儲矩陣有多個行,每一個行成爲一個體。
    (2)高位交叉編址的意思是:用地址的高位表示是哪一個體。因此4體高位交叉編址就變成了高位分別爲00,01,10,11$,低位做爲體內地址。所以造成順序編址。
    image.png-7.6kB

  4. 多體並行 - 低位交叉編址,各體輪流編址
    (1)低位爲體號,高位爲體內地址。正好使得連續地址分佈在不一樣的體
    image.png-7.8kB
    (2)低位交叉編制,使得讀取連續地址的數據時,採用流水線方式:
         流水線爲2步,分爲通知體傳輸和體傳輸時間。
         通知體的時間爲cpu發出信號到體的時間,即總線傳輸時間。體傳輸時間爲體讀取數據的時間。
         爲了使流水線能夠對齊,要求1個存取週期內,正好通知到全部體,因此存取週期爲體數的整數倍。
         eg:設4體交叉存儲器,存取週期爲T,總線傳輸週期爲\(\tau\),則爲實現流水線存取方式,應知足\(T = 4\tau\)。由於每一個體的存取週期爲n\(\tau\),最後一個體用一個\(\tau\)的時間在T內,因此總的傳輸時間爲T+(n-1)\(\tau\)
    image.png-6.2kB

  5. 高性能存儲芯片
    (1)SDRAM(同步DRAM):系統時鐘控制下進行讀出和寫入,CPU無需等待
    (2)RDRAM:由Rambus開發,解決存儲器帶寬問題
    (3)帶cache的DRAM:在DRAM的芯片中集成了一個由SRAM組成的cache

3.6 高速緩衝存儲器Cache

  1. cache工做原理
    (1)主存單位稱爲塊,cache稱爲行,實質是一個東西
    (2)CPU讀主存時,把地址同時送給cache和主存,cache經過地址查看此字是否在cache中,若在則當即傳送給cpu。
    若不在,則用主存讀週期把此字從主存中讀出送到cpu,與此同時,把含有此字的整個數據塊從主存讀出送到cache的行中

  2. cache與內存的映射關係(讀方式)
    (1)全關聯:full associative cache
         將內存也當作line的方式存儲,全關聯是指,內存的任意一個line能夠映射到cache中的任意一個line。
         全相連映射的主存地址分爲2部分:主存塊號|字塊內地址;cache標記位爲主存地址除了字塊內地址的所有高位。
         這就須要一個表,記錄主存塊號到cache行號的映射
         這種方式,在查找內存是否在cache中時,要查找全部的tag。 並且查表的比較器很難實現
    (2)直接映射:Direct Associated Cache
         將內存按照cache大小劃分爲n個Page,內存中Page的line0對應cache的line0。所以直接映射下,cache標誌位標誌的是內存的page號。
         另外一種理解方式:主存中的幾個特定行,映射到cache的一個特定行。多對一的關係。這種關係知足公式 i = j mod c
         其中,i:cache行的行號。j:主存塊的塊號。c:cache的行數。標誌位=j/c向下取整
         直接映射至關於多體高位交叉順序編址。體至關於整個cache,主存包含多個體。採用順序編址,使得主存地質分紅三部分: 體號(第幾個cache)|cache塊號|塊內地質。因此cache把主存中的最高几位(cache體號)做爲標記位
         當剛好訪問的幾個主存地質,映射到了相同的cache行,就會產生抖動
    (3)組相聯:Set Associated Cache
         i. 組相聯映射把cache劃分爲過個way,每一個way的結構同樣。內存按照way的大小劃分Page,page間採用直接映射方式,page內採用全相聯映射方式 。
    即:page號到組號的映射關係是多對一且固定的。
    u爲cache的way個數,v爲way中的行數 。 v路組相聯:把幾行做爲一個way
    這種方式,把主存地址分爲3部分:主存自塊標記|組內地址(不用有way號,由於是映射出來的)|字內地址。分別對應cache的標記位,way內的行號
         ii. c64+DSP的配置中,L1P使用1個way,L1D使用2個way,L2不區分程序和數據,使用4個cache way

    eg:假設主存的容量爲512K16位,cache容量爲409616位,塊長爲4個16位字,訪存地址爲字地址。
    (1)直接映射下,設計主存地址格式:
    解:直接映射是主存的每塊映射到cache的固定塊。因此,主存地址應包含cache塊號的標記。
    由於按字編址,每一個字爲16位,因此主存地址容量爲\(2^{19}\),cache容量爲\(2^{12}\)。因此主存地址爲19位,cache地址爲12位。由於每塊4個字,因此快內地質佔2位。cache塊號佔10位,主存地址的剩餘7位爲標記位
    tag爲(7)|cache塊號(10)|cache快內地址(2)
    (2)全相連方式下,主存地址的設計
    解:全相聯方式下,主存任意一塊能夠映射到cache任意一塊,因此主存地址脂粉味2部分,tag和快內地址。
    快內地址佔2位,tag佔17位
    (3)二路組相聯模式下,主存地址的設計
    二路組相聯模式下,每個分組有2行,快內地址佔1位,因此有\(2^{12}/2/2=2^{9}\)個分組,因此組號佔9位。剩下tag位佔19-9-2=8位

3.7 虛擬存儲器

一. 頁式虛擬存儲

  1. 概念
    (1)程序員在比實際主存大得多的邏輯地址空間中編寫程序
    (2)程序執行時,把當前須要的程序段和數據塊掉入主存,其餘暫不使用的放在磁盤上
    (3)執行指令時,經過硬件將邏輯地址轉化爲物理地址。虛擬地址高位爲虛頁號,低位爲頁內偏移地址
    (4)當程序發生數據訪問或程序訪問失效(缺頁時),由操做系統把信息從磁盤調入主存中

  2. 分頁
    (1)基本思想:
    內存被分紅固定長度且長度較小的存儲塊(頁框,實頁,物理頁)
    每一個進程也被劃分爲固定長度的程序塊(頁,虛頁,邏輯頁)
    經過頁表,實現邏輯地址想物理地址的轉化
    (2)邏輯地址
    程序中指令所使用的地址(進程所在地址空間)
    (3)物理地址
    存放指令或數據的實際內存地址

  3. 「主存-磁盤」層次
    (1)與「cache-主存」層次相比,頁大小遠比cache的行大小要大(windows中的頁位4k)
    (2)採用全相聯映射方式:磁盤中的任意一個頁能用射到內存中的任意一個頁
    由於缺頁致使中斷時,操做系統從磁盤拿數據一般要耗費幾百萬個時鐘週期。增大頁大小,能夠減小缺頁中斷
    (3)爲何讓軟件處理「缺頁」
    由於訪問磁盤須要好粉幾百萬個時鐘週期,硬件即便能馬上把地址打給磁盤,磁盤也不能當即響應
    (4)爲何地址轉換用硬件實現
    硬件實現地址轉換能夠加快指令的執行速度
    (5)爲何頁寫會策略採用write back
    避免頻繁的慢速磁盤訪問

  4. 頁表結構
    頁表的首地址放在基址寄存器。採用基址尋址方式
    每一個頁表項前面有一個虛頁號:從0開始遞增的序號。頁表項又分爲幾個結構:
    (1)裝入位:該頁是否在內存中
    (2)修改位:該也在內存中是否被修改
    (3)替換控制位:用於clock算法
    (4)其餘
    (5)實頁號(8進制)

  5. TLB
    (1)一次磁盤引用須要訪問幾回主存?2次,一次查頁表,一次查物理地址。因而,把常常查的頁表放到cache中。這種在cache頁表項組成的頁表稱爲TLB(Translation Lookside Buffer)
    (2)TLB的頁表結構:tag + 主存中的頁表項
    當採用全相連映射時,tag爲頁表項前面的虛頁號。須要把tag和虛頁號一一比較
    當採用組相聯映射時,tag被分爲tag+index,虛頁號的高位爲tag,虛頁號的低位爲index,作組內索引(屬於組內第幾行)

二. 段式虛擬存儲

  1. 段式存儲是根據程序邏輯,給程序分段。使得每段大小不一樣。這種虛擬地址劃分方法適合程序設計
  2. 段式存儲的虛擬地址由段號和段內偏移地址組成。段式虛擬存儲器到物理地址的映射經過段表實現
  3. 段式虛擬存儲會形成空頁

三. 段頁式虛擬存儲

  1. 段頁式虛擬存儲,先把程序按照邏輯分紅段,再把每段分紅固定大小的頁。
  2. 程序對主存的調入調出是按照頁面進行的;但他有能夠根據段實現共享和保護
  3. 缺點是段頁式虛擬地址轉換成物理地址須要查詢2個表:段表和頁表。段表找到相應頁表的位置,頁表找到想也頁的位置
  4. 段頁式細膩地址的結構能夠爲如下形式:
    程序地址: 用戶號(進程pid) | 段號 | 頁號 | 頁內偏移地址

eg:
(1)某計算機的cache塊工16塊,採用二路組相聯映射方式,每一個主存塊大小爲32字節,按照字節編制。則主存129號單元的主存塊硬裝如刀cache的組號是:(C)A、0       B、2       C、4       D、6
解:二路組相聯,因此每組2塊,共有16/2=8組,因此組號佔3位。
      每塊32字節,因此塊內地址佔5位。
      129轉化爲二進制:1000 0001:前3位爲組號,100:=4

(2)假設用若干個2K4位的芯片組成一個8K8位的存儲器,則地址0B1FH所在芯片的最小地址爲
解:用2片組成一行,共4行,因此片選地址佔2位。片內地址有2k=\(2^{11}\),因此佔11位
      0B1FH:000|0 1|011 0001 1111 這三段爲前綴,片選地址,片內地址。
      該片芯片的最小地址是片內地址全0:000|0 1|000 0000 0000 = 0800H

(3)某計算機的主存地址空間大小爲256MB,按字節編址,指令cache和數據cache分離,均有8個cache行,每行大小爲64B,數據cache採用直接映射方式,現有兩個程序A,B對數組int a[256][256]進行遍歷,程序A按行遍歷,程序B按列遍歷。假定int類型數據用32位補碼錶示,數組a按行優先方式存儲,其地址爲320(十進制)。
問:(1) 若不考慮cache一致性維護和替換算法所需的控制位,則數據cache的總容量佔多少?
      (2) 數組元素a[0][31]和a[1][1]各自所在主存塊對應的cache行號分別爲多少(cache從0行開始)?
      (3)程序A和B的數據訪問命中率各自爲多少?哪一個程序的執行時間更短?

解:(1) 由於cache的總容量是cache每行的數據存儲大小+tag位+數據是否有效位+其餘一致性控制位。
          主存地址空間256MB,佔28位。直接映射方式,8行,行號佔3位。每行64B,因此塊內地址佔6位,所以,tag佔28-3-6=19位
          每行有一個數據有效位。所以,cache共(19+1+648)8 = 532字節
      (2) 由於int類型佔32位,因此一個int佔4B。a[0][31] = 320 + 314 = 444 a1 = 320 + 4(256+1) = 1348。
          塊內地址佔6位,直接映射下行號佔3位,所以444 = 110 | 111100,因此行號爲6
          1348 = 10 | 101 | 000100,因此行號爲5
      (3) 由於1行cache佔64B,每一個int數佔4B,因此一行有16個數。第一個數會因cache缺失而不命中,而後調入cache。,使得後面的15個int訪問所有命中。因此命中率爲\(\frac{15}{16}\) 對於程序B,每次調入16個數,小於數組每行的128個元素,所以每次都不會命中,命中率爲0

相關文章
相關標籤/搜索