RSIC:精簡指令集。CISC:複雜指令集 算法
RISC結構具備比較少的指令,這些指令是簡單的指令(固定長度的指令和較少的尋址模式)。CISC結構具備更多的指令,更加複雜,可變長度指令和更加多的尋址方式編程
RISC具備較小的指令,硬件上相對沒有那麼複雜。CISC使用更加複雜的硬件來解碼和分解複雜的指令。所以RISC更加側重軟件,CSIC更加側重硬件緩存
CISC具備更加複雜的指令,所以可使用更加少的RAM來存儲編程指令。相對的,RISC須要更加多的RAM來存儲指令數據結構
RISC的指令一般須要一個週期完成,而CISC能夠能須要多個週期才能完成,具體取決於指令的複雜性。所以在RISC中能夠進行流水線化。架構
RISC經過減小每條指令的週期數來提升性能,而CISC經過減小每條程序的指令數來提升細嫩那個。CISC支持單條指令完成從內存讀取,執行操做,寫回內存的操做(mem2mem操做)。而RISC完成則須要三個指令。app
馮諾依曼結構中,指令和數據存儲在同一個存儲器中。CPU讀取數據和指令使用同一條總線,具備存儲數據和指令的統一緩存。dom
哈佛結構中,數據和指令是分開存儲的,可使用兩條不一樣的總線同時訪問數據和指令,指令和數據都具備單獨的緩存。異步
字節順序是指字節在內存中的存儲順序。數據在內存中一般是按照字節尋址的,可是大多數計算即一般採用32位(4個字節)存儲操做數的。所以,爲了將一個字節存在存儲器中,由兩種方式:ide
高字節存在低地址中,這稱之爲Big Endian函數
低字節存在低地址中,這稱之爲Little Endian
例如,當cpu向地址0x1000中寫入0xDDCCBBAA時,兩種方式就會出現差別
DRAM:Dynamic Random Access Memory。動態隨機存儲,數據以電荷的形式存儲,每一個存儲單元是由晶體管和電容組成的,數據存在電容中。DRAM是易失性設備,電容會由於漏電而流失電荷,因此須要定時刷新。
SRAM:Static Random Access Memory。靜態隨機存儲,不須要屬性,只須要電源便可,SRAM的存儲單元由六個晶體管組成,所以與DRAM相比,佔用面積更加多。
SRAM速度快,成本搞,經常使用於高速緩存。DRAM密度小,速度慢,經常使用於主存儲器
256KB=2^8*2^10Bytes,須要18位地址線
Program Counter (PC):保存當前正在執行的指令的地址
Instruction Register (IR):保存當前正在執行的指令的寄存器。(PC所指向的地址上的值)
General Purpose Registers:通用寄存器是用於存儲程序所須要的數據,通用寄存器的數量由體系結構定義,並能夠由軟件用於運行期間零是存儲數據。
Stack Pointer Register (SP):堆棧指針寄存器用於存儲壓入隊長的最新數據的地址。常見的用途是存儲子函數調用時的返回地址。
流水線技術是在單個處理器中實現指令集並行的技術。將基本的指令週期拆分爲多個階段,無需等待每條指令完成,並行執行不一樣的步驟,在一條指令結束以前開始下一條指令。流水線能投提升指令的吞吐率,可是並不能減少指令的指令時間。
pipeline hazard是指因爲某些緣由下一條指令沒法執行的狀況。有三種類型的hazard:
Structural Hazards:因爲硬件資源不足產生的。好比若是設計結構中只有一個浮點執行單元,每次執行都須要兩個週期的時間,那麼當程序中出現背靠背的浮點指令時會致使流水線中止。除此以外內存和緩存的訪問也會致使Structural Hazards
Data Hazards:因爲先後指令數據的依賴性而形成的hazard
A、RAW:先讀後寫register,ture data dependence
B、WAW:先寫後寫register,output data dependence
C、WAR:先寫後讀register, anti-data dependence
Control Hazards:當碰到跳轉指令時,processor會stall一個cycle。 由於processor在處理指令時會分兩個stage:取指令和解碼指令。 當一條指令進入到解碼階段時,纔會被發現須要跳轉,因此在取指令階段 的那條指令會被廢掉,故浪費掉一個cycle。
Structural Hazards:將一個function unit切分紅更小的stage或對設計相同功能的硬件等,總之,就是讓硬件資源夠用。
Data Hazards:A狀況是真正的數據依賴,會產生hazard,能夠用forwarding技術來減小或消除它;而B和C是在當指令順序被compiler或者是硬件調整後纔會出現的數據依賴。若是出現了B和C的狀況,能夠有一種技術來消除它,叫作register renaming。
Control Hazards:能夠在program中加入likely()or unlikely()來幫助compiler預測taken or not taken的可能性。另外,compiler能夠經過delayed-branch的技術來消除branch hazard,可是該技術不多用在很長的pipeline中。最後,能夠經過硬件的技術消除Brach hazard。以上的技術都是compiler或hardware的技術,programmer能夠不關心,但好的if語句應該 以下:
if(unlikely(condition))
{
概率小
}
else
{
概率大
}
注意:將概率大的語句放在not taken下面,將概率小的語句放在taken下,這樣會節省4個
cycle左右(由pipeline的深度決定)。另外,還有一種寫法就是將unlikely改成likely,將概率大的和概率小的對調,這種方法比第一種方法要慢或持平(至於緣由有compiler的緣由,有pipeline的緣由,因此它依賴於compiler和chip的設計)。
第一個數據須要10ns完成,此後1ns完成一個數據的處理,所以總時間位10+99=109ns
當即數尋址,操做數做爲指令的一部分
add r0 r1 0x12 將r1+0x12的結果存在r1
直接尋址,操做數的地址直接出如今指令中
load r0 0x10000 將地址0x10000的數據存到r0中
寄存器尋址,操做數被存在寄存器中,寄存器的名字出如今指令中
mul r0, r1 , r2 將r1*r2的結果存在r0中
偏移量尋址,操做數的地址由一個寄存器的數據加上一個當即數的偏移量獲得
load r0 r1 offset r1包含了及地址,r1+offset纔是真實的地址
局域性原理:程序經常重複使用它們最近用過的數據和指令。一條普遍適用的經驗規律是:一個程序90%的執行時間花費在僅10%的代碼中。局域性意味着咱們能夠根據一個程序最近訪問的指令和數據,比較準確地預測它近期會使用哪些內容。局域性的原理也適應於數據訪問,不過不像代碼訪問那樣明顯。
時間局域性是指最近訪問過的內容極可能會在短時間內被再次訪問。
空間局域性是指地址相互臨近的項目極可能會在短期內都被用到。
Register
Cache
Main Memory/Primary Memory
Secondary Memory (Magnetic/Optical)
cache是小型的快速存儲。一般在Main Memory和CPU之間,有時放置於CPU內。
每當CPU請求存儲位置的內容時,都會首先檢查cache中是否有此數據。若是cache中存在數據,則CPU直接從cache中獲取數據。 因爲不須要CPU進入該數據的Main Memory,所以速度更快。 若是緩存中不存在數據,則將一塊數據從Main Memory讀取到cache中,而後以字塊的形式從cache中傳輸到CPU。
在cache中查找地址時,若緩存中包含該內存位置,稱之爲cache hit。若是在cache找不到,則稱之爲cache miss。
鏈表是一種將其元素存儲在非連續存儲位置中的數據結構,而向量是一種將元素存儲在連續位置中的數據結構。 對於具備cache的設計:若是cache中存在一塊數據,則極可能在cache中也存在後續的連續數據,由於一般是從主存儲器到高速緩衝存儲器的任何取指令 根據緩存行(一般爲64或128字節)獲取。 所以,在擁有cache的機器上,經過向量進行搜索將比鏈表進行搜索更快。
一共有三種主要的映射方法。這三種映射中,主存儲器和cache都被劃分爲存儲塊(blocks of memory,也稱cache line,每一個64bytes),這是映射時的最小單位。
直接映射(Direct Mapping):直接映射中,主內存和cache中始終存在一對一的映射,一組只有一個數據塊。例如:在下圖中,cache大小爲128個塊,而主內存中有4096個塊。設計實現是基於模數計算獲得的,i爲cache的塊序號,j是主內存的塊編號,m是cache的行數,i = j mod m。若是塊的大小爲64B而地址爲32爲,則地址[5:0]稱爲字節偏移量,它說明字節在塊中的位置,地址[12:6]稱爲組位,說明地址地址映射到哪一組,剩下的地址位做爲標誌位,標誌說明cache映射了哪些內存中的地址。這是最簡單的映射,而且能夠經過內存地址能夠輕鬆計算cache中的數據在內存中的位置,而且只須要一個標記爲進行比較就能知道是否命中。這種映射的缺點是命中率低, Cache的存儲空間利用率低。
全局關聯映射(Fully Associate Mapping):任何的內存塊都能映射到cache的任何塊中,使用和上面的圖同樣的例子,地址[5:0],做爲塊內部的索引,剩下的全部位都用於和cache中的全部標記爲進行比較,這須要很大的比較器。雖然這種方式命中率較高,Cache的存儲空間利用率高,可是線路複雜,成本高,速度低
組關聯映射(Set Associate Mapping):將cache分紅u組,每組v行,主存塊存放到哪一個組是固定的,至於存到該組哪一行是靈活的,即有以下函數關係:cache總行數m=u×v,組號q=j mod u組間採用直接映射,組內爲全相聯。例如,下圖顯示了128個塊的相同高速緩存,這些高速緩存組織爲64個集合,每一個集合具備2個塊。硬件較簡單,速度較快,命中率較高,可是與分組有關係。
更高關聯性的cache意味着須要更加大的比較器,用於將傳入的地址和標籤進行對比,會致使更加大的硬件需求和功耗。
cache的索引位有4位,所以cache包含2^4=16個塊,每一個塊只有1byte因此不須要塊內索引,剩下的16-4=12位所有做爲標記位
cache的塊的數量爲256K/64=4096,而cache爲四路關聯,則組數量爲4096/4=1024。64byte的cache line 須要6位進行塊內索引,10位進行集合索引,剩下的32-6-10=16位做爲標記爲
直寫式緩存方式: 當CPU要將數據寫入內存時,除了更新緩衝內存上的數據外,也將數據寫在SDRAM中以維持主存與緩衝內存的一致性,當要寫入內存的數據多起來的話,速度天然就慢了下來.
回寫式緩存方式: 當CPU要將數據寫入內存時,只會先更新緩衝內存上的數據,隨後再讓緩衝內存在總線不塞車的時候才把數據寫回SDRAM,因此速度天然快得多
回寫緩存在內存帶寬利用方面更好,由於僅在須要時纔回寫數據。 若是系統中存在多個能夠緩存同一地址的cache,則維護數據一致性很是複雜,由於內存可能並不老是具備最新數據。
cache的inclusive和exclusive屬性適用於具有多級緩存的設計。
當CPU試圖從某地址load數據時,首先從L1 cache中查詢是否命中,若是命中則把數據返回給CPU。若是L1 cache缺失,則繼續從L2 cache中查找。當L2 cache命中時,數據會返回給L1 cache以及CPU。若是L2 cache也缺失,很不幸,咱們須要從主存中load數據,將數據返回給L2 cache、L1 cache及CPU。這種多級cache的工做方式稱之爲inclusive cache。某一地址的數據可能存在多級緩存中。
與inclusive cache對應的是exclusive cache,這種cache保證某一地址的數據緩存只會存在於多級cache其中一級。也就是說,任意地址的數據不可能同時在L1和L2 cache中緩存。
exclusive cache的優勢之一是多級cache能夠一塊兒存儲更多的數據。通常使用inclusive cache類型,每次cache miss,能夠從下一級的cache中尋找,load。而exclusive cache,每次cache miss,只能去main memory中load。可是exclusive cache比較節省cache size。
如下是一些可用於替換cache line的算法
LRU(Least Recently Used):將最近最少使用的內容替換出cache
MRU (Most Recently Used):與MRU,將最近常常的內容提出cache
PLRU (Pseudo LRU):關聯性很大的時候,LRU的實現成本很高。若是實際狀況在丟棄任一個最近最少使用的數據就能知足,那麼僞LRU算法就派上用場了,它爲每個緩存數據設立一個標誌位就能夠工做。
LFU (Least Frequently Used):這個緩存算法使用一個計數器來記錄條目被訪問的頻率。經過使用LFU緩存算法,最低訪問數的條目首先被移除。這個方法並不常用,由於它沒法對一個擁有最初高訪問率以後長時間沒有被訪問的條目緩存負責。
Random replacement:在該算法中,不存儲任何信息,而且在須要替換時選擇一條隨機行。
在多個處理器擁有本身的cache的共享多處理器系統中,相同數據(相同地址)的多個副本可能會同時存在於不一樣的cache中。 若是容許每一個處理器自由更新cache,則可能致使內存視圖不一致。 這稱爲高速緩存一致性問題。 例如:若是容許兩個處理器將值寫入同一地址,則在不一樣處理器上讀取同一地址可能會看到不一樣的值。
Snoop based Coherence Protocol:來自處理器的數據請求將發送到共享系統一部分的全部其餘處理器。 其餘全部處理器都監聽此請求,並查看它們是否具備數據副本並作出相應響應。 所以,每一個處理器都須要維護存儲器的一致性視圖。
Directory based Coherence Protocol:目錄用於跟蹤哪些處理器正在訪問和緩存哪些地址。 發出新請求的任何處理器都將檢查此目錄,以瞭解其餘代理是否有副本,而後能夠向該代理髮送點對點請求以獲取最新的數據副本。
Snoop based Coherence | Directory based Coherence Protocol |
---|---|
對於小的系統來講,若是帶寬足夠,基於監聽的協議速度會更加快 | 基於目錄的協議須要使用查找表,這將會致使較長的時延 |
基於監聽的協議不適合大型系統,由於它須要將將每個請求信息進行廣播 | 因爲不須要廣播,基於目錄的協議更加適合大型系統 |
MESI協議時多處理器系統中最經常使用的cache一致性協議。MESI 是指4中狀態的首字母。每一個Cache line有4個狀態,可用2個bit表示,它們分別是:
狀態 | 描述 | 監放任務 |
---|---|---|
M 修改 (Modified) | 該Cache line有效,數據被修改了,和內存中的數據不一致,數據只存在於本Cache中。 | 緩存行必須時刻監聽全部試圖讀該緩存行相對就主存的操做,這種操做必須在緩存將該緩存行寫回主存並將狀態變成S(共享)狀態以前被延遲執行。 |
E 獨享、互斥 (Exclusive) | 該Cache line有效,數據和內存中的數據一致,數據只存在於本Cache中。 | 緩存行也必須監聽其它緩存讀主存中該緩存行的操做,一旦有這種操做,該緩存行須要變成S(共享)狀態。 |
S 共享 (Shared) | 該Cache line有效,數據和內存中的數據一致,數據存在於不少Cache中。 | 緩存行也必須監聽其它緩存使該緩存行無效或者獨享該緩存行的請求,並將該緩存行變成無效(Invalid)。 |
I 無效 (Invalid) | 該Cache line無效。 | 無 |
是對於MESI協議的擴展,引入了兩個新狀態「F」「O」:
F (Forward): 在MOESI協議中,S狀態的定義發生了細微的變化。當一個Cache行狀態爲S時,其包含的數據並不必定與存儲器一致。若是在其餘CPU的Cache中不存在狀態爲O的副本時,該Cache行中的數據與存儲器一致;若是在其餘CPU的Cache中存在狀態爲O的副本時,Cache行中的數據與存儲器不一致。
O (Owned): O位爲1表示在當前Cache 行中包含的數據是當前處理器系統最新的數據拷貝,並且在其餘CPU中必定具備該Cache行的副本,其餘CPU的Cache行狀態爲S。若是主存儲器的數據在多個CPU的Cache中都具備副本時,有且僅有一個CPU的Cache行狀態爲O,其餘CPU的Cache行狀態只能爲S。與MESI協議中的S狀態不一樣,狀態爲O的Cache行中的數據與存儲器中的數據並不一致。
虛擬內存是一致內存管理技術,及時實際的物理內存很小,虛擬處理器也容許處理器查看地址的虛擬連續空間。操做系統管理虛擬地址空間以及從輔助設備(如磁盤)到物理主內存的內存分配。CPU中的地址轉換硬件(memory management unit,MMU)將虛擬地址轉換爲物理地址。 此地址轉換使用分頁的概念,其中將連續的內存地址塊(稱爲頁)用於虛擬內存和實際物理內存之間的映射。
軟件程序或進程用來訪問其地址空間中存儲位置的地址稱爲虛擬地址。 而後,操做系統連同硬件將其轉換爲另外一個地址,該地址可用於實際訪問DRAM上的主內存位置,該地址稱爲物理地址。 地址轉換是使用分頁的概念完成的,若是主內存或DRAM沒有此位置,則在OS的協助下,數據將從輔助內存(如磁盤)移至主內存。
全部虛擬內存都將虛擬地址空間劃分爲頁,頁內的虛擬內存地址是連續的。頁是內存從輔助存儲移動到物理內存以管理虛擬內存的最小單位。大多數計算機系統的頁至少爲4KB.當須要更大的實際內存是,某些結構還支持更大的頁。頁表用於將應用程序看到的虛擬地址轉換爲物理地址,是一種數據結構,用於多頁狀況下,在內存中虛擬地址到物理地址的映射。
TLB: Translation Lookaside Buffer。根據功能能夠譯爲快表,直譯能夠翻譯爲旁路轉換緩衝,也能夠把它理解成頁表緩衝。裏面存放的是一些頁表文件(虛擬地址到物理地址的轉換表)。當處理器要在主內存尋址時,不是直接在內存的物理地址裏查找的,而是經過一組虛擬地址轉換到主內存的物理地址,TLB就是負責將虛擬內存地址翻譯成實際的物理內存地址,而CPU尋址時會優先在TLB中進行尋址。處理器的性能就和尋址的命中率有很大的關係。
當程序訪問映射到虛擬地址空間但未加載到主存儲器中的內存頁時,計算機硬件[內存管理單元(MMU)]會發起中斷。 此中斷稱爲頁面錯誤。
可使用外部中斷源來中斷CPU上的程序執行。
中斷是一個異步事件
一般由外部硬件(I / O設備或其餘外圍設備)生成,而且不會與指令執行邊界同步。例如:鍵盤,存儲設備或USB端口可能會發生中斷。當前指令執行結束後,老是對中斷進行服務,而且CPU跳轉到執行中斷服務程序。
異常是一個同步事件
異常當處理器在執行指令時檢測到任何預約義條件時生成的同步事件。例如:當程序遇到被零除或未定義的指令時,它將生成異常。異常又分爲三種類型,程序流的改變方式取決於類型:
故障:在發生故障的指令以前由處理器檢測到故障並對其進行維修
陷阱:在致使陷阱的指令以後對陷阱進行維修。最多見的陷阱是用於調試的用戶定義中斷。
停止:停止僅用於在執行再也不繼續的狀況下發出嚴重的系統問題信號
向量中斷是一種中斷,終端設備使用該中斷特有的代碼將處理器定向到正確的中斷服務程序中,該代碼由中斷設備與該中斷一塊兒發送給處理器。
而非向量中斷,中斷服務程序須要讀取中斷寄存器,解碼出致使中斷的中斷源,而後執行特定的中斷服務程序
指令緩存和預取
指令緩存和預取算法將在實際的指令解碼和執行階段以前繼續提取指令,這能夠較小設計中指令提取階段的存儲等待時間延遲。
分支預測和分支目標預測
分支預測基於歷史指令預測是否將發生條件分支,而分支目標預測將有助於在處理器計算以前預測目標。 這能最大程度地減小指令提取停頓,由於提取算法能夠根據預測保持提取指令。
Memory Mapped I/O (MMIO)是一種在CPU與I/O或外圍設備之間執行輸入/輸出(I/O)的方法.CPU使用相同的地址總線來訪問內存和I/O設備(包括I/O設備內部的寄存器或內部的任何內存)。在系統地址映射中,爲I/ O設備保留了一些內存區域,而且當CPU訪問該地址時,響應訪問並監視該地址總線的相應I/ O設備。例如:若是CPU具備32位地址總線:它能夠訪問0到2\^32之間的地址,而且在該區域中,咱們能夠爲一個或多個I/O設備保留地址(例如0到2^10)。