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
  • 塊由32~128頁組成,大小爲16~512KB
  • 數據是以頁爲單位讀寫的。
  • 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的來讀數據。從而使得程序中的空間局部性最大
  • 一旦從存儲器中讀入一個數據對象,儘量地使用它,從而使得程序中的時間局部性最大。

遇到的問題

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

但願經過再閱讀相關內容來進行理解。算法

參考文獻

相關文章
相關標籤/搜索