2017-2018-1 20155201 《信息安全系統設計基礎》第十三週學習總結

2017-2018-1 20155201 《信息安全系統設計基礎》第十三週學習總結

教材學習內容總結

第六章 存儲器層次結構

6.1 存儲技術
6.2 局部性
6.3 存儲器層次結構
6.4 高速緩存存儲器
6.5 編寫高速緩存友好的代碼
6.7 小結

存儲器系統是一個具備不一樣容量、成本和訪問時間的存儲設備的層次結構。存儲器層次結構是可行的,是由於與下一個更低層次的存儲設備相比來講,一個編寫良好的程序傾向於更頻繁的訪問某一個層次上的存儲設備。靠近CPU的小的、快速的高速緩存存儲器(cache memory)做爲一部分存儲在相對慢速的主存儲器(mainmemory,簡稱主存)中的數據和 指令的緩衝區域。主存暫時存放存儲在容量較大的、慢速磁盤上的數據,而這些磁盤經常又做爲存儲在經過網絡鏈接的其餘機器的磁盤或磁帶上的數據的緩衝區域。html

6.1 存儲技術

  • 隨機訪問存儲器(Random-AccessMem)分兩類:靜態RAM(SRAM)和動態RAM(DRAM)。
    • SRAM將每一個位存儲在一個雙穩態的(bitable)存儲器單元裏。每一個單元是用一個六晶體管電路來實現的。
    • DRAM將每一個位存儲爲對一個電容的充電。DRAM存儲器能夠製造得很是密集——每一個單元由一個電容和一個訪問晶體管組成。
    • 若是斷電,DRAM和SRAM會丟失它們的信息,從這個意義上說,它們是易失的(volatile)。
    • ROM以可以被重編程的次數和它們進行重編程所用的機制被區分爲:可編程ROM (PROM),可擦寫可編程ROM(EPROM),和電子可擦除PROM(EEPROM)。閃存:閃存是基於EEPROM的非易失性存儲器,是一種較爲廣泛的非易失性存儲器。
    • 數據流經過稱爲總線的共享電子電路在處理器和DRAM主存之間來來回回。每次CPU與主存之間的數據都是由總線事務來完成的,總線事務包括讀事務和寫事務。
  • 磁盤是用來保存大量數據的存儲設備,能比基於RAM的存儲器存更多的數據,可是讀取數據的速度卻遠遠低於基於RAM的存儲器。
    • 磁盤是由盤片構成的。磁盤是由盤片(platter)構成的。每一個盤片有兩面或者稱爲表面(surface),表面覆蓋着磁性記錄材料。盤片中央有一個能夠旋轉的主軸(spindle),它使得盤片以固定的旋轉速率 (rotational rate)旋轉;每一個盤片上是由一組成爲磁道的同心圓組成的。每一個磁道被劃分爲一組扇區。扇區之間存在間隙。磁盤一般包含一個或多個這樣的盤片,並封裝在一個密封的容器內。整個裝置稱爲磁盤驅動器,咱們簡稱磁盤。
    • 磁盤容量的計算:
    • 磁盤以扇區大小的塊來讀寫數據。對扇區的訪問時間(access time)主要有三個部分:尋道時間(seek time)、旋轉時間(rotational time)和傳送時間(transfer time)。
    • 當CPU從磁盤讀數據時的步驟:
      • CPU經過命令、邏輯塊號和目的內存地址寫到與磁盤相關聯的內存映射地址,發起一個讀
      • 磁盤控制讀扇區,並執行到主存的DMA
      • 當DMA傳送完成時,磁盤控制器用中斷的方式通知CPU
    • 固態硬盤(SSD)是一種基於閃存的存儲技術。一個SSD包由一個或多個閃存芯片和閃存翻譯層組成,閃存芯片替代傳統旋轉磁盤中的機械驅動器,而閃存翻譯是一個硬件/固件設備,扮演與磁盤控制器相同的角色,將對邏輯塊的請求翻譯成對底層物理設備的訪問。git

      6.2 局部性

      一個編寫良好的計算機程序經常具備良好的局部性(locality)。也就是說,它們傾向於引用鄰近於其餘最近引用過的數據項的數據項,或者最近引用過的數據項自己。這種傾向性,被稱爲局部性原理(principle of locality)。
  • 局部性一般有兩種不一樣的形式:時間局部性(temporal locality)和空間局部性(spatial locality)。
    • 重複引用同一個變量的程序有良好的時間局部性
    • 一個連續向量中,每隔k個元素進行訪問,就被稱爲步長爲k的引用模式。對於具備步長爲k的引用模式的程序,步長越小,空間局部性越好。具備步長爲1的引用模式的程序有很好的空間局部性。在存儲器中以大步長跳來跳去的程序空間局部性會不好。
    • 對於取指令來講,循環有好的時間和空間局部性。循環體越小,循環迭代次數越多,局部性越好。算法

      6.3 存儲器層次結構

