三種常見存儲技術:RAM/ROM/磁盤
兩類:靜態RAM(SRAM)和動態RAM(DRAM)html
靜態RAM(SRAM)比動態RAM(DRAM)更快,但也貴不少。git
這個電路的一個屬性:它能夠無限制地保持在兩個不一樣的電壓配置或狀態之一。其餘任何狀態都是不穩定的。算法
- 特色:因爲SRAM的雙穩態特性,只要有電,它就會永遠地保持它的值,即便有干擾,如電子噪音,來擾亂電壓,當干擾消除,電路也能恢復到穩定值。 - 應用:SRAM用來做爲高速緩存存儲器,便可以在CPU芯片上,也能夠在片下。
DRAM將每一個位存儲爲對電容的充電。電容約爲30×10-15F。編程
- 特色:對干擾特別敏感,當電容的電壓被擾亂以後,它就永遠不會恢復了。暴露在光線下會致使電容電壓改變。 - 應用:DRAM用來做爲主存以及圖形系統的幀緩衝區。
ROM的區分:能被重編程的次數和對他們進行重編程所用的機制。數組
- PROM:只能被編程一次。 - EPROM:可擦寫可編程ROM,紫外線光照清除單元內容,可擦寫次數數量級1000。 - E2PROM:電子可擦除PROM,能夠直接在印製電路卡上編程,可擦寫次數數量級10^5。 - FLASH:閃存,基於EEPROM。(固態硬盤SSD基於閃存)
存儲在ROM設備中的程序一般稱爲固件。瀏覽器
- 讀事務:從主存傳送數據到CPU。 - 寫事務:從CPU傳送數據到主存。 - 總線:一組並行的導線,能攜帶地址、數據的控制信號。 數據總線、控制總線、地址總線
讀事務語句緩存
movl A,%eax
- CPU將地址A放到存儲器總線 - 主存從總線讀出A,接收字x,而後將x放到總線上 - CPU從總線讀出字x,並將它copy到寄存器eax中。
寫事務語句安全
movl %eax,A
- CPU將地址A放到存儲器總線,主存讀出這個地址,等待接收數據字 - CPU將數據字y放到總路上 - 主存從總線讀數據字y,並將它存儲在地址A。
磁盤容量網絡
磁盤容量的決定因素:函數
- 記錄密度:磁道一英寸的段能夠放入的位數。 - 磁道密度:從盤片中心出發半徑上一英寸的段內能夠有的磁道數。 - 面密度:記錄密度與磁道密度的乘積。
磁盤容量
即扇區大小×每條磁道平均扇區數×每一個面磁道的磁道數×每一個盤片的面數×每一個磁盤的盤數
例子:
對於與DRAM和SRAM容量相關的單位,一般
K = 210,M = 220,G = 230
對於磁盤和網絡這樣的I/O設備容量相關的單位,一般
K = 103,M = 106,G = 109
對扇區的訪問時間有三個主要的部分:
- 尋道時間:爲了讀取某個目標扇區的內容,傳動臂把讀/寫頭首先定位到包含目標扇區的磁道上,所需時間即爲尋道時間,約等於最大旋轉時間。 - 尋道時間Tseek依賴於讀寫頭之前的位置和轉動臂在盤面上移動的速度。 - 旋轉時間:定位到指望的磁道後,驅動器等待目標扇區的第一個位旋轉到讀/寫頭下。依賴於當讀寫頭到達目標扇區時盤面的位置和磁盤旋轉速度。 - 定位到指望的磁道後,驅動器等待目標扇區的第一個位旋轉到讀/寫頭下。 - 最大旋轉時間 = 1/最大旋轉數率 - 平均旋轉時間 = (1/2) * 最大旋轉時間。 - 傳送時間:當目標扇區的第一個位位於讀寫頭下時,驅動器就能夠開始讀或者寫該扇區的內容。依賴於旋轉速度和每條磁道的扇區數目。 - 平均傳送時間 = (1/最大旋轉數率) * (1/每磁道的平均扇區數)
內存能夠當作字節數組、磁盤能夠當作塊數組
I/O總線比系統總線比存儲器總線慢,可是它能夠容納種類繁多的第三方I/O設備。
- 通用串行總線USB:2.0最大帶寬60MB/S,3.0最大帶寬600MB/S - 圖形卡(適配器) - 主機總線適配器
例:
性能特性
- 順序讀和寫(CPU按順序訪問邏輯磁盤塊)性能至關,順序讀比順序寫稍快一點。 - 隨機順序訪問邏輯塊時,寫比讀慢一個數量級。 *讀寫性能差異是由底層閃存基本屬性決定的。
優缺點
優勢: - 由半導體構成,沒有移動的部件 - 隨機訪問時間比旋轉磁盤要快、能耗低、結實 缺點 - 易磨損、更貴
#### (9)存儲技術趨勢
DRAM和磁盤的性能滯後於CPU的性能
兩種不一樣形式
空間局部性 時間局部性
有良好局部性的程序比局部性差的程序運行得更快
- 硬件層:局部性原理容許計算機設計者經過引入高速緩存存儲器來保存最近被引用的指令和數據項,從而提升對主存的訪問速度。 - 操做系統級:局部性原理容許系統使用主存做爲虛擬地址空間最近被引用塊的高速緩存,用主存來緩存磁盤文件系統中最近被使用的磁盤塊。 - 應用程序中:例如,Web瀏覽器將最近被引用的文檔放在本地磁盤上。
步長爲1的引用模式:就是順序訪問一個向量的每一個元素,有時也被稱爲順序引用模式,它是程序中空間局部性常見和重要的來源。
通常來講,隨着步長增長,空間局部性降低。
多維數組程序
C語言中數組在存儲器中是按照行順序存放的,因此按照行優先順序執行的代碼的局部性要好於按列優先順序的代碼。
重複引用同一個變量的程序有良好的時間局部性 對於具備步長爲k的引用模式的程序,步長越小,空間局部性越好 對於取指令來講,循環有好的時間和空間局部性。循環體越小,循環迭代次數越多,局部性越好。
- 存儲技術:不一樣的存儲技術的訪問時間差別很大,速度較快的技術每字節的成本要比速度較慢的技術高,並且容量較小,CPU和主存之間的速度差距在增大。 - 計算機軟件:一個編寫良好的程序傾向於展現出良好的局部性。
每一層存儲設備都是下一層的緩存。
高速緩存與緩存:高速緩存cash是一個小而快速的存儲設備,它做爲存儲在更大、更慢的設備中的數據對象的緩衝區域。使用高速緩存的過程稱爲緩存。
存儲器層次結構的中心思想:對於每一個k,位於k層的更快更小的存儲設備做爲位於k+1層的更大更慢的存儲設備的緩存。 - 即每層存儲設備都是下一層的「緩存」
數據老是以塊大小爲傳送單元在第k層與第k+1層之間來回拷貝。任一對相鄰的層次之間塊大小是固定的,可是其餘的層次對之間能夠有不一樣的塊大小。
這時第k層緩存會從第k+1層緩存中取出包含d的那個塊。若是第k層緩存已滿,就可能會覆蓋現存的一個塊.
- 覆蓋一個現存的塊的過程稱爲替換/驅逐這個塊。 - 被驅逐的塊有時也稱爲犧牲塊。
替換策略:決定替換哪一個塊
- 隨機替換策略:隨機選擇一個犧牲塊 - 最近最少被使用替換策略(LRU):選擇最後被訪問的時間距如今最遠的塊
CPU與主存之間插入
- L1高速緩存:位於CPU寄存器文件和主存之間,訪問速度2-4個時鐘週期 - L2高速緩存:位於L1高速緩存和主存之間,訪問速度10個時鐘週期 - L3高速緩存:位於L2高速緩存和主存之間,訪問速度30或40個時鐘週期
高速緩存存儲器的典型總線結構
m:每一個存儲器地址有m位,造成M=2^m個不一樣的地址 S:這個數組中有S=2^s個高速緩存組 E:每一個組包含E個高速緩存行 B:每一個行是由一個B=2^b字節的數據塊組成的 - 標記位:t=m-(b+s)個,惟一的標識存儲在這個高速緩存行中的塊 - 有效位:每一個行有一個有效位,指明這個行是否包含有意義的信息 - 高速緩存的大小/容量C:C=S*E*B 指全部塊的大小的和,不包括標記位和有效位。
參數小結
高速緩存肯定一個請求是否命中,而後取出被請求的字的過程,分爲三步:
- 組選擇 - 行匹配 - 字抽取
判斷緩存命中的兩個充分必要條件:
- 該行設置了有效位 - 高速緩存行中的標記和w的地址中的標記相匹配
CPU執行一系列讀的步驟:
- 用索引位,肯定針對的是哪一個組 - 而後看對應的組是否有效: - 若是無效則緩存不命中,高速緩存從存儲器或低一層中取出要找的塊,存儲在對應的組中,再把有效位置1,返回須要的值 - 若是有效,再根據標記找是否有匹配的標記:若是有,則緩存命中,返回須要的值;若是沒有,則替換行,返回。
直接映射高速緩存中的衝突不命中
緣由:在塊之間抖動,即這些塊被映射到了同一個高速緩存組。
抖動:高速緩存反覆的加載和驅逐相同的高速緩存塊的組
解決方法:在每一個數組的結尾放B字節的填充(B字節是一個塊的長度,一行是一個塊,至關於分開了行)從而使得他們映射到不一樣的組。
組中的任意一行均可以包含任何映射到這個組的存儲器塊,因此告訴緩存必須搜索組中的每一行。
組相連高速緩存中不命中時的行替換:
寫命中時,更新低一層中的拷貝的方法
- 直寫:當即將w的高速緩存塊協會到緊接着的低一層中 - 缺點:每次寫都會引發總線流量。 - 寫回:只有當替換算法要驅逐更新過的塊時,才寫到緊接着的低一層中。 - 優勢:符合局部性原理,顯著的減小總線流量 - 缺點:增長了複雜性,必須爲每一個高速緩存行維護一個額外的修改位
寫不命中的處理方法
- 寫分配(對應寫回):加載相應的低一層中的塊到高速緩存中,而後更新這個高速緩存塊。 - 非寫分配(對應直寫):避開高速緩存,直接把這個字寫在低一層中。
性能
- 不命中率 = 不命中數量/引用數量 - 命中率 = 1 - 不命中率 - 命中時間:從高速緩存傳送一個字到CPU所需的時間,包括組選擇,行匹配,字抽取的時間。 - 不命中處罰:由於不命中所須要的額外的時間
具體影響
- 高速緩存大小:較大的高速緩存可能會提升命中率,但使大存儲器運行的更快是更難一些的。 - 塊大小:較大的塊能利用程序中可能存在的空間局部性,幫助提升命中率;但塊越大意味着高速緩存行較少,損害時間局部性。 - 相聯度:相聯度較大(E值較大)優勢是下降了高速緩存因爲衝突不命中出現抖動的可能性,但成本較高。 - 寫策略:直寫高速緩存易實現,並且能使用獨立於高速緩存的寫緩衝區,用來更新存儲器,不命中開銷小。寫回高速緩存引發的傳送比較少,容許更多的到存儲器的寬帶用於執行DMA的I/O設備。越下層,越可能用寫回而不是直寫。
確保代碼高速緩存友好的基本方法:
- 讓最多見的狀況運行的快。 - 在每一個循環內部緩存不命中數量最小。
步長爲1的引用模式是好的,由於存儲器層次結構中全部層次上的緩存都是將數據存儲爲連續的塊(空間局部性)。
存儲器山
(1)概念
(2)分析
(statistics.sh腳本的運行結果截圖)
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 200/200 | 2/2 | 20/20 | |
第二週 | 300/500 | 2/4 | 18/38 | |
第三週 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 |
嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。
計劃學習時間:10小時
實際學習時間:7.5小時