以通用串行總線USB(Universial Serial Bus)爲例子來理解什麼是總線,
首先它提供了對外的鏈接接口,不一樣的設備(鼠標、鍵盤、U盤、移動硬盤)經過這個接口均可以進行鏈接,USB也成爲了鏈接標準,促使外圍設備接口的統一。除此之外還有PCI總線,Thunderbolt總線等等,總線是爲了解決不一樣設備之間的通信問題。html
總線分爲片內總線和系統總線兩類。算法
總線仲裁主要是解決了不一樣組件使用總線的優先級。
經常使用的總線總裁的方法有以下三種:緩存
常見的輸入設備分爲字符輸入設備和圖像輸入設備。服務器
字符輸入設備
最多見的字符輸入設備是鍵盤,鍵盤能夠分爲薄膜鍵盤、機械鍵盤按照不一樣的段落感、聲音、壓力和鍵程序分爲黑軸、紅軸、青軸、茶軸四種和電容鍵盤。架構
圖形輸入設備
最多見的圖形輸入設備有鼠標、掃描儀。框架
圖像輸出設備
最多見的圖形輸出設備有液晶顯示器,打印機以及投影儀。dom
輸入輸出接口的通用設計主要有如下幾點異步
數據線:是IO設備與主機之間的信息交換傳輸線,按照用途不一樣分爲單向傳輸線和雙向傳輸線。性能
狀態線:IO設備狀態向主機報告的信號線,主機能夠經過狀態線查詢設備是否已經正常鏈接並就緒,同時還能夠查詢是否已經被別的設備佔用。學習
命令線: CPU向設備發送命令的信號線,例如讀寫信號、啓動、中止信號。
設備選擇線:主機選擇與IO設備進行操做的信號線,對鏈接在總線上的設備進行選擇。
CPU與IO設備的通信方法主要有程序中斷的方法以及DMA(直接存儲器訪問)兩種
程序中斷提供低速設備通知CPU的一種異步方式,CPU能夠高速運算的同時兼顧低速設備的響應,可是CPU速度與IO設備速度不匹配,因此會下降CPU的效率。
存儲器的分類按照存儲介質能夠分爲半導體存儲器和磁存儲器
常見的半導體存儲器有內存、固態硬盤。
常見的磁存儲器有磁盤。
存儲器按照存取方式分類能夠分爲以下三種:
隨機存儲器(RAM),能夠隨機讀寫,存儲的時間和位置沒有關係。
串行存儲器,存儲的時間和位置有關係,
只讀存儲器(ROM),只讀不寫,例如手機的固件,電腦的BIOS。
在選配磁盤時考慮的一般是讀寫速度以及磁盤的容量和價格三大因素,而存儲器的層次結構能夠分爲緩存、主存和輔存。
緩存是CPU的寄存器和高速緩存,容量最低,速度最快,價格最高
主存就是計算機的內存,容量適中,速度適中,價格適中
輔存就是計算機的外部存儲設備,例如磁盤、移動硬盤等。 容量最高,速度最慢,價格低
在計算機存儲結構中,CPU能夠和高速緩存、主存直接進行通信,高速緩存和主存能夠直接進行通信,這種層次結構被稱爲緩存-主存層次,其實現方式就是在CPU和主存之間加一層速度快可是容量小的高速緩存, 用於解決CPU和主存速度不匹配的問題。
其實現原理就是局部原理:CPU訪問存儲器時,不管是存取指令仍是存取數據,所訪問的存儲單元都趨於彙集在一個較小的連續區域中,CPU將程序常常訪問的內存數據加載到緩存中,而後直接訪問緩存便可。
主存和輔存直接進行通信,這種層次被稱爲主存-輔存層次,其實現就是在主存以外增長輔助存儲器,其目的是解決主存容量不足的問題。
計算機的主存儲器也被稱爲隨機存儲器(Random Access Memory)即內存,RAM經過電容存儲數據,必須每隔一段時間刷新一次,若是掉電,那麼一段時間後將丟失全部數據。
內存由半導體存儲體、驅動器、譯碼器、讀寫電路和控制電路組成。
CPU經過內部的主存數據寄存器(mdr)經過數據總線訪問讀寫電路,同時CPU的主存地址寄存器(MAR)經過地址總線指定數據的位置,而後經過數據總線傳輸數據。
不一樣的操做系統對內存的支持是不同的,目前最經常使用的操做系統分爲32位和64位。
32位系統最大支持4GB內存。所以32位系統的地址總線只有32位數
而64位系統支持超過4GB的內存,例如筆記本的8GB-64GB,服務器一般是16GB-256GB。
目前計算機中經常使用的輔助存儲器有磁盤、移動硬盤。
計算機的高速緩存位於CPU和主存之間,其出現的目的是爲了解決CPU與主存速度不匹配,提升CPU效率。
爲了瞭解高速緩存的工做原理,首先須要瞭解主存的相關概念:字和字塊
字:存放在一個存儲單元的二進制代碼組合,一個字能夠表示數據、指令或者字符串
字塊:存儲在連續的存儲單元中而被看作一個單元的一組字,即字塊包含了多個字。
假設一個字有32bits,一個字塊共有B個字,主存共有M個字塊。
那麼主存總字數=BM,而主存總容量=BM*32bits
而字的地址包含兩個部分,前m位表示字塊在內存中的地址,後b位指定字在當前字塊的地址。所以2m=M(總字塊),2b=B(總字數)。
假設主存的用戶空間爲4G,字塊大小爲4M,字長位32位,則對於字地址中的塊地址m和塊內地址b的位數,至少應該是多少?
首先求出字塊數:4G/4M=4*1024M/4=1024
字塊地址m: log2(1024)=10
log2(1024)屬於對數運算,其計算結果可使用Windows10自帶的計算器獲取,
首先切換至科學型,默認是標準型,而後分別輸入102四、log、/、二、log、=便可以求出結果
塊內字數:4M/32bit=1048576
塊內地址:log2(1048576)=20
log2(1048576)也是屬於對數運算,其計算結果可使用Windows10自帶的計算器實現獲取,
首先切換至科學型,默認是標準型,而後輸入104857六、log、/、二、log、=便可以求出結果
根據計算結果m≥10,b≥20得知字地址的塊地址至少是10位,字地址的塊內地址至少是20位。
高速緩存和主存的存儲邏輯結構相似,緩存相對於主存容量較小,速度更快等特色。
CPU訪問高速緩存的兩種狀況
命中率和訪問效率是衡量緩存的重要性能指標
理論上CPU每次都能從高速緩存中獲取數據的時候,命中率爲1,可是因爲高速緩存的容量遠遠小於主存的容量,所以命中率不可能爲1。
命中率(h)計算的公式: 訪問高速緩存的次數佔總次數的比例
訪問主存的次數:Nm
訪問Cache的次數Nc
h=Nc/(Nc+Nm)
訪問效率:e
訪問主存的時間:tm
訪問緩存的時間爲tc
訪問Cahe-主存 系統平均時間:ta=h*tc+(1-h)*tm
e=tc/ta=tc/h*tc+(1-h)*tm
緩存的命中率和訪問效率例子:
假設CPU在執行某段程序時,共訪問了Cache命中2000次,訪問主存50次,已知Cache的存取時間爲50ns,主存的存取時間爲200ns,求Cache-主存系統的命中率、訪問效率以及平均訪問時間。
命中率計算公式:
h=Nc/(Nc+Nm)
h=2000/(2000+50)≈0.97 即緩存的命中率爲97%
訪問效率計算公式:
e=tc/ta=tc/htc+(1-h)tm
e=tc/ta=tc/htc+(1-h)tm=50/(0.97*50+(1-0.97)200)=50/(48.5+0.03200)=50/54.5≈0.917
CPU訪問存儲系統的平均訪問時間
ta=0.97*50+(1-0.97)200)=48.5+0.03200=54.5ns
在CPU執行程序時,爲了提升執行效率,應該儘可能從高速緩存中獲取數據,也就是提升緩存的命中率和訪問效率,此時須要良好的替換策略,高速緩存的替換時機是CPU須要的數據不在高速緩存中,此時須要從主存中獲取數據,此時按照相關的策略替換高速緩存的數據,經常使用的高速緩存替換策略有以下幾種策略。
假設緩存一共能夠緩存1-8一共8個字塊,CPU運行程序時某次任務觸發了緩存替換,須要將第9個字塊存儲到高速緩存中,此時根據FIFO的特性,第一個字塊的數據將會從高速緩存中移除,而後將第九個字塊放到高速緩存中。
最不常用法(LFU)
LFU優先淘汰掉最不常用的字塊,所以須要額外的空間記錄字快的使用頻率,假設在某個時刻觸發替換的行爲,此時會將命中頻率最低的字塊替換掉。
最近最少使用算法(LRU)
LRU優先淘汰一段時間內沒有使用的字塊,有多種實現方法,一般使用雙向鏈表實現,把當前訪問的字塊節點至於鏈表的前面,保證鏈表頭部的字塊是最近使用的,當須要淘汰的時候將鏈表尾部的字塊淘汰掉。
機器指令由操做碼和地址碼兩部分組成。
其中操做碼指明瞭指令所要完成的操做,操做碼的位數反映了機器的操做種類,例如操做碼有8位,即有2^8=256種操做。
地址碼是給出操做數或者操做數的地址,由於機器指令本質上是操做數據,CPU根據數據或者數據的地址進行相應的運算,地址碼分爲三地址指令、二地址指令和一地址指令。
三地址指令的機器指令包含操做碼(OP),地址1(addr1),地址2(addr2),地址3(addr3),三地址指令一般會完成(addr1)OP(addr2)->(addr3),以操做碼爲加法爲例子,將add1和add2對應的值相加,而後將相加的結果存放在addr3中。
二地址指令的機器指令包含操做碼(OP),地址1(addr1)和地址2(addr2),二地址指令一般會完成(addr1)OP(addr2)-->(addr1)或者->(addr2),即將addr1和addr2按照操做碼進行相關的運算後將結果存儲在addr1或者addr2中,二地址指令則能夠理解爲相似a=a+b這樣的操做。不過這個只是從較爲宏觀的角度去理解指令了。在計算機內部,a=a+b可能會分紅多個指令去執行,好比:先將變量從內存加載到通用數據寄存器,而後從通用數據寄存器移動到ALU的緩衝寄存器,而後再作運算,而這裏的數據移動也能夠理解爲二地址指令(源地址->目的地址)。
一地址指令的機器指令(addr1)OP->(addr1)或者(addr1)OP(ACC)->(addr1),一地址指令最經常使用的操做就是自增運算,只有一個操做數。
除了有地址指令以外還有一種零地址指令,即在機器指令中無地址碼,例如空操做、停機操做和中斷返回操做等等。
機器指令的操做類型主要有數據傳輸類型,算術邏輯操做類型,控制指令類型三種。
數據傳輸包含寄存器之間、寄存器與存儲單元以及存儲單元(高速緩存、主存、輔存)之間傳輸,而數據讀寫、交換地址數據、清零、置一等操做都是數據傳輸類型。
算術邏輯操做包含 操做數之間的加減乘除運算,與或非等邏輯運算以及移位運算(左移(乘以2),右移(除2)操做。
控制指令包含等待指令、停機指令、空操做指令、中斷指令等等。
機器指令的尋址方式包含指令尋址和數據尋址兩種方式
指令尋址包含順序尋址和跳躍尋址
順序尋址就是按照指令的順序依次執行,而當遇到跳轉指令時須要跳轉尋址。
數據尋址主要有當即尋址、直接尋址和間接尋址三種方式。
當即尋址:指令能夠直接包含操做數,即無須要訪問存儲器,直接從指令獲取操做數 例如指令 OP addr1 6,優勢是速度很是快,可是地址碼位數限制操做數的表示範圍。
直接尋址:機器指令直接給出操做數在主存的地址,直接尋址尋找操做數簡單,無需計算數據的地址,優勢是速度較快,缺點是地址碼的位數限制操做數的表示範圍。
間接尋址:指令地址碼給出的是操做數地址的地址,例如指令 R1(OP)(add2),add2是主存操做數地址的地址,所以須要訪問一次或者屢次主存來獲取操做數。優勢是操做數的尋址範圍大,缺點是速度慢。
計算器控制器的做用是協調和控制計算機運行,計算機控制器包含以下幾部分組成
程序計數器
程序計數器主要是用來存儲下一條指令的地址,當程序運行時,CPU循環從程序計數器中獲取指令,當指令被拿出時,程序計數器會指向下一條指令,程序計數器是提供給其餘控制單元當前須要執行指令的地址。
時序發生器
時序發生器屬於電器工程領域,用於發送時序脈衝,CPU依據不一樣的時序脈衝有節奏的進行工做。生活中學習各類樂器根據節拍器學習,而時序發生器就是相似於樂器的節拍器。
指令譯碼器
計算機指令由操做碼和地址碼組成,指令譯碼器會翻譯操做碼對應的操做以及控制傳輸地址碼對應的數據。
寄存器
總線
用於控制器和其餘組件通信
計算機的運算器主要是用來進行數據的運算,由以下部分組成
數據緩衝器
數據緩衝器分爲輸入緩衝和輸出緩衝,輸入緩衝暫時存放外部設備輸入的數據,輸出緩存暫時存放送往外部設備的數據
算術邏輯單元:(ALU)
ALU能夠完成算術運算、邏輯運算、位運算,至於ALU是如何運算,請聽下回分解。
狀態字寄存器
狀態字寄存器用於存放運算的狀態,例如條件碼、進位、溢出、結果正負等等,同時能夠存放運算的控制信息,例如調試程序時的調試跟蹤標記位以及容許中斷位等等。
通用寄存器
主要是用於暫時存放或傳送數據或指令,同時能夠保存ALU運算的中間結果,容量比通常專用寄存器大。
總線
用於運算器和其餘組件通信
計算機指令執行主要包含取指令、分析指令、執行指令三個步驟,這三個步驟由高速緩存(緩存數據和指令)、運算器、控制器完成,而CPU內部的高速緩存、運算器和控制器和由片內總線鏈接,爲了演示指令執行的過程,首先將指令執行過程當中使用的相關的設備和測試數據羅列出來。
高速緩存
數據緩存測試數據
地址 | 數據 |
---|---|
1 | 188 |
2 | 199 |
3 | 110 |
4 | 120 |
地址緩存測試數據
地址 | 操做碼 | 地址碼 |
---|---|---|
101 | MOV | R0,R1 |
102 | LAD | R1,6 |
103 | ADD | R1,R2 |
104 | ADD | R1,R3 |
105 | JMP | 102 |
運算器
控制器
這裏以執行地址緩存測試數據爲101的指令:將R0的值移動到R1中 爲例,說明指令執行的過程
高速緩存緩存數據(數據、指令)->程序計數器存儲指令地址->指令緩存 根據指令地址獲取操做碼、地址碼->指令寄存器緩存操做碼、地址碼->指令譯碼器譯碼->程序計數器加1->運算器->寄存器->ALU->狀態字寄存器->數據緩衝器。
CPU在執行程序時,首先將內存中的機器指令的數據以及指令緩存在CPU的高速緩存中,而後從高速緩存中獲取指令執行。首先程序計數器將當前執行的指令地址爲101緩存起來,可是程序計數器只知道指令的地址,而不知道指令具體的內容,程序計數器能夠根據指令的地址經過總線訪問高速緩存的指令緩存來獲取指令地址爲101的操做碼(MOV)和地址碼(RO,R1),再經過片內總線訪問指令寄存器,將指令的操做碼(MOV)和地址碼(R0,R1)緩存起來,由於指令寄存器不知道指令的具體內容,同時還須要將指令發送到指令譯碼器,發送指令以後程序計數器要加1,此時程序計數器存儲下一條執行的指令102,指令譯碼器拿到地址爲101的指令負責譯碼(理解指令的具體內容:將R0寄存器的數據移動到R1寄存器中去)後發出控制信號,指令譯碼器經過片內總線進入運算器中,運算器獲取控制信號後將R0加載到ALU中去進行相關的運算,再把R0的數據經過數據總線傳輸到數據緩衝器,數據緩衝器將R0的值覆蓋到R1,此時R1的值就是100,此時高速緩存地址爲101的指令完成。
取指令
CPU在執行程序時,首先將主存中的機器指令緩存在高速緩存中,而後從指令緩存中獲取指令,並將指令送到指令寄存器。
分析指令
首先從指令寄存器取出指令傳輸到指令譯碼器進行譯碼操做,識別區分不一樣的指令類別和各類操做數據的方法。而後指令譯碼器發出控制信號,同時程序計數器加1,指向下一條指令。
執行指令
首先裝載數據到寄存器,經過ALU處理數據,若是有進位、溢出會經過狀態字寄存器記錄運算狀態,最後將運算結果返回。
在指令的執行過程當中取指令和和分析指令是由控制器完成的,而執行指令主要是由運算器完成的,也就是運算器和控制器不能同時工做,這樣會致使CPU的綜合利用效率不高,所以咱們須要改進指令執行的過程來提升CPU的效率。
CPU的流水線設計相似於工廠的裝配線,其特色是工廠的裝配線使得多個產品能夠被加工,在同一個時刻,不一樣的產品位於不一樣的加工階段。
在未使用流水線設計以前,若是想要執行兩條指令的流程以下
取指令->分析指令->執行指令->取指令->分析指令->執行指令 串行執行的。
在使用流水線設計以後,若是想要執行多條指令的流程以下
指令 | 時間片 | 時間片 | 時間片 | 時間片 | 時間片 | 時間片 | 時間片 | 時間片 | 時間片 |
---|---|---|---|---|---|---|---|---|---|
1 | 取指令 | 分析指令 | 執行指令 | ||||||
2 | 取指令 | 分析指令 | 執行指令 | ||||||
3 | 取指令 | 分析指令 | 執行指令 | ||||||
4 | 取指令 | 分析指令 | 執行指令 | ||||||
5 | 取指令 | 分析指令 | 執行指令 | ||||||
6 | 取指令 | 分析指令 | 執行指令 | ||||||
7 | 取指令 | 分析指令 |
因爲每一個時間片都有一條或者多條指令正在執行,CPU流水線設計的執行指令效率是串行執行效率的三倍左右,公式以下所示
串行執行m條指令: T1=3t*m
流水線執行m條指令: T2=t*(M+2)
效率計算方式以下所示:
H=T2/T1=t*(m+2)/3tm=1/3+1/(3m)