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


第三章 存儲器的層次結構

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通過頁表訪問輔存時,發現缺頁中斷,就會先暫停程序的執行,先把數據調到內存

  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,因此選擇最高層。

  1. 半導體存儲芯片的譯碼方式:
    (1)線選法:每個小存儲單元占用一行,構成多行的線性結構
           每個小存儲單元占用一行,構成多行的線性結構
           eg:16*1 bit的存儲矩陣,占16行,因為要選擇16行,所以要有4位片選線,鏈接所有的16個存儲單元。
           這種設計導致電路設計異常復雜。
    (2)重合法 : 組合多個存儲單元為一行
           通過組合多個存儲單元為一行,來減少行數,達到減少片選線位數的目的,簡化電路設計。但此時的存儲矩陣,每行有多列存儲單元,因此,用X地址譯碼器(確定行),用Y地址譯碼器(確定列),來選到具體的某個存儲單元。
           eg:256 * 1bit重合片選法:把8個bit存儲單元作為一行,設計32行即可。
                  因為有32行,因此X地址譯碼器有5位,因為有8列,因此Y地址譯碼器有3位
           image.png-12.2kB

3.3 半導體隨機存儲器

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

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

(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個讀寫時間,為2
0.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM