知識點1:計算機應用分類

計算機應用方向主要包括三類:

1.個人計算機。用於個人使用的計算機,通常包含圖形顯示器、鍵盤和滑鼠等;

2.伺服器。過去被稱為大型機的現代形式,用於為多用戶運行大型程序的計算機,通常由多個用戶並行使用,並且一般通過網路訪問。其中高端伺服器稱為超級計算機,擁有最高性能和最高成本;

3.嵌入式計算機。嵌入到其他設備中的計算機,一般運行預定義的一個或者一組應用程序。面向單一應用需求的嵌入式應用通常對成本或功耗有嚴格限制。

而在2000年後的「後PC時代」,個人移動設備代替了傳統PC,雲計算代替了傳統伺服器:

個人移動設備(PMD)。連接到網路上的小型無線設備,由電池供電,通過下載App的方式安裝軟體,如智能手機和平板電腦;

雲計算。依賴於稱為倉儲規模計算機(WSC)的巨型數據中心,是在網路上提供服務的大伺服器集群,一些運營商根據應用需求出租不同數量的伺服器。

知識點2:計算機設計的重要思想

1.面向摩爾定律的設計:摩爾定律指出單晶元上的集成度(集成電路晶元中晶體管數量)每18-24個月翻一番。設計者必須預測其設計完成時的工藝水平。

2.使用抽象簡化設計:使用抽象來表示不同的設計層次,在高層次中看不到低層次的細節,只能看到一個簡化的模型。

3.加速大概率事件:加速大概率事件遠比優化小概率事件更能提高性能。

4.通過並行提高性能。

5.通過流水線提高性能。

6.通過預測提高性能:如果從誤預測恢復執行代價不高且預測的準確率相對較高,則可通過猜測的方式提前開始某些操作。

7.存儲器層次:通過存儲器層次來滿足速度快容量大價格低這些互相矛盾的需求。如同一個堆疊的三角形,越靠近頂端速度越快價格越高,底層寬度越大容量越大。

8.通過冗餘提高可靠性。

知識點3:計算機語言層次

高級編程語言:由一些單詞和代數符號組成,可以由編譯器轉換為彙編語言。不涉及硬體,具有通用性,但目標代碼冗長,不能對某些硬體進行操作。

彙編語言:又稱低級語言,是一種符號語言,以助記符形式表示的機器指令。

機器語言:以二進位元形式表示的機器指令,是一種指令集的體系。CPU可直接解讀,執行速度快效率高。

知識點4:馮·諾依曼體系結構

基本思想包括:計算機硬體系統由五大部分組成;採用二進位編碼表示數據;將程序和數據統一表示;計算機具有順序指令的處理能力等。

五大部分是指:運算器(ALU)、控制器、存儲器、輸入設備和輸出設備。其中運算器和控制器合稱為中央處理單元(也叫處理器,CPU)。各個組成部分通過匯流排連接起來,匯流排由數據匯流排DB、地址匯流排AB、控制匯流排CB組成。

知識點5:數的機器表示與補碼

計算機中的數採用二進位,數碼0和1由二值器件的兩個穩態表示,稱為bit(記為b),8個相鄰的二進位位構成一個位元組Byte(記為B)。

數的機器表示稱為機器數,數的數學表示稱為真值。

有符號數最高位用來表示符號(0為正1為負),其餘位表示絕對值,這種表示方法稱為原碼,原碼常用來描述真值。

而有符號數的機器表示是補碼,0和正數的補碼就是本身,負數的補碼是其絕對值求反加1。補碼的減法運算可以變為加法運算,於是CPU就可用加法器直接實現減法。例如:

0000 0000 0000 0000 0000 0000 0000 0000(2)=0(10)

0000 0000 0000 0000 0000 0000 0000 0001(2)=1(10)

0000 0000 0000 0000 0000 0000 0000 0010(2)=2(10)

……

0111 1111 1111 1111 1111 1111 1111 1110(2)=2147483646(10)

0111 1111 1111 1111 1111 1111 1111 1111(2)=2147483647(10)

1000 0000 0000 0000 0000 0000 0000 0000(2)=-2147483648(10)

1000 0000 0000 0000 0000 0000 0000 0001(2)=-2147483647(10)

