軟件和硬件等效原理
任何可以利用軟件實現的事情可以利用硬件來實現。反之,同樣。一般來說,硬件實現的速度快得多。
計算機組成部分
用來解釋和執行程序的處理器(processor);
用來存儲數據和程序的存儲器(memory);
與外界進行數據傳輸的機制(mechanism I/O system)
計算機發展歷史
機械計算器、真空管計算器、晶體管計算器、集成電路計算機、超大規模集成電路計算機
摩爾定律
硅芯片的密度每18個月翻一番
Rock定律:制造半導體集成電路所需要的主要設備的成本每4年就要翻一番。
計算機分層組織架構
| 層次 | 名稱 | 功能 |
|---|---|---|
| 第6層 | 用戶層 | 執行的各種應用程序 |
| 第5層 | 高級語言層 | 由各種高級編程語言組成 |
| 第4層 | 匯編語言層 | 包含各種類型的匯編語言,轉換成機器代碼 |
| 第3層 | 系統軟件層 | 處理操作系統指令,負責多用戶編程 存儲器保護,過程同步等 |
| 第2層 | 指令集體系結構層 | 由特殊的計算機系統結構所能識別的機器語言組成, |
| 第1層 | 控制層 | 控制單元確保正確地譯碼並執行指令,並且數據傳送,可以由硬連線或微編程 |
| 第0層 | 數字邏輯層 | 計算機系統的物理構成,各種邏輯門和引線 |
馮 諾伊曼模型
馮諾依曼發表公開了存儲器的思想。
現代版本的存儲程序的計算機體系結構的基本特征:
1.由三大硬件系統組成:CPU、 main-memory 、I/O
2.具有執行順序指令的處理能力
3.在主存儲器系統和CPU的控制單元之間,包含一條物理上或是邏輯上的單一通道,可以強制改變指令和執行的周期,這一通道會導致系統速度減慢,也稱作馮諾依曼瓶頸。
Amdahl‘s Law
對於某種特定的系統改進,計算機系統的整體加速了取決於特定部件的加速率和該部件在系統中的使用率
MARIE:簡單計算機模型
概述
CPU的基本知識和組成原理
CPU:負責提取程序指令,並對指令進行譯碼,然后按程序規定的順序對正確的數據執行各種操作
CPU分成兩個部分:數據通道(由存儲單元和算術邏輯單元所組成的網絡),這些組件通過總線(傳遞數據的電子 線路)連接起來,利用時鍾來控制時間。
控制單元,負責對各種操作進行排序並保證各種正確的數據適時地出現在所需的地方
寄存器是一種存儲二進制數據的硬件設備,位於處理器的內部。
ALU:在程序執行過程中用於進行邏輯運算和算術運算
控制單元:負責監視所有指令的執行和各種信息的傳送過程。
總線
總線的速度受到總線長度和共享總線的設備數目的影響。
總線包括數據總線(data bus)、地址總線(address bus)、控制總線(control bus)和電源線
各種信息的傳遞發生在一個總線周期內(bus cycle),總線周期是完成信息傳送所需的時鍾脈沖間的時間間隔。

各種控制線都是使用異步(asynchronous)總線來負責協調計算機的各種操作,這種一部總線必須采用一種較為復雜的握手協議(handshaking protocol)來強制實現與計算機其他操作的同步。
總線仲裁機制(bus arbitration)
菊花鏈仲裁方式:使用權依次從最高優先級向最低優先級傳遞
集中式平行仲裁方式: 每個設備都有一個總線請求控制線,通過一個總線仲裁器來選擇
采用自選擇的分配式仲裁方式:由設備自己決定哪個設備具有使用總線的最高優先級別
采用沖突檢測的分配式仲裁方式,如果有任何沖突,必須重新發出一個總線使用請求,如以太網
時鍾
1Hz表示每秒1個時鍾周期
機器的體系結構對計算機的性能有更大的影響。具有相同時鍾速度的計算機並不表示執行指令時也會使用相同數目的時鍾周期。
通常說的時鍾(clock)是指系統時鍾(system clock);某些總線也有時鍾,通 常比CPU慢,這樣就造成系統的瓶頸問題。
存儲器組成和尋址方式
尋址范圍:
按字節尋址和數據線沒有關系,按字尋址時才考慮數據線,通過數據線來判斷字長(一個字節(8bit)或者字節的偶數倍)
例如:假設cpu有20根地址線和32根數據線,試問按照字節和字尋址,尋址范圍分別是多少
解: 32根數據線可以看成存儲字長是32位,那么一個存儲字就是4個字節
按字節尋址:20根即 2的20次方=1MB
按字尋址:20位的地址線需要拿出兩條來字內尋址, 只剩2的18次方=256k
ps:如果題目只給出存儲器的容量位x MB,默認為nM*8
低位交叉存儲:使用地址的低位來選擇存儲器組
高位交叉存儲:使用地址的高位置來選擇存儲器組(實際中使用)


