天天看點

Linux第六次學習筆記

存儲器層次結構

  • 存儲器系統是一個具有不同容量、成本和通路時間的儲存設備的層次結構。
  • CPU寄存器儲存着最常用的資料。
  • 主存儲器(簡稱主存)暫時存放存儲在容量較大的、慢速磁盤上的資料。
  • 高速緩存存儲器作為一部分存儲在主存中的資料和指令的緩沖區域。
  • 通路周期由小到大:CPU<高速緩存<主存<磁盤

存儲技術

随機通路存儲器(RAM)

  • 其分為兩類:
    • 靜态RAM(SRAM)
      • 作為高速緩存存儲器
      • 可在CPU晶片上,也可以在晶片下
    • 動态RAM(DRAM)
      • 作為主存以及圖形系統的幀緩沖區
    • SRAM比DRAM更快而且貴。

靜态RAM

  • 其将每個位存儲在一個雙穩态的存儲器單元裡。每個單元是用一個六半導體電路來實作的。
  • 六半導體電路的屬性:它可以無限期地保持在兩個不同的電壓配置或狀态之一。其他任何狀态都不穩定的。可通過p383的倒轉的鐘擺進行了解。
    • 原則上鐘擺可以在垂直的為止無限期地保持平衡,但這種狀态是亞穩态,最細微的擾動都可以破壞它的平衡,而且一旦破壞就無法恢複到垂直的位置。

動态RAM

  • DRAM将每個位存儲為對一個電容的充電。該電容大小非常小,通常大約為30x10-15法拉。
  • DRAM對幹擾非常敏感。當電容的電壓被擾亂後,它就永遠不會恢複了。
  • 暴露在光線下會導緻電容電壓改變。
    • 數位相機的傳感器本質就是DRAM單元的陣列。

兩者的對比

  • 供電狀态下,SRAM保持不變,而DRAM需要重新整理。
  • 存取速度方面,SRAM>DRAM
  • 幹擾敏感度方面,SRAM對諸如光和電噪聲燈幹擾不敏感
  • 半導體使用量方面,SRAM單元比DRAM單元使用更多的半導體,進而密集度低,貴,功耗大。

傳統的DRAM

  • DRAM晶片中的單元(位)被分成d個超單元,每個超單元都由w個DRAM單元組成。一個dxw的DRAM總共存儲dw位資訊。
  • 超單元被組織成一個r行c列的長方形陣列,rc=d。每個超單元有形如(i,j)的抵制,這裡i表示行,j表示列。
  • 選擇行(RAS請求) 選擇列(CAS請求) 通過行列的選擇讀取一個超單元内容。
  • 二維陣列組織的缺點是必須分兩步發送位址,這增加了通路時間。

存儲器子產品

  • DRAM晶片包裝在存儲器子產品中,它是插到主機闆的擴充槽上的。
    • 168個引腳的雙列直插存儲器子產品,它以64位為塊傳送資料到存儲器控制器和從存儲器控制器傳出資料
    • 72個引腳的單列直插存儲器子產品,它以32位為塊傳送資料。

增強的DRAM

  • 快頁模式DRAM(FPM DRAM):允許對同一行連續地通路可以直接從行緩沖區得到服務。例如讀第i行四個超單元,隻需發送第一個RAS/CAS請求,後面跟着三個CAS請求即可。
  • 擴充資料輸出DRAM(EDO DRAM):允許單獨的CAS信号在時間上靠得更緊密一點。
  • 同步DRAM(SD DRAM):用于驅動存儲器控制器相同的外部時鐘信号的上升沿來替代許多這樣的控制信号。
    • 正常的、FPM和EDO DRAM與存儲控制器通信使用一組異步的控制信号。
  • 雙倍資料速率同步DRAM(DDR SDRAM):對SDRAM的一種增強,通過使用兩個時鐘沿作為控制信号,進而時DRAM的速度翻倍。
    • 按照預取緩沖區的大小來劃分:DDR(2位),DDR2(4位),DDR3(8位)
  • Rambus DRAM(RDRAM):它的最大帶寬比DDR SDRAM更高。
  • 視訊RAM(VRAM):用在圖形系統的幀緩沖區中。
    • 與FPM的差別:
      • VRAM的輸出是通過依次對内部緩沖區的整個内容進行移位得到的。
      • VRAM允許對存儲器并行地讀和寫。