……

1111 1111 1111 1111 1111 1111 1111 1110(2)=-2(10)

1111 1111 1111 1111 1111 1111 1111 1111(2)=-1(10)

任意一個帶符號的二進位數都可表示為科學記數法N=(-1)^S*2^E*M,其中S是符號,E是指數(階碼),M是尾數。浮點數由階碼和尾數及符號位組成。

知識點6:進位轉換

十進位轉換為二進位或十六進位:用十進位數不斷除以2或16,記下每次相除時的餘數,直到商0為止,將得到的餘數倒序排列即可。即「除2/16取余,逆序排列」。

1位十六進位數碼正好與4位二進位數碼一一對應。

知識點7:經典CPU性能公式

CPU時間=指令數 * 每條指令的平均時鐘周期數(CPI) * 時鐘周期時間

或 CPU時間=指令數 * 每條指令的平均時鐘周期數(CPI) / 時鐘頻率

執行時間是唯一有效且不可推翻的計算機性能度量方法。

知識點8:易失性/非易失性存儲器

存儲器可分為易失性存儲器與非易失性存儲器,前者僅在加電時保存數據,後者掉電仍可保持。易失性存儲器的主要代表是RAM(隨機存取存儲器);非易失性存儲器包括ROM(只讀存儲器)、Flash memory(快閃記憶體)、磁碟等。常將易失性存儲器稱為主存儲器,非易失性存儲器稱為二級存儲器。

RAM可進一步分為SRAM(靜態隨機訪問存儲器)和DRAM(動態隨機訪問存儲器)。SRAM不需要刷新電路即能保存它內部存儲的數據,而DRAM每隔一段時間要刷新充電一次,否則內部的數據即會消失,因此SRAM具有較高的性能功耗較小,但SRAM的缺點是集成度較低。通常內存由多片DRAM晶元組成,緩存採用SRAM技術。

個人移動設備中一般採用快閃記憶體,伺服器中則採用磁碟。快閃記憶體的單位價格和速度均低於DRAM高於磁碟,但快閃記憶體具有寫10萬-100萬次後老化或損壞的弱點。

知識點9:硬體概念

液晶顯示(LCD):用液體聚合物薄層的帶電或不帶電來傳輸或阻止光線傳輸。

電容感應:許多平板電腦採用該技術實現觸摸屏。在絕緣玻璃上覆蓋一層透明的導體,人是導體觸摸會改變屏幕的電場,進而導致電容變化。

集成電路:也叫晶元,一種將幾十個至幾百萬個晶體管連接起來的設備。

晶體管:一種由電信號控制的簡單開關,超大規模集成電路是由數十萬到數百萬晶體管組成的電路。

知識點10:指令、指令集、寄存器、字

CPU可以完成的一個基本操作稱為指令。指令的形式是二進位代碼,通常包含操作碼和操作數兩部分。操作碼指明所要完成的操作類型,操作數則指明操作的數據對象,可以是數據本身也可以是數據所在的存儲單元地址。

一台計算機的全部指令稱為該計算機的指令集,常見的指令集有X86、ARM、MIPS。指令系統的發展從CISC(複雜指令系統計算機)發展到RISC(精簡指令系統計算機),前者多達幾百條,不易維護研製周期長,且採用了大量使用頻率低的複雜指令造成硬體資源浪費。X86是CISC的代表,ARM與MIPS是RISC的代表,ARM指令集廣泛使用在嵌入式系統設計,X86指令集則是目前世界上最流行的台式機體系結構。

寄存器是CPU內部的臨時存儲單元,能減少CPU訪問內存的次數和降低指令控制的複雜度。寄存器由硬體直接構建且數量有限,是計算機硬體涉及的基本元素。

字是計算機內部進行數據處理和數據傳遞的基本單位,其所包含的二進位位數稱為字長,字長是計算機處理精度和運算能力的反映。例如MIPS體系結構中存儲器大小為32位,因此字長為32位。

知識點11:大小端編址

存儲器通常按位元組編址,以32位字長為例,一個字的地址必和它所包括的4位元組中某個地址相匹配。大端編址表示使用最左邊或「大端」位元組的地址作為字地址,小端編址則表示使用最右或「小端」作為字地址。如MIPS採用大端編址。