通常而言,從高層往底層走,存儲設備變得更慢、更便宜和更大。編程

  • 通常而言,高速緩存是一個小而快速的存儲設備,它做爲存儲在更大也更慢的存儲設備中的數據對象的緩衝區域。使用高速緩存的過程稱爲緩存。 數據塊老是以塊大小爲傳送單位(transfer unit)在第k層和第k+1層之間來回拷貝。
    數組

    • 緩存命中:當程序須要第k+1層的某個數據對象d時,它首先在當前存儲在k層的一個塊中查找d。若是d恰好緩存在k層,那麼就「命中」。
    • 緩存不命中:若是k層沒有緩存數據對象d,那麼就「不命中」。當發生緩存不命中後,第k層的緩存從第k+1層緩存中取出包含d的那個塊。
      • 冷不命中
      • 衝突不命中緩存

        6.4 高速緩存存儲器

早期計算機系統的存儲結構只有三層:CPU寄存器、DRAM主存儲器和磁盤存儲。不過,因爲CPU和主存之間逐漸增大的距離,系統設計者被迫在CPU寄存器文件和主存之間插入了一個小的SRAM高速緩存存儲器,稱爲L1高速緩存。隨着CPU和主存之間的性能差距不斷增大,系統設計者在L1高速緩存更大的高速緩存,稱爲L2高速緩存。有些現代計算機還包括一個更大的高速緩存,稱爲L3緩存安全

  • 通常而言,高速緩存的結構能夠用元組(S,E,B,m)來描述。高速緩存的大小(或容量)C指的是全部塊的大小的和。標記位和有效位不包括在內。所以,C=S * E * B。
  • 根據E(每一個組的高速緩存行數)高速緩存被分爲不一樣的類:
    • 直接映射高速緩存
      • 每一個組只有一行(E=1)的高速緩存稱爲直接映射高速緩存(direct-mapped cache)。
      • 組選擇
      • 行匹配
      • 字選擇
      • 行替換
    • 組相聯高速緩存:直接映射高速緩存中衝突不命中形成的問題是源於每一個組只有一行這個限制,組相聯高速緩存放鬆了這條限制,因此每一個組都保存多餘一個的高速緩存行。
    • 全相聯高速緩存:一個全相聯高速緩存是由一個包含全部高速緩存行的組(即E=C/B)組成的。
  • 有關寫的問題
    • 設咱們要寫一個已經緩存了的字w寫命中(write hit)。在高速 緩存更新了它的w的拷貝以後,想要更新w在層次結構中緊接着低一層中的拷貝,能夠有多種選擇:
      • 直寫(write-through):當即將w的高速緩存塊寫回到緊接着的低一層中。
      • 寫回(write-back),儘量地推遲存儲器更新,只有當替換算法要驅逐更新過的塊時,才把它寫到緊接着的低一層中。
    • 另外一個問題是如何處理寫不命中。
      • 寫分配(write-allocate),加載相應的低一 層中的塊到高速緩存中,而後更新這個高速緩存塊。寫分配試圖利用寫的空間局部性,可是缺點是每次不命中都會致使一個塊從低一層傳送到高速緩存。
      • 非寫分配(not-write-allocate),避開高速緩存,直接把這個字寫到低一層中。直寫高速緩存一般是非寫分配的。寫回高速緩存一般是寫分配的。
    • 通常而言,高速緩存越往下層,越可能採用寫回而不是直寫。
  • 實際上,高速緩存既能夠保存數據也能夠保存指令。只保存指令的高速緩存稱爲i-cache,只保存程序數據的高速緩存稱爲d-cache。記保存數據又保存指令的高速緩存稱爲統一的高速緩存(unified cache)。網絡

    6.5 編寫高速緩存友好的代碼

    通常高速緩存友好的基本方法:
  • 讓常見的狀況運行的快。程序一般把大部分時間都花在少許的核心函數上,而這些函數一般把時間都花在了少許循環上。因此集中注意力在覈心函數的少許循環上,而忽略其餘部分。
  • 在每個循環內部緩存不命中的數量最小。app

    6.6 綜合:高速緩存對程序性能的影響

  • 存儲器山:存儲器系統的性能不是一個數字就能簡單描述,因此引入「山」的概念,這座時間和空間局部性的山,其上升高度差異能夠超過一個數量級。
  • 在程序中利用局部性:
    • 集中關注程序的內循環上,大部分計算和存儲器訪問都發生在這裏。
    • 經過按照數據對象存儲在存儲器中的順序、以步長爲1的來讀數據,從而使得你程序中的 空間局部性最大。
    • 一旦從存儲器中讀入了一個數據對象,就儘量多地使用它,從而使得程序中的時間局部性最大。