非易失性存儲器

  • 易失:如果斷點,DRAM和SRAM會丢失它們的資訊。
  • 非易失性存儲器:即使在關電後,仍然儲存着它們的資訊。
  • ROM(隻讀存儲器):Read-Only Memory,其中有些類型是既可以讀也可以寫的。
    • 按照能夠被重程式設計(寫)的次數和對它們進行沖編輯所用的機制區分:
      • PROM:隻能被程式設計一次。
      • 可擦寫可程式設計ROM(EPROM):允許光到達存儲器,數量級可以達到1000次。
      • 電子可擦除PROM(EEPROM):可以直接在印制電路卡上棉城,數量級可以達到10^5次。
      • 閃存(flash memory):基于EEPROM重要的存儲計數,例如數位相機、手機燈都運用到它。
      • 固态硬碟(SSD):基于閃存的磁盤驅動器,能夠提供相對于傳統旋轉磁盤更快速、更強健和更低能耗的選擇。
  • 存儲在ROM裝置中的程式成為固件

通路主存

  • 資料通過成為總線(bus)的共享電子電路在處理器和DRAM主存之間來來回回。
    • 總線是一組并行地導線,能夠攜帶位址、資料和控制信号。
  • 每次CPU和主存之間的資料傳送通過總線事務來完成的。
    • 讀事務:從主存傳送資料到CPU
    • 寫事務:從CPU傳送資料到主存

磁盤存儲

磁盤構造

  • 磁盤驅動器(磁盤)是由一個或多個疊放在一起的盤片組成,被封裝在一個密封的包裝裡。
    • 每個盤片都有兩面或者成為表面,表面覆寫着磁性記錄材料
      • 每個表面都由一組磁道的同心圓組成。
        • 每個磁道被劃分為一組扇區,扇區之間用一些間隙分隔開。(間隙不存儲資料位,而用來表示扇區的格式化位)
    • 盤片中央由一個可以旋轉的主軸,使得盤片以固定的旋轉速率旋轉。
  • 磁盤制造商用柱面來描述多個盤片驅動器的構造。
  • 旋轉磁盤與固态磁盤是兩種不同的工作方式

磁盤容量

  • 一個磁盤上可以記錄的最大位數成為它的最大容量,簡稱容量。
    • 由一下技術因素決定
    • 記錄密度
    • 磁道密度
    • 面密度
  • 計算公式: 磁盤容量=(位元組數/扇區)(平均盤區數/磁道)(磁道數/表面)(表面數/盤片)(盤片數/磁盤)
  • 對于與DRAM和SRAM容量相關的計量機關:K=2^10 M=2^20 G=2^30 T=2^40
  • 對于磁盤和I/O裝置容量相關的伎倆機關:k=10^3 M=10^6 G=10^9 T=10^12(位元組)

磁盤操作

  • 磁盤用讀/寫頭來讀寫存儲在磁性表面的位
  • 讀寫頭連接配接到一個傳動臂的一端來尋道
  • 對扇區的通路時間由三個主要部分:p392
    • 尋道時間
    • 旋轉時間
    • 傳送時間

邏輯磁盤塊

  • 磁盤控制器:維護着邏輯塊号和實際磁盤扇區之間的映射關系
  • 當作業系統想要執行一個I/O操作時,作業系統會發送一個指令到磁盤控制器,讓它讀某個邏輯塊号。控制器上的固件執行一個快速表查找,将一個邏輯塊号翻譯成一個(盤面,磁道,扇區)的三元組,該三元組唯一地表示了對應的實體扇區。

格式化容量比最大容量要小

連接配接到I/O裝置

  • 三個不同類型的裝置連接配接到總線
    • 通用串行總線(USB)
    • 圖形卡或擴充卡
    • 主機總線擴充卡
    • 插入主機闆上空的擴充槽進行使用,例如網絡擴充卡