知識點12:MIPS指令集

MIPS由斯坦福大學設計,用於無內部互鎖流水級的微處理器RISC晶元,最早版本為32位,最新為64位。中國龍芯便採用了MIPS精簡指令集架構。

MIPS一類的現代計算機有32個32位寄存器,約定書寫指令時用$加兩個字元來代表一個寄存器。如$s0、$s1……表示變數所對應的寄存器,用$t0、$t1……表示將程序編譯為MIPS指令時所需的臨時寄存器。$zero恆置為0。

知識點13:MIPS彙編初步

1.算術指令

只對寄存器進行操作,每條算術指令只執行一個操作,有且僅有3個變數。有一個常數操作數的快速加法指令叫作加立即數(addi 指令),由於支持負常數,因而不需要設置減立即數指令。

2.數據傳送指令

將數據從存儲器複製到寄存器稱為取數指令,反之為存數指令。指令必須給出存儲器地址,存儲器就是一個很大的下標從0開始的一維數組,地址就相當於數組的下標。其操作碼後接著目標寄存器、用來訪問存儲器的常數(偏移量)和寄存器(基址),偏移量和第二個寄存器中的基址相加即得存儲器地址。

3.邏輯操作指令

用於對字中若干位或單個位進行操作。MIPS引入或非NOR指令取代NOT,如果一個操作數為0等價於NOT。也包括異或XOR指令,當兩個操作數對應位不同時置1,相同時置0。

4.決策指令

雖然高級編程語言中有許多決策和循環語句,但在MIPS中實現其功能的基本語句是條件分支。MIPS使用slt、slti、beq、bne和$zero來創建所有比較條件,其中slt和slti用於處理有符號整數,而sltu和sltiu用於處理無符號整數。

在條件分支和跳轉指令中,指令中的地址為字地址而不是位元組地址(內存中的地址),因而16位字地址可表示18位位元組地址,26位字地址可表示28位的位元組地址。

A.例題1

設變數h存放在寄存器$s2中,數組A基址存放在$s3中,求C語句A[12]=h+A[8]對應的MIPS彙編代碼:

lw $t0, 32($s3)

add $t0, $s2, $t0

sw $t0, 48($s3)

B.例題2

變數f、g、h、i、j都是變數,對應$s0-$s4,求C語句if (i==j) f=g+h; else f=g-h對應的MIPS彙編代碼:

bne $s3, $4, Else #通常通過測試分支的相反條件來跳過then部分代碼效率更高

add $s0, $s1, $s2

j Exit

Else: sub $s0, $s1, $s2

Exit :

C.例題3

變數i和k存放在寄存器$s3和$s5中,數組基址存放$s6中,求C語句while (save[i] == k) i += 1對應的MIPS彙編代碼:

Loop: sll $t1, $s3, 2 #將i乘以4,i在C語言中對應字,4i對應位元組地址

add $t1, $t1, $s6 #與基址相加

lw $t0, 0($t1)

bne $t0, $s5, Exit

addi $s3, $s3, 1

j Loop

Exit:

知識點14:機器指令表示

指令各部分都可看成一個獨立的數(如寄存器$s0-$s7映射到數16-23,寄存器$t0-$t7映射到數8-15),將這些數拼在一起就形成指令。指令的數字形式稱為機器語言,這樣的指令序列稱為機器碼。

所有MIPS指令都是32位長,其組成為:

op欄位(6bits)+rs欄位(5bits)+rt欄位(5bits)+rd欄位(5bits)+shamt欄位(5bits)+funct欄位(6bits)

其中,op:指令的基本操作,通常稱為操作碼;rs:第一個源操作數寄存器;rt:第二個源操作數寄存器;rd:用於存放操作結果的目的寄存器;shamt:位移量,在位移指令中使用;funct:功能碼,用於指明op欄位中操作的特定變式。

MIPS保持所有指令長度相同,但不同類型指令採用不同指令格式,共有三種類型:

R型(寄存器型):上述提到的格式便為R型,例如:add $1,$2,$3