教材習題解答:

如下我會列出對我來講耗費時間較長的習題,套公式計算的題就簡寫了。
習題6.1
dom

本題的要點是理解DRAM芯片的組成原理:
傳統的DRAM芯片單元被分紅d個超單元,每一個超單元由w個DRAM單元組成。一個dxW的DRAM總共存儲了dw位信息。一個16x8的DRAM芯片組織以下圖所示:

x前面的數字表明超單元的數量, 其分割應趨向於正方形,才能使得訪問第(i, j)個地址時,訪問的地址位數趨於最少。
br和bc是尋址時須要的位數,4=2^2,16=2^4以此類推,完成填表。
習題6.2

磁盤容量=(字節數/扇區) * (平均盤區數/磁道) * (磁道數/表面) * (表面數/盤片) * (盤片數/磁盤)

計算磁盤容量:2個盤片,10000個柱面,每條磁道平均400個扇區,每一個扇區有512個字節。
(注:每一個盤片有2個表面,柱面是全部盤片表面上到主軸中心的距離相等的磁道的集合。)
磁盤容量=(512) * (400) * (10000) * (2) * (2)=8 192 000 000字節=8.192 GB

習題6.3

一個有以下參數的磁盤:旋轉速率:15000 RPM,T(avg seek)=8ms,每條磁道的平均扇區數:500

平均旋轉時間:T(avg rotation)=1/2 * T(max rotation)
                             =1/2 * (60sec/15000 RPM) * (1000ms/sec)
                             =2 ms
平均傳送時間:T(avg transfer)=(60s/15000 RPM) * (1/500) * (1000ms/sec)=0.008 ms
T(access)=T(avg seek) + T(avg rotation) + T(avg transfer) = 8 + 2 + 0.008=10 ms

習題6.4

首先,T(avg seek)= 5 ms, T(max rotation) = 6 ms, T(avg rotation) = 3 ms
A:總時間爲T(avg seek) + T(avg rotation) + 2 * T(max rotation) = 5 + 3 + 12= 20 ms
B:總時間爲(T(avg seek) + T(avg rotation) ) * 2000 = =16 000 ms

習題6.5

A:(10 ^ 9 * 128) * (1/470) * (1/(86400 * 365)) 約爲8年
B:(10 ^ 9 * 128) * (1/303) * (1/(86400 * 365)) 約爲13年
C:(10 ^ 9 * 128) * (1/20000) * (1/365)約爲17535年

習題6.7

須要保證最內層循環對應數組的最細元素。

int sumarray3d(int a[N][N][N]){
    int i,j,k,sum=0;
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            for(k=0;k<N;k++)
            sum+=a[i][j][k];
    return sum;
}

習題6.8

clear1函數以步長爲1的引用模式訪問數組,空間局部性最好。

習題6.9

其實也是套公式計算
C = B * E * S
b = log2(B)
s = log2(S)
t = m - (s + b)