通路磁盤

  • CPU使用存儲器映射I/O技術來向I/O裝置發出指令。
  • I/O端口:位址空間中有一塊位址是為了與I/O裝置通信保留的。
  • 讀取一個磁盤扇區的步驟
    • CPU同故宮将指令、邏輯塊号和目的存儲器位址寫到與磁盤相關聯的存儲器映射位址,發起一個磁盤讀
    • 磁盤控制器讀扇區,并執行到主存的DMA傳送
    • 當DMA傳送完成時,磁盤控制器用中斷的方式通知CPU

固态硬碟

  • 一個SSD包由一個或多個閃存晶片和閃存翻譯層組成。
    • 閃存晶片對應傳統旋轉磁盤中的機械驅動器
    • 閃存翻譯器對應傳統旋轉磁盤中的磁盤控制器
  • 一個閃存由B個塊的序列組成
  • 一個塊由P頁組成
  • 頁的大小是512~4KB
  • 塊由32128頁組成,大小為16512KB
  • 資料是以頁為機關讀寫的。
  • SSD的優點:
    • 由半導體存儲器構成,沒有移動的部件
    • 随機通路時間比旋轉磁盤快,能耗更低,同時結實
  • SSD的缺點:
    • 反複寫之後,閃存塊會磨損。
    • SSD每位元組比旋轉磁盤貴大約100倍,是以常用的存儲容量是旋轉磁盤的1%

局部性

  • 計算機程式傾向于引用鄰近于其他最近引用過的資料項的資料項,或者最近引用過的資料項本身。
  • 該傾向成為局部性原理。
  • 局部性的兩種不同形式:
    • 時間局部性
    • 空間局部性
  • 步長為k的引用模式:每隔k個元素進行通路
    • 步長為1的引用模式是程式中空間局部性常見和重要的來源。随着步長的增加,空間局部性下降。
  • 重複引用同一個變量的程式有良好的時間局部性。
  • 對于取指令來說,循環有号的時間和空間局部性。循環體越小,循環疊代次數越多,局部性越好。

存儲器層次結構p405

  • 存儲技術:不同的存儲技術的通路時間差異很大
  • 計算機軟體:一個編寫良好的程式傾向于展示處良好的局部性
  • 存儲器層次結構:硬體和軟體的基礎屬性互相補充的完美,使人想到一種組織存儲器系統的方法。

存儲器層次結構中的緩存

  • 高速緩存(cash)是一個小而快速的儲存設備,使用高速緩存的過程成為緩存
  • 最小的緩存——CPU寄存器集合
  • 資料總是以塊大小為傳送單元在第k層和第k+1層之間來回拷貝。
  • 緩存命中:當程式需要第k+1層的某個資料對象d時,它首先在目前存儲在第k層的一個塊中查找d,如果d剛好緩存在第k層中的情況。
  • 緩存不命中:第k層中沒有緩存資料對象d的情況
    • 強制性不命中或冷不命中:k層的緩存是空的——冷緩存
    • 沖突不命中:限制性的放置政策引起的不命中
    • 容量不命中:工作集的大小超過緩存的大小時。
  • 替換或驅逐:替換一個現存的塊的過程。
  • 犧牲快:被驅逐的這塊。
  • 替換政策:控制決定該替換哪個塊的政策

利用時間的局部性:由于時間局部性,同一資料對象可能會被多次使用。

利用空間的局部性:塊通常包含有多個資料的對象。

高速緩存存儲器

  • CPU寄存器檔案和主存之間插入一個小的SRAM高速緩存存儲器——L1高速緩存(一級緩存)
  • 在L1高速緩存和主存之間插入一個更大的高速緩存——L2高速緩存
  • 比L2更大的高速緩存——L3高速緩存

通用的高速緩存存儲器結構

  • 每個寄存器位址有m位,形成M=2^m個不同的抵制
  • 高速緩存被組織成一個有S=2^s個高速緩存組的數組
  • 每個組包含E個高速緩存行
  • 每個行由一個B=2^b位元組的資料塊組成的
  • 一個有效位指明這個行是否包含有意義的資訊
  • t=m-(b+s)個标記位是目前塊的存儲器位址的位的子集
  • 高速緩存的大小C:指的是所有塊的大小的和,标記位和有效位不包含在内,C=S×E×B