I型(立即數型):op欄位(6bits)+rs欄位(5bits)+rt欄位(5bits)+address/immediate欄位(16bits),例如:lw $1,$2,100

J型(轉移型):op欄位(6bits)+target欄位(26bits),例如:j 8000

知識點15:過程調用原理

MIPS中與過程調用相關寄存器:

1.$a0-$a3:用於傳遞參數的四個參數寄存器;

2.$v0-$v1:用於返回值的兩個值寄存器;

3.$ra:用於返回起始點的返回地址寄存器;

4.$sp:存放棧指針;

5.$t0-$t9:在過程調用中不必被調用者保存;

6.$s0-$s7:在調用過程中由被調用者保存和恢復。

MIPS中與過程調用相關指令:

1.jal 跳轉和鏈接指令:跳轉到某個地址的同時將下一條指令地址保存在寄存器$ra中。

2.jr 寄存器跳轉指令:表示無條件跳轉到寄存器所指定的地址,如jr $ra。

過程調用基本原理:

為在過程調用結束後將寄存器恢復到調用前所存儲的值,需用一個棧將寄存器保存,調用完成後恢復。調用程序(調用者)將參數值放在$a0-$a3,使用jal x跳轉到過程x(被調用者),保存寄存器,然後執行過程,將過程運算結果放在$v0和$v1,從棧中彈出數據恢復寄存器舊值,最後使用jr $ra將控制返回給調用者。

知識點16:MIPS五種定址方式

1.立即數定址:操作數是位於指令自身中的常數;

2.寄存器定址:操作數是寄存器;

3.基址定址或偏移定址:操作數在內存中,其地址是指令中基址寄存器和常數的和,如lw與sw指令;

4.PC相對定址:地址是PC和指令中常數的和;

5.偽直接定址:跳轉地址由指令中26位欄位和PC高位相連而成。

知識點17:四則運算原理

1.加減法

做補碼運算時,要將符號位和數值部分一起參加運算,並且將符號位產生的進位丟掉。

運算過程中運算結果超出機器字長所能表示的範圍稱為溢出,溢出發生時符號位可能被數值位進位佔用而產生錯誤。因此,兩個正數相加但結果位負時說明發生了溢出,反之亦然;減法時如果正數減去負數得到負結果,或負數減去正數得到正結果,則發生溢出。

2.乘法

N位乘數*M位被乘數將得到N+M位的積。演算法類似紙筆計算,每一步乘法當乘數位為1時只要將被乘數與中間結果求和,乘數位為0則跳過,因此乘法硬體只是簡單地進行了移位和加法。

乘數放置在32位乘數寄存器中,64位積寄存器被初始化為0,64位被乘數寄存器初始化時將32位被乘數放在右半部分。演算法共三個步驟:

1.乘數第0位為1則將被乘數加到積寄存器上(累加到中間結果),為0則直接進入第二步;

2.將被乘數寄存器左移1位(將被乘數與64位積寄存器中的中間結果對齊);

3.將乘數寄存器右移1位。

通過使用進位保留加法器、更多硬體與並行,能使乘法的計算速度快於5次加法。

3.除法

被除數=商*除數+餘數,正確的有符號除法演算法在源操作數的符號相反時商為負,同時使非零餘數的符號和被除數的相同。

除法的原理是每次都嘗試看最大能減掉多少除數(1倍或0倍),以此產生商。

開始時32位的商寄存器設為0,除數放置在64位除數寄存器左半邊,演算法每次的迭代將除數向右移1位來和被除數對齊,餘數寄存器初始化為被除數。演算法共三個步驟:

1.從餘數寄存器中減去除數寄存器的內容,將結果放在餘數寄存器中;

2.結果為正則除數小於等於被除數,商為1,即商寄存器左移,最低位設為1;結果為負將餘數寄存器加上除數寄存器內容恢復原值,商左移並最低位設為0;

3.除數寄存器右移1位。

可以通過預測多位商的方法來加速除法運算,在預測錯誤時及時進行恢復。

知識點18:IEEE754浮點數

十進位小數點左邊只有一位整數的記數法稱為科學記數法,一個採用科學記數法表示的數若沒有前導零且小數點左邊只有一位整數則稱為規格化數。