MARIE
MARIE表示一個真正直觀和簡單的計算機體系結構,包括存儲器、cpu。
體系結構
MARIE具有下列特點:
使用二進制數和補碼表示法: (2s: 減1,按位取反 反之,符號不變,按位取反,加1)
存儲程序和采用定長字長度
按字編址

寄存器和總線
| AC | 累加器 accumulator | 用來保持CPU需要處理的數據值,是一個通用寄存器 |
|---|---|---|
| MAR | 存儲器地址寄存器 | 保持被引用數據的存儲地址 |
| MBR | 存儲器緩沖寄存器 | 保持剛從存儲器中讀取或者寫入存儲器的數據 |
| PC | 程序計數器 | 保持程序將要執行的下一條指令的地址 |
| IR | 指令寄存器 | 保持將要執行的下一條指令 |
| InREG | 輸入寄存器 | 保持來自輸入設備的數據 |
| OutREG | 輸出寄存器 | 保持輸出到輸出設備的數據 |

指令集及其表示法(RTL)
| Load X | MAR←X MBR←M[MAR] AC←MBR |
|---|---|
| Store X | MAR←X, MBR←AC M[MAR]←MBR |
| Add X | MAR←X MBR←M[MAR] AC←AC+MBR |
| Subt X | MAR←X MBR←M[MAR] AC←AC-MBR |
| Input | AC←InREG |
| Output | Output←AC |
| Halt | STOP |
| Skipcond | if IR[11-10]=00 then if AC<0 then PC←PC+1 else if IR[11-10]=01 then if AC=0 then PC←PC+1 else if IR[11-10]=10 then if AC>0 then PC←PC+1 |
| Jump X | PC←X ( PC←IR[11-0] ) |
指令的執行過程
fetch-decode-execute

編譯程序
編譯程序的任務是使用助記符號將匯編語言轉換成機器語言,即完成二進制數。
編譯程序閱讀的是匯編語言編寫的源文件,生成由機器代碼組成的目標文件。
對於采用標號編寫的匯編程序,編譯程序必須進行兩次轉換!通讀程序兩次,每次閱讀都是從上至下:
1.第一次通讀時,編譯程序會建立一組符號表(symbol table)的對應關系
2.第二次通讀,使用符號表來填充空白地址,並且生成相應的機器語言指令。
CPU中必須有一些控制信號連線施加到 各個數據部件,才能使CPU按正確步驟執行操作。
hardwired control( 硬連線控制 ) 速度快,修改比較困難,必須修改物理部件
microprogrammed control( 微程序控制 ). 更新比較方便,設計靈活簡單,減慢運行速度,擴增成本
物理上將各控制線與實際的機器指令連接起來。指 令中不同的位通過各種數字邏輯部件組合連接在一起,用來驅動不同的控 制線。硬連線控制的優點是速度快
實際的計算機體系結構
CISC is an acronym for complex instruction set computer(復雜指令集計算機). : Intel
RISC stands for reduced instruction set computer(精簡指令集計算機). :MIPS
對一些小的但是完整的指令集實行硬連線,使指令執行的速度變得非常快
存儲器
層次結構(hieraechical memory)
1.基本概念
存儲器的速度越快,單位信息存儲的成本也就越高
命中(hit)--cpu請求的數據駐留在要訪問的存儲器中,一般只有在較高層才會關心所謂的命中率問題
缺失 (miss) --cpu請求的數據不在要訪問的存儲層
命中率(bit rate) 為命中率(miss rate) 命中時間(hit time)
缺失損失(miss penalty):cpu處理一次缺失事件所需要的事件。其中包括利用新的數據取代上層存儲器中的某個數據塊的事件,再加上所需數據傳遞給處理器所需要的附加時間。

