存儲器系統是一個具備不一樣容量、成本和訪問時間的存儲設備的層次結構。存儲器層次結構是可行的,是由於與下一個更低層次的存儲設備相比來講,一個編寫良好的程序傾向於更頻繁的訪問某一個層次上的存儲設備。靠近CPU的小的、快速的高速緩存存儲器(cache memory)做爲一部分存儲在相對慢速的主存儲器(mainmemory,簡稱主存)中的數據和 指令的緩衝區域。主存暫時存放存儲在容量較大的、慢速磁盤上的數據,而這些磁盤經常又做爲存儲在經過網絡鏈接的其餘機器的磁盤或磁帶上的數據的緩衝區域。html
固態硬盤(SSD)是一種基於閃存的存儲技術。一個SSD包由一個或多個閃存芯片和閃存翻譯層組成,閃存芯片替代傳統旋轉磁盤中的機械驅動器,而閃存翻譯是一個硬件/固件設備,扮演與磁盤控制器相同的角色,將對邏輯塊的請求翻譯成對底層物理設備的訪問。git
對於取指令來講,循環有好的時間和空間局部性。循環體越小,循環迭代次數越多,局部性越好。算法
通常而言,從高層往底層走,存儲設備變得更慢、更便宜和更大。編程
通常而言,高速緩存是一個小而快速的存儲設備,它做爲存儲在更大也更慢的存儲設備中的數據對象的緩衝區域。使用高速緩存的過程稱爲緩存。 數據塊老是以塊大小爲傳送單位(transfer unit)在第k層和第k+1層之間來回拷貝。
數組
衝突不命中緩存
早期計算機系統的存儲結構只有三層:CPU寄存器、DRAM主存儲器和磁盤存儲。不過,因爲CPU和主存之間逐漸增大的距離,系統設計者被迫在CPU寄存器文件和主存之間插入了一個小的SRAM高速緩存存儲器,稱爲L1高速緩存。隨着CPU和主存之間的性能差距不斷增大,系統設計者在L1高速緩存更大的高速緩存,稱爲L2高速緩存。有些現代計算機還包括一個更大的高速緩存,稱爲L3緩存。安全
實際上,高速緩存既能夠保存數據也能夠保存指令。只保存指令的高速緩存稱爲i-cache,只保存程序數據的高速緩存稱爲d-cache。記保存數據又保存指令的高速緩存稱爲統一的高速緩存(unified cache)。網絡
在每個循環內部緩存不命中的數量最小。app
如下我會列出對我來講耗費時間較長的習題,套公式計算的題就簡寫了。
習題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週期
塊是一個固定大小的信息包,在高速緩存和主存之間來回傳送。 行是高速緩存中存儲塊以及其餘信息的容器。 組是一個或多個行的集合。 在直接映射高速緩存中,組和行確實是等價的。在相聯高速緩存中,組和行有各自的概念。
int sum1(int array[N]) { int i, sum = 0; for(i = 0; i < N; i++) sum += array[i]; return sum; }
在這個程序中,變量sum
和i
在每次循環時就被引用一次,所以對sum
和i
來講,有較好的時間局部性。
對變量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是()的IPA. Windows 宿主機
B. Ubuntu虛擬機
C. ARM實驗箱
D. 以上都不對
【答案】B
原本選了A,後來翻了翻本身的博客,發現提到了宿主機之類的,而後果斷改了選項,就錯了。。跟宿主機IP應該是毫無關係的,nfs系統是把Ubuntu虛擬機的一個目錄映射到ARM實驗箱,跟Windows機無關。
A. Windows 宿主機
B. Ubuntu虛擬機
C. ARM實驗箱
D. 以上均可以
【答案】C
本題我選了個D。。ARM實驗箱的IP修改要從新燒錄Linux系統,Windows 宿主機,Ubuntu虛擬機的IP比較容易修改,因此咱們在超級終端中查看ARM實驗箱的IP,以後把Windows 宿主機,Ubuntu虛擬機的IP設置成和ARM實驗箱同一個網段。
(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小時