浮點設計需在尾數位寬和指數位寬之間找到折中辦法,增加小數部分會增加表示精度,增加指數部分會增加數的表示範圍。IEEE754單精度浮點數組成為符號1位,指數域為8位(包括指數的符號位),尾數域23位;雙精度浮點數則由兩個32位字表示,符號1位,指數11位,尾數52位。

為了將更多的數據位打包到有效位數部分,IEEE754浮點標準甚至隱藏了規格化二進位數的前導位1,因此單精度數有24位寬,雙精度有53位寬。

另外為方便比較大小,用帶偏階的記數法將最小的負指數表示為00…00,最大的正指數表示為11…11,需要從帶偏階的指數中減去偏階才是真實值。IEEE754規定單精度指數偏階為127,雙精度指數偏階為1023。

因此有單精度通用表達式(-1)^S*(1+Fraction)*2^(Exponent-127),其中F表示0和1之間的數。

IEEE754還給出了一種表示無效操作結果(如0/0或者無窮減無窮)的符號NaN,即非數。

知識點19:浮點數加法與乘法

加法演算法:

1.比較兩個數的指數,將指數較小的數進行右移,直到其指數與指數較大的相匹配(非規格化的浮點數可以有多種科學計數法的表示形式);

2.將尾數相加;

3.結果進行規格化,右移時增大指數,左移時減小指數;

4.如果指數發生上溢或下溢則異常,否則對尾數進行舍入,保留適當的位數;

5.如果舍入後發生進位,結果不是規格化數,則重複上述兩個步驟。

例如求1.0110*2^3+1.1000*2^2,先進行對階,為1.0110*2^3+0.1100*2^3,相加為10.0010*2^3,最後規格化為1.0001*2^4。

乘法演算法:

1.對兩個偏階指數相加,然後減去偏階值即可得到新的偏階指數;

2.將尾數相乘;

3.乘積進行規格化,乘積右移則增大指數;

4.如果指數發生上溢或下溢則異常,否則對尾數進行舍入,保留適當的位數;

5.如果舍入後發生進位,結果不是規格化數,則重複上述兩個步驟;

6.如果操作數符號相同,設置積的符號為正,否則為負。

知識點20:基本的MIPS數據通路(總體)

僅考慮MIPS指令集的一個核心子集:

1.存儲器訪問指令:取字lw、存字sw

2.算術邏輯指令:加法add、減法sub、與運算and、或運算or、小於則設置slt

3.分支指令:相等則分支beq、跳轉j

實現每條指令的前兩步都是:

1.程序計數器PC指向指令所在的存儲單元,並從中取出指令;

2.根據指令欄位內容選擇讀取一個或兩個寄存器;

接下來取決於具體指令類型,但大致相同:

3.除跳轉外所有指令讀取寄存器後均需使用算術邏輯單元ALU。存儲訪問指令用ALU計算地址,算術邏輯指令用ALU執行運算,分支指令用ALU進行比較;

4.使用ALU之後,儲存訪問指令需要訪問內存以存取數據,算術邏輯指令或取數指令向寄存器寫入數據,分支指令將根據比較結果決定是否改變下一條指令地址。

某些單位的數據可能來自於兩個不同的單元,需使用一個多選器邏輯單元Mux從不同的數據來源中選擇一個送給目標單元;許多單元控制依賴於指令類型,需使用控制單元決定功能單元與多選器的控制信號。

MIPS實現中的數據通路部件是指一個用來操作或保存處理器中數據的單元,包括組合單元與狀態單元。組合單元是處理數據值的單元,其輸出只取決於當前輸入,如ALU;狀態單元是帶有內部存儲包含狀態的單元,如指令存儲器、數據存儲器和寄存器。

知識點21:基本的MIPS數據通路(細節)

1.取指令並能自增PC以獲得下一條指令地址的數據通路部分。

2.實現R型指令(讀取兩個寄存器進行ALU再寫回結果)所需的兩個單元:寄存器堆和ALU。

寄存器堆即寄存器集合,通過提供5位寄存器號進行讀寫。R型指令需要4個輸入(3個寄存器號和1個寫入數據)和兩個輸出(2個讀取數據)。

ALU有兩個輸入一個輸出,一個1位輸出指示其結果是否位0,以及一個4位控制信號。