直接映射高速緩存

  • E=1的高速緩存稱為直接映射高速緩存。
  • 高速緩存确定一個請求是否命中,然後抽取出被請求的字的過程:
    • 組選擇
    • 行比對
    • 字抽取
  • 如果緩存不命中,需要從存儲器層次結構中的下一層取出被請求的塊。然後将新的塊存儲在組索引位訓示的組中的一個高速緩存行中。

組相聯高速緩存

  • 每個組都儲存有多于一個的高速緩存行。
  • 一個1<E<C/B的高速緩存通常稱為E路組相聯高速緩存。
  • 它的組選擇與直接映射高速緩存的組選擇一樣,組索引位标志組。
  • 最不常使用(LFU)政策會替換在過去某個時間視窗内引用次數最少的那一行。
  • 最近最少使用(LRU)政策會替換最後依次通路時間最久遠那一行。

全相聯高速緩存

  • 由一個包含所有高速緩存行的組(E=C/B)組成的。
  • 它隻有一個組,位址中沒有組索引位,位址隻被劃分成了一個标志和一個塊偏移。

關于寫的問題

  • 如何更新w在層次結構中緊接着低一層中的拷貝:
    • 直寫:立即将w的高速緩存塊寫回到緊接着的低一層中。
    • 寫回:盡可能地推遲存儲器更新,隻有當替換算法要驅逐更新過的塊時,才把它寫到緊接着的低一層中。
  • 如何處理寫不命中:
    • 寫配置設定:加載相應的低一層的塊到高速緩存中,然後更新這個高速緩存塊。寫回高速緩存為寫配置設定。
    • 非寫配置設定:避開高速緩存,直接把這個字寫到低一層中。直寫高速緩存為非寫配置設定。
  • i-cache:隻儲存指令的高速緩存
  • d-cache:隻儲存程式資料的高速緩存
  • 統一的高速緩存:儲存指令和程式資料的高速緩存。

高速緩存參數的性能影響:

  • 不命中率:不命中數量/引用數量
  • 命中率:1-不命中率
  • 命中時間:從高速緩存傳送一個字到CPU所需的時間
  • 不命中處罰:由于不命中所需要的額外的時間
  • 較大的高速緩存可能會提高命中率,但使大存儲器運作得更快總是要難一些。
  • 較大的的塊能利用程式中可能存在的空間局部性,幫助提高命中率。但會損害時間的局部性比空間局部性更好的程式中的命中率,并且傳送時間會變長。
  • 較高的相聯度(E的值越大)能夠降低高速緩存由于沖突不命中出現抖動的可能性。但也會産生造成較高的成本。
  • 高速緩存越往下層,越可能使用寫回而不是直寫。

高速緩存行、組和塊的差別p423

編寫高速緩存友好的代碼

  • 讓最常見的情況運作得快。
  • 在每個循環内部緩存不命中數量最小。

高速緩存對程式性能的影響

存儲器山

  • 讀吞吐量(讀帶寬):一個程式從存儲系統中讀資料的速率
  • 讀帶寬的時間和空間局部性的二維函數,稱為存儲器山

程式中利用局部性

  • 将注意力集中在内循環上,大部分計算和存儲器通路都發生在這裡。
  • 通過按照資料對象存儲在存儲器中的順序、以步長為1的來讀資料。進而使得程式中的空間局部性最大
  • 一旦從存儲器中讀入一個資料對象,盡可能地使用它,進而使得程式中的時間局部性最大。

遇到的問題

對于存儲器山的概念不是很明白,各條山脊線所表示的内容,步長的變化引起讀吞吐量的變化也并未搞清楚。

希望通過再閱讀相關内容來進行了解。

參考文獻

  • 《Computer.Systems.A.Programmer's.Perspective.2nd.CN》教材
  • 《記憶體山介紹和圖解析》http://www.2cto.com/os/201501/366825.html