如果數據miss,那么在向下尋找的時候,會將數據所在的整個字塊的內容轉移到告訴緩存中,這是利用了計算機程序的”局部性特征“
2.引用的局部性
Temporal locality Spatial locality Sequential locality
Cache Memory
計算機系統會將需要頻繁使用的數據復制到高速緩存存儲器中,從而加快存儲器的訪問速度。
映射方式
基本概念
將地址的二進制位分成不同的組,稱為域,根據映射模式的不同,主存儲器地址的分組可以有兩個或三個field
tag field:用來標識數據塊的身份 word field 字的塊內地址 valid bit 驗證引用高速緩存塊的合法性
直接映射(Direct mapped cache)
映射方式:Y=X mod N
地址格式:

block:用來選擇一個唯一的高速緩存塊 tag:用來復制主存儲器中的數據塊(到cache中)
案例:


直接關聯實現成本低,實現簡單但是不夠靈活,同時沖突概率大,比較適合大容量Cache
全關聯高速緩存(fully assocative cache)
映射方式:允許主存中每一個字塊映射到Cache中的任何一塊位置上。
(當Cache查找時,所有標記都需要進行比對)
地址格式:

案例

標記和數據塊一起存放在高速緩存中,當進行搜索的時候,cpu會將主存的標記域與Cache中的所有合法標記域進行比對(按內容尋址),如果比對成功,則找到,否則發生miss。如果Cache已經裝滿了,需要使用一種置換算法來決定從cache中丟棄的數據塊(victim block),最簡單的置換算法是FIFO,但較少使用,還有LRU等其他算法。
全相聯映射降低了塊的沖突率,提高了cache的命中率,但是增加了tag的位數,同時需要特殊的硬件支持,成本高,通常使用在小容量的Cache中。
(tag field唯一確定和標識一個數據塊,增加了位數就需要更多的存儲容量支持)
組關聯高速緩存(set associtative cache)
映射方式:將數據塊映射到由幾個高速緩存塊組成的某個塊組中,同一個高速緩存中的所有組的大小必須相同。
地址格式

set--組域 表示主存儲器中的數據塊會被映射到cache中的塊組

置換策略
最佳替換算法的基本思想是:替換掉在未來最長時間段內不再使用的高速緩存塊
LRU 最近最少被使用:保留訪問記錄,需要存儲空間,減慢緩存速度
FIFO 先進先出
隨機選擇:
有效存取時間和命中幾率
EAT(effective access time):每次訪問所需要的平均時間
H為命中率,Access_c是高速緩存的訪問時間,Access_M是主存儲器的訪問時間
高速緩存的寫策略
當程序的局部性不好的時候,高速緩存就會失效,導致存儲器的層次結構性能很差
程序設計人員必須對高速緩存的臟塊(dirty block)進行處理:
1.寫通(write-through):在每次的寫操作時,處理器同時更新Cache和MM,保證C和MM的內容一致,但是減慢了速度
2.回寫(write-back)當緩存塊作為犧牲塊從cache中移除時,處理器才進行更新。
3.寫一次法:與回寫法基本相同,只在第一次命中時同時寫入主存
為了改進cache的性能,必須提高cache的命中率。使用更好的映射算法,寫操作技巧,置換算法和更好的程序編碼方案以及增加cache的容量大小
虛擬存儲器
虛擬存儲器使用硬盤作為RAM存儲器的擴充,增加了進程可以使用的有效地址空間
虛擬地址 物理地址 映射 存儲碎片 缺頁
頁幀(page frame):由主存儲器分成的相等大小的信息塊或數據塊
頁(pages):由虛擬存儲器划分成的信息塊或數據塊,頁的大小與頁幀相同
分頁(paging):將一個虛擬頁從硬盤復制到主存儲器的某個頁幀的過程
分頁
按照固定大小的信息塊(頁幀)為各個進程分配物理存儲空間,並且通過將信息寫入頁表的方式進行跟蹤。
頁面的起點、終點是固定的,因此頁表簡單,調入方便,主存空間浪費小,會產生碎片,但是處理 保護和共享不如段式方便
工作原理:


舉例:

Q:頁表是如何生成的?
使用分頁的有效存取時間
處理器每次訪問存儲器,都必須執行兩次對物理存儲器的訪問操作。一次引用頁表,一次訪問實際數據;
EAT=0.99*(200ns+200ns)+0.01(10ms)=100,396ns
EAT=1.00*(200ns+200ns)=400ns
此時有效存取時間實際上是存儲器訪問時間的二倍,因為頁表本身存放在主存儲中,所以訪問頁表也會耗費掉一個額外的存儲器存取時間。
TLB
通過將最近的頁查詢數據值存放到一個被稱為轉換旁視緩沖器(translation look-aside buffer),可以加速頁表的查詢時間。每個TLB的入口目錄都由一個虛擬頁的頁碼和對應的物理頁幀的幀數組成。