3.實現存取指令需要將基址寄存器內容與偏移地址相加,依然用到寄存器堆和ALU;需要一個單元將16位偏移地址符號擴展為32位;需要一個保存讀出或寫入數據的存儲單元。

4.分支數據通路需進行兩個操作:計算分支目標地址和比較操作數。

計算分支目標地址時使用的基地址為PC+4,另外16位偏移量將左移2位以指示以字為單位的偏移量(此舉將偏移量能表示的有效範圍擴大了4倍)。

比較可由設置為減法的ALU完成,因其提供一個指示結果是否為0的輸出信號。

5.跳轉指令將偏移地址的低26位左移兩位後,以之代替PC的低28位。

6. 得到更加細化的數據通路,該通路每個時鐘周期執行一條完整指令,未包含跳轉指令。

知識點22:基本的MIPS數據通路(加上控制單元)

1.ALU控制設計

MIPS中ALU在4位控制信號上定義了如下功能:0000與,0001或,0010加,0110減,0111小於則置位。

對於取字和存字指令ALU用加法計算存儲器地址;對於R型指令根據指令funct欄位ALU執行以上5種操作中一種;對相等則分支指令,由ALU執行減法操作。

指令的6位funct欄位和2位ALUOp欄位用於生成4位控制信號。ALUOp位由操作碼決定,00表示存取指令的加法,01表示分支指令的減法,10表示由指令funct欄位決定。通過設計一張真值表,優化並轉換為門電路便可設計出生成4位控制信號的邏輯單元。

2.7條控制信號

控制信號的取值為0、1或任意值X。除PCSrc控制信號外,所有控制信號都可由控制單元只根據指令的操作碼來確定,而PCSrc信號有效的條件是指令為相等則分支且用於等值比較的ALU的零輸出有效。

3.包含控制單元和控制信號的數據通路

一個時鐘周期執行一條指令的實現機制稱為單時鐘周期實現,單周期設計中時鐘周期對所有指令等長,因此時鐘周期由執行時間最長的那條指令決定(幾乎可以肯定是取數指令)。全部指令都選用一個CPU周期完成的系統被稱為單周期CPU,其CPI=1。

知識點23:流水線技術

流水線是一種實現多條指令重疊執行的技術,與生產流水線類似,只要每一個操作步驟中都有獨立的工作單元時就可以用流水線方式快速完成任務。

MIPS流水線具有5個步驟:1.從指令存儲器中讀取指令;2.指令解碼的同時讀取寄存器;3.執行操作或計算地址;4.從數據存儲器中讀取操作數;5.結果寫回寄存器。每個步驟由一個專門的功能部件來實現,每個部件後面都有一個緩衝寄存器或稱為鎖存器,來保存本流水段的結果。

流水線帶來的性能提高是通過增加指令吞吐率而不是減少單條指令的執行時間實現的,如果所有步驟所需時間一樣且有足夠的工作可做,流水線速度提高倍數等於流水線中步驟的數目,但流水線開銷等問題會使加速比小於流水線級數。與多處理器編程相比其優勢在於它對程序員不可見。

流水線模型中每個步驟只花費一個時鐘周期時間,因此時鐘周期必須滿足最慢操作的執行需要。流水線中各段的時間應該盡量相等,否則會引起「堵塞」和「斷流」現象。流水線需要有裝入時間和排空時間,只有當流水線完全充滿時才能充分發揮效率。

知識點24:局部性原理及相關概念

局部性原理表明了在任何時間內,程序訪問的只是地址空間相對較小的一部分內容。其中,時間局部性是指某個數據項在被訪問之後可能很快被再次訪問(比如程序包含的循環結構);空間局部性是指某個數據項在被訪問之後,與其地址相近的數據項可能很快被訪問(比如指令通常順序執行)。

可利用局部性原理將計算機存儲器組織成為存儲器層次結構,其由不同速度和容量的多級存儲器構成。數據每次只能在相鄰的兩個層次之間進行複製交換,將存儲信息交換的最小單元稱為塊或行。當採用合適的操作機制時,這種結構允許處理器的訪問時間主要由層次結構中的第一層來決定,而整個存儲器的容量則和第n層一樣大。