習題6.10

命中率3/4

習題6.11

A:每一個連續的數組片由2 ^ t個塊組成。 數組頭2 ^ t個連續的塊都會映射到組0,接下來的映射到1.
B:對於直接映射高速緩存(S, E, B, m)=(512, 1, 32, 32),數組的頭2 ^ 18個塊會被映射到組0,接下來的映射到組1。

習題6.12

習題6.13
地址:0x0E34
A. 地址格式:

B.內存引用:

習題6.14
地址:0x0DD5
A. 地址格式:

B.內存引用:

習題6.15
地址:0x01FF4
A. 地址格式:

B.內存引用:

習題6.16

組3包含一個有效行,標記爲0x32,組中只有一個有效行,4個地址會命中。
在組3中命中的4個十六進制地址是:
0x064C
0x064D
0x064E
0x064F

習題6.17

注意:每一個高速緩存行只包含數組的一個行,高速緩存正好只夠保存一個數組。對於全部的i,src和dst的行i映射到同一個高速緩存行。
對dst[0][0]寫會驅逐當咱們讀src[0][0]時加載進來的那一行。當讀src[0][1]是,會有一個不命中。

當高速緩存爲32字節時,他足夠容納兩個數組。全部的不命中都是開始時的;冷不命中。

習題6.18

A:讀的總數:512
B:緩存不命中的讀總數:256
C:不命中率:256/512=1/2

習題6.19

這個高速緩存只能保存數組的一半。因此,按照列順序來掃描數組的第二部分時會驅逐掃描第一部分時加載進來的那些行。

A:讀的總數:512
B:緩存不命中的讀總數:256
C:不命中率:256/512=1/2
D:若是高速緩存足夠大,那麼它可以保存整個數組,全部的不命中都會是開始時的冷不命中,而不命中率1/4。

習題6.20

該循環步長爲1,所以全部的不命中都是最開始時的冷不命中。

A:讀的總數:512
B:緩存不命中的讀總數:128
C:不命中率:128/512=1/4
D:冷不命中不可避免,命中率不變。

習題6.21

週期:2670 / 6500 * 8 = 3.2週期
4週期

教材學習中的問題和解決過程

  • 問題1:高速緩存中行、組和塊有什麼區別?
  • 問題1解決方案:
塊是一個固定大小的信息包,在高速緩存和主存之間來回傳送。
行是高速緩存中存儲塊以及其餘信息的容器。
組是一個或多個行的集合。

在直接映射高速緩存中,組和行確實是等價的。在相聯高速緩存中,組和行有各自的概念。

代碼調試中的問題和解決過程

  • 問題1:對於程序的空間局部性如何理解?
  • 問題1解決方案:先看一個一維數組的示例:
int sum1(int array[N])
{
    int i, sum = 0;
    for(i = 0; i < N; i++)
        sum += array[i];
    return sum;
}

在這個程序中,變量sumi在每次循環時就被引用一次,所以對sumi來講,有較好的時間局部性。
對變量array來講,它是一個int類型數組,循環時按順序訪問array,由於一個數組在內存中是佔用連續的內存空間。於是的較好的空間局部性。
這個程序具備良好的空間和時間局部性。
再看一個二維數組的例子:

int sum2(int array[M][N])
{
    int i, j, sum = 0;
    for(i = 0; i < M; i++){
        for(j = 0; j < N; j++)
            sum += array[j][i];
    }   
    return sum;
}

這個相比以前的程序局部性就很差了,尤爲是空間局部性。
當M=2,N=3時,
訪問這個數組的時候,從array[0][0]開始,array[1][0]->array[2][0]->array[0][1]->array[1][1]…
數組在內存中是按行順序來存放的,array[0][0]的地址假設爲0x0,array[0][1]地址應該是0x4,array[0][2]地址0x8……這樣的程序對array[0][0]、array[0][1]元素的訪問順序就變成了一、三、五、二、四、6,步長變成了3而不是最優的1。但這個程序是能夠變成步長爲1的最優程序的,只須要修改遍歷的順序,使之按照行來掃描:

int sum2(int array[M][N])
{
    int i, j, sum = 0;
    for(i = 0; i < M; i++){
        for(j = 0; j < N; j++)
            sum += array[i][j];
    }   
    return sum;
}

代碼託管

上週考試錯題總結

  • mount -t nfs -o nolock 192.168.0.56:/root/share /host,其中的IP是()的IP

A. Windows 宿主機

B. Ubuntu虛擬機

C. ARM實驗箱

D. 以上都不對

【答案】B

原本選了A,後來翻了翻本身的博客,發現提到了宿主機之類的,而後果斷改了選項,就錯了。。跟宿主機IP應該是毫無關係的,nfs系統是把Ubuntu虛擬機的一個目錄映射到ARM實驗箱,跟Windows機無關。

  • 實驗1中Windows宿主機,Ubuntu虛擬機,ARM實驗箱三者IP要在同一網段,操做中是根據()的IP來肯定網段的。

A. Windows 宿主機
B. Ubuntu虛擬機
C. ARM實驗箱
D. 以上均可以

【答案】C

本題我選了個D。。ARM實驗箱的IP修改要從新燒錄Linux系統,Windows 宿主機,Ubuntu虛擬機的IP比較容易修改,因此咱們在超級終端中查看ARM實驗箱的IP,以後把Windows 宿主機,Ubuntu虛擬機的IP設置成和ARM實驗箱同一個網段。

結對及互評

本週結對學習狀況

  • 20155313
    • 結對學習內容
      • 直接映射高速緩存的示例:
(S,E,B,m)=(4,1,2,4),即4個組,每一個組1行,每一個塊2個字節,地址是4位。這裏假設每一個字都是單字節,每次都讀1個字。
初始時,高速緩存是空的:

 a)讀地址0的字。由於組0的有效位是0,緩存不命中,因此高速緩存從存儲器取出塊0,,並存儲在組0中。而後高速緩存返回取出的高速緩存行的m[0]。
 b)讀地址1的字。高速緩存命中。
 c)度地址13的字。
 d)讀地址8的字。
 e)讀地址0的字。又發生緩存不命中,由於前面引用地址8時,恰好替換了塊8。
 具體的圖示意在夥伴的博客裏。
從夥伴的總結裏學習到的:最近一段時間操做系統課程也講了計算機中的內存使用,藉此學習一下:
- 操做系統採用虛擬內存的方式管理存儲器有不少好處:
    - 虛擬內存管理能夠控制物理內存的訪問權限。
    - 虛擬內存管理最主要的做用是讓每一個進程有獨立的地址空間。所謂獨立的地址空間是指,不一樣進程中的同一個VA被MMU映射到不一樣的PA,而且在某一個進程中訪問任何地址都不可能訪問到另一個進程的數據,這樣使得任何一個進程因爲執行錯誤指令或惡意代碼致使的非法內存訪問都不會意外改寫其它進程的數據,不會影響其它進程的運行,從而保證整個系統的穩定性。另外一方面,每一個進程都認爲本身獨佔整個虛擬地址空間,這樣連接器和加載器的實現會比較容易,沒必要考慮各進程的地址範圍是否衝突。
    - 方便了共享庫的實現。採用共享庫的目的在於節省內存(物理內存)。VA到PA的映射會給分配和釋放內存帶來方便,物理地址不連續的幾塊內存能夠映射成虛擬地址連續的一塊內存。
    - 「增長」了程序可使用的內存空間。一個系統若是同時運行着不少進程,爲各進程分配的內存之和可能會大於實際可用的物理內存,虛擬內存管理使得這種狀況下各進程仍然可以正常運行。當所訪問的頁面不在內存中時再將其加載進來,無空閒頁面的時候還可能須要採起必定的置換算法將某個頁面換出。這種機制的可行性得益於偉大的「局部性原理」。

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 195/195 1/1 10/10
第三週 314/706 1/2 15/25
第五週 254/960 2/4 10/35
第七週 24/1759 2/6 15/50
第九周 1207/2966 2/8 15/65
第十一週 1207/2966 2/10 15/65
第十三週 419/3385 3/13 16/81
  • 計劃學習時間:12小時

  • 實際學習時間:16小時

參考資料

相關文章
相關標籤/搜索