如果TLB命中,則頁表命中;cache命中與否,與頁表命中與否沒有必然聯系,因為是兩種獨立的機制
cpu執行指令進行一次存儲訪問操作最少訪問主存幾次:
1.根據虛頁號查找快表,若存在,則轉換成物理地址,轉第二部,若不存在,則發生TLB缺失,轉第三步
2.判斷物理地址中的標記是否和cache中的標記相等,並且有效位是否為1,如果是,則cache命中,從cache讀寫數據數據,若不為1,則cache缺失,轉第四步
3.當TLB缺失,根據頁表基址寄存器的值和虛頁號找到主存中的頁表項,判斷有效位是否為1,若是,則將頁表項轉入TLB中,並形成物理地址,轉第二步;如果不是,則缺頁,此時需要從磁盤讀入頁面,處理結束后,重新執行當前指令
4.Cache缺失時,cpu根據物理地址到主存中讀一塊信息到cache,進行讀寫操作
因此最好的情況下無需訪問主存;最壞的情況下,不僅要多次訪問主存,還要讀寫磁盤數據
分頁和虛擬存儲器的優缺點
在地址轉換上造成重大的開銷,需要消耗額外的系統資源,必須有專門的硬件和操作系統的支持。
運行的程序不再收到已有物理存儲器容量大小的限制,提高了cpu的使用率和系統處理能力
從操作系統的角度看,使用固定大小的頁幀和頁面簡化了存儲器空間的分配和地址的安排問題。允許以頁為基礎實現特定的任務保護和共享。
分段
分段將虛擬地址空間划分為多個長度可變的邏輯單元,稱之段(segment)
每個段都有一個表示該段在存儲器中的位置的基地址(base address),還有一個指示段的大小的界限(bound limit)。每個程序都是由若干的段組成,每個程序也有相應的段表。
分段采用的是邏輯存儲空間塊,因此更容易實現存儲空間的保護和共享。
分頁產生內部碎片現象(處理器將一個完整的頁幀配置給並不需要占用整個頁幀的程序);分段會造成外部碎片
外部碎片和內部碎片的區別在於:
外部碎片,存儲器上的總的空間足夠分配給一個進程使用,但是空間是不連續的,使用碎片收集解決
內部碎片,無法使用多余的空間
優點:段的分界與程序的自然分界相對應,段的邏輯獨立性使它易於編譯、管理、修改和保護。也便於多到程序共享;某些類型的段(堆棧、隊列)有動態可變長度,允許自由調度以便有效利用主存空間
缺點:給主存空間分配帶來麻煩,容易留下碎片
段頁式
虛擬空間被分割成一些長度可變的段,而這些段又被划分為許多固定大小的頁面。
每個段都有一個頁表,系統的物理地址被分為三個域,段域(指示系統對應的頁),頁碼(進入頁表的偏移量),和偏移量
這種組合方法既可以從用戶的角度來實現分段管理,也可以從系統的角度來實現分頁管理
兼備優點,但是在地址映射過程中需要多次查表
指令系統
基本概念
操作數和指令的長度
指令包含一個操作碼和多個操作數,最常用的機器指令長度時16、32、64位,各種指令集可能在特征上存在如下差別:
操作數在cpu的存儲方式、指令直接作用的操作數的數目、操作數的位置 、操作碼、操作數的類型和長度
指令系統體系結構(ISA)的效能衡量標准: 占用內存空間,指令系統的復雜程度、指令的長度、指令系統中指令的總數目
指令構成的格式主要有以下兩種方式:
1.固定長度:浪費存儲空間,指令執行速度快,采用流水線結構的時候,性能也會更好
2.可變長度:使得譯碼變得復雜,但是可以節省存儲空間
常見的指令格式:
-
只有操作碼
-
操作碼+1個地址(通常只有一個存儲器地址)
-
操作碼+2個地址(通常是兩個寄存器地址,或者是一個寄存器地址加上一個存儲器地址)
-
操作碼+3個地址(通常是三個寄存器地址,或者是寄存器和存儲器的某種組合形式)
基於堆棧的計算機體系結構中,大部分機器指令只包含操作碼,只有某些特定指令允許訪問存儲器
對於要求兩個操作數的操作,堆棧結構采用堆棧頂部最上面的兩個元素
堆棧的這種組成結構,對於計算法采用反向波蘭表示法(reverse polish notation,RPN)編寫的算術表達式十分有效。
Example:
三個操作數,第一個操作數一般為目標操作數:至少一個寄存器
Mult R1,X,Y
MULT R2,W,U
ADD Z,R2,R1
兩個操作數,一個寄存器
Load R1,X
MULT R1,Y
LOAD R2,W
MULT R2,U
ADD R1,R2
STORE Z,R1
一個操作數,假定一個寄存器(累加器)為目標操作數
LOAD X
MULT Y
STORE TEMP
LOAD W
MULT U
ADD TEMP
STORE Z
0個操作數
PUSH X
PUSH Y
MULT
PUSH W
PUSH U
MULT
ADD
POP Z
擴展操作碼
要求盡可能多的操作碼的數目,盡可能短的操作碼,所設計的指令長度也比較短
基本思想:選用短操作碼,當有需要的時候用某種方法來將操作碼加長。