命中率:在高層存儲器中找到目標數據的存儲訪問比例;

缺失率:在高層存儲器中沒有找到目標數據的存儲訪問比例;

命中時間:訪問某存儲器層次結構所需要的時間,包括了判斷當前訪問是命中還是缺失所需的時間;

缺失代價:將相應的塊從低層存儲器替換到高層存儲器所需的時間,包括訪問塊、將數據逐層傳輸、將數據插入發生缺失的層和將信息塊傳送給請求者的時間。

知識點25:存儲器技術

目前構建存儲器層次結構主要有4種技術。

第一種是SRAM,用於實現cache。SRAM對任何數據訪問時間是固定的,而且SRAM不需要刷新;

第二種是DRAM,用於實現主存儲器。DRAM在電容上保存電荷,因此不能長久保持數據需要周期性刷新,這也是稱為動態的原因;

第三種是快閃記憶體,是一種電可擦除的可編程只讀存儲器(EEPROM),常用作個人移動設備中的二級存儲器。對快閃記憶體的寫操作可使得存儲位損耗,使用損耗均衡技術使寫操作盡量分散;

第四種是磁碟,通常是伺服器中容量最大速度最慢的一層。一個磁質硬碟包含一組圓形磁碟片,每層表面有一個包含小電磁線圈的讀寫磁頭。每個磁碟表面劃分為同心圓盤稱為磁軌,每個面通常有幾萬條磁軌,每條磁軌被劃分為幾千個扇區,扇區是磁碟上數據讀寫的最小單位。磁碟訪問數據通常分三步,第一步將磁頭移動到適當磁軌,該過程稱為尋道,所需時間稱為尋道時間;第二步是將要訪問的扇區轉動到讀寫頭下面,該等待時間稱為旋轉延時;第三步是傳輸一塊數據,該時間是傳輸時間。

知識點26:Cache基本原理

高速緩衝存儲器cache是設置於主存和CPU之間的存儲器,用SRAM實現,緩存了CPU頻繁訪問的信息,對程序員透明。CPU讀主存時,便把地址同時送給cache和主存,若在cache中(命中)立即傳給CPU,否則(缺失)用主存讀周期把此字從主存讀出送到CPU,與此同時把含有這個字的整個數據塊從主存讀出送到cache中。

當CPU和主存間速度差別很大時採用兩級或多級Cache。如Intel酷睿i7 930中,L1 Cache有256KB,L2 Cache有1MB,L3 Cache有8MB。

1.讀數據

在cache中為主存中每個字分配一個位置最簡單方法,是每個存儲器地址僅僅對應到cache中一個確定的地址,稱為直接映射。比如可使用「塊地址 mod cache中的塊數」,當cache的塊數是2的冪時只需要取地址的低幾位即可(如8塊則取低3位)。還需增加一組標記,其中包含了地址信息(如選取沒有用來檢索cache的那些高位),因而cache塊的索引以及標記唯一確定了cache塊中存放的主存地址。另外還用一個有效位來標識一個塊是否含有一個有效數據。

2.寫操作

為保持一致性將數據同時寫入主存和cache中,稱為寫直達。寫直達無法提供良好的性能,解決方法是採用寫緩衝,當一個數據等待被寫入主存時先放入寫緩衝中繼續執行處理器,如果寫緩衝滿了當處理器執行到一個寫操作時則必須停下來。

除寫直達外另一種方法稱為寫回,當發生寫操作時新值僅僅被寫入cache,只有當修改過的塊被替換才寫到較低層存儲結構中。寫回可提高系統性能,但實現也更複雜。

3.全相聯與組相聯

與直接映射不同,全相聯是塊可以放置到cache中的任何位置,而組相聯是塊可以放置到cache中的部分位置(至少兩個)。

全相聯cache中找指定塊需檢索cache中所有項,因而只適合塊數較少的cache。

組相聯cache中每個塊可被放置的位置數是固定的,每個塊有n個位置可放的cache被稱作n路組相聯cache。一個塊首先被直接映射到一個組,然後檢索該組中所有的塊,組可由「塊號 mod cache中的組數」得出。


推薦閱讀:
相关文章