大小端的位序問題 (Endian)
小端(little endian):將最低位的字節首先存放到最低位地址,將最高位的字節放到高位地址 x86
大端(big endian): 將最高位的字節存放到低位地址,將最低位的字節放到高位地址。 UNIX、因特網
FOR example:
32位的16進制數值:12345678 (每個16位進制的數字都需要半個字節,所以一個字節保存兩個數字)
| 編址(低-->高) | 00 | 01 | 10 | 11 |
|---|---|---|---|---|
| BIG ENDIAN | 12 | 34 | 56 | 78 |
| LITTLE ENDIAN | 78 | 56 | 34 | 12 |
大端位序的存儲方式更為自然,總是先處理最高位的字節。在存儲整數和字符串時使用相同的次序,對於像素大於一個字節的數據可以直接按照大端位序機器自身體系結構的安排順序進行處理。對於huffman和lzw的編碼方式時,實際的編碼字可以被當作進入到某個查詢表中的一個索引來使用。
16位到32位地址的轉換不需要額外的運算,高精度的算術運算在小段機器上會更快更方便,允許計算機字按照非字地址邊界的方法來存儲數據字,允許奇數地址的讀寫,使得編程更加方便。
大小端位序問題在軟件應用中十分重要,任何程序在從某個文件中讀寫數據時,必須搞清楚所運行的計算機的字節次序。如bmp是小端的,gif是小端的,jpeg是大端的,通用軟件必須要對其支持。
CPU的內部存儲機制
cpu的數據存儲方式是區分不同指令體系結構的最基本方法,有以下三種不同的體系結構可供選擇:
1.堆棧體系結構:使用一個堆棧來執行各種指令,難以產生高效率的編碼
2.累加器指令體系:將操作數隱含在累加器中,降低機器的內部復雜性,允許使用非常短的指令,對存儲器訪問頻繁
3.通用寄存器體系結構:采用多個通用寄存器組,十分有效和高效,但是操作數都必須加以命名指定,使用寄存器結構會產生較長的指令,導致較長的取值時間和譯碼時間。
指令類型

尋址方式
| 尋址方式 | 方法 |
|---|---|
| 立即尋址(immediate) | 指令-->數值 |
| 直接尋址(direct) | 指令-->操作數的有效地址(存儲器)-->數值 |
| 寄存器尋址(register) | 指令-->操作數的有效地址(寄存器)-->數值 |
| 間接尋址(indirect) | 指令-->存儲器地址-->操作數的有效地址(指針)-->數值 |
| 變址尋址(indexed) | 指令-->數值 + 變址寄存器的偏移量-->操作數的有效地址-->數值 |
| 基址尋址 | 指令-->數值(偏移量) + 基地址寄存器的基地址-->操作數的有效地址-->數值 |
| 堆棧尋址 | 堆棧頂部-->數值 |
| 其他的尋址方式 |

指令流水線
流水線:將取指-譯碼-執行周期分成一些較小的步驟,其中的某些較小步驟可以並行執行,加快執行速度


假設有一個k級流水線,時鍾周期時間為t_p,並假定有n條指令,通常稱為n個任務,則利用k級流水線完成n任務需要的時間為:

加速比(speedup):利用流水線后獲得的速度上的提升。t_n=k*t_p,即完成一個任務的時間,因此獲得的加速比:
當n取無限大的條件時,可以得到理論上的加速比 S=k,因此最大的加速比實際上就是流水線的級數
帶條件分支轉移的指令流水線:並不是每一個周期都有一條指令從流水線流出
將if-else放在for循環外部效率更高,不打斷for內部的流水線
if-else會打斷並行流水線,若有多個分支,switch-case效率更高
