計算機組成原理

計算機的基本硬件組成

  1. 三大基本部分:CPU、內存、主板
  2. 芯片組和總線實現CPU和內存之間的通信
  3. 顯卡里有GPU
  4. 南橋芯片組實現CPU和IO設備的通信
  5. 馮·諾依曼體系結構,即存儲程序計算機,最初設計的報告被特稱爲First Draft,需要處理器單元(計算)、控制器單元(流程)、內存、輸入輸出

計算機性能

  1. 響應時間、吞吐率
  2. 計算機的計時單位:CPU時鐘
  3. 程序實際花費的 CPU 執行時間(CPU Time),就是 user time加sys time
  4. 程序的 CPU 執行時間 =CPU 時鐘週期數×時鐘週期時間
  5. CPU 時鐘週期數,我們可以再做一個分解,把它變成“指令數×每條指令的平均時鐘週期數(CPI)
提升性能
  1. 摩爾定律與並行優化
  2. CPU功耗 ~= 1/2 ×負載電容×電壓的平方×開關頻率×晶體管數量,由於功耗帶來的散熱問題,限制了CPU晶體管數量和主頻的增長
  3. 多核的並行優化,受阿姆達爾定律限制,
  4. 其餘的性能提升方法:加速大概率事件、通過流水線提高性能、通過預測提高性能

計算機指令

常見的機器指令可分爲:算術類指令、數據傳輸類指令、邏輯類指令、條件分支類指令、無條件跳轉指令

CPU執行指令
  1. CPU由寄存器組成,寄存器由多個觸發器或者鎖存器組成
  2. N個觸發器或者鎖存器,就組成N bit的寄存器
  3. 三種特殊寄存器:PC寄存器、指令寄存器、條件碼寄存器
  4. 硬件層面實現if和for循環,只需要以上三種特殊寄存器
棧溢出
  1. 函數的跳轉比起if和for循環的跳轉,需要記錄返回的地址,這就是壓棧與出棧
  2. 整個函數 A 所佔用的所有內存空間,就是函數 A 的棧幀(Stack Frame)
  3. 一層層壓棧之後,棧頂的內存地址是在逐漸變小而不是變大
  4. rbp 又叫棧幀指針(Frame Pointer),是一個存放了當前棧幀位置的寄存器,rsp
  5. 函數內聯:當沒有嵌套調用時,將產生的函數指令插入到調用的位置進行優化
  6. 函數作用域內的臨時變量,分配在棧上
  7. 把大的for循環寫裏面能提高CPU流水線的分支預測的準確率
編譯、鏈接和裝載
  1. 只有通過鏈接器(Linker)把多個目標文件(obj)以及調用的各種函數庫鏈接起來,我們才能得到一個可執行文件
  2. 可執行文件和目標文件所使用的都是一種叫ELF格式,即可執行與可鏈接文件格式
  3. ELF 文件裏面,存儲在一個叫作符號表(Symbols Table)的位置。符號表相當於一個地址簿,把名字和地址關聯了起來。
  4. Windows 的可執行文件格式是一種叫作PE(Portable Executable Format)的文件格式,所以在linux下執行的程序不能在windows下執行
  5. 可執行程序加載後佔用的內存空間應該是連續的,我們需要同時加載很多個程序,並且不能讓程序自己規定在內存中加載的位置
  6. 指令裏用到的內存地址叫作虛擬內存地址(Virtual Memory Address),實際在內存硬件裏面的空間地址,我們叫物理內存地址(Physical Memory Address)
  7. 這種找出一段連續的物理內存和虛擬內存地址進行映射的方法,我們叫分段(Segmentation),分段造成了內存碎片問題,通過內存交換解決
  8. 內存分頁是把整個物理內存空間切成一段段固定尺寸的大小
  9. 動態鏈接,共享庫windows下爲dll,linux下爲so
  10. 在共享庫的 data section 裏面,保存了一張全局偏移表(GOT,Global Offset Table)。雖然共享庫的代碼部分的物理內存是共享的,但是數據部分是各個動態鏈接它的應用程序裏面各加載一份的
編碼
  1. 我們仍然通過最左側第一位的 0 和 1,來判斷這個數的正負。但是,我們不再把這一位當成單獨的符號位,在剩下幾位計算出的十進制前加上正負號,而是在計算整個二進制值的時候,在左側最高位前面加個負號
  2. 不管是整數也好,浮點數也好,採用二進制序列化會比存儲文本省下不少空間
  3. ASCII、Unicode是字符集,UTF-8是字符編碼
電路
  1. 通過一個異或門計算出個位,通過一個與門計算出是否進位,打包稱爲半加器
  2. 兩個半加器和一個或門,組成全加器
  3. 門延遲與時鐘頻率
浮點數
  1. BCD編碼:定點數
  2. 32bit浮點數組成:1bit符號位+8bit指數位+23比特有效數位,表示爲科學計數法
  3. 浮點數先對齊再計算,所以對應指數位較小的數在計算之前有效位會右移,所以最右側有效位精度丟失
  4. Kahan summation解決精度丟失

處理器

指令+運算=CPU
  1. fetch-decode-execute 指令週期
  2. 從內存裏面讀取一條指令的最短時間,稱爲 CPU 週期或機器週期
  3. 數據通路就是我們的處理器單元,它通常由操作元件即組合邏輯元件ALU和存儲元件構成。數據通路加上控制器組成CPU
  4. CPU需要的 4 種基本電路。它們分別是,ALU 這樣的組合邏輯電路、用來存儲數據的鎖存器和 D 觸發器電路、用來實現 PC 寄存器的計數器電路,以及用來解碼和尋址的譯碼器電路
  5. 組合邏輯電路、時序邏輯電路
  6. 時鐘信號:反饋電路,即反相器,
  7. 觸發器:當兩個開關都斷開的時候,最終的輸出結果,取決於之前動作的輸出,具有記憶性
  8. 可以由時鐘信號、加法器、D型觸發器構成自增的PC寄存器
指令流水線
  1. 不用把時鐘週期設置成整條指令執行的時間,而是拆分成完成這樣的一個一個小步驟需要的時間,這樣的協作模式,就是我們所說的指令流水線。這裏面每一個獨立的步驟,我們就稱之爲流水線階段或者流水線級(Pipeline Stage)
  2. 流水線技術並不能縮短單條指令的響應時間這個性能指標,但是可以增加在運行很多條指令時候的吞吐率
  3. 流水線設計的三大冒險:結構冒險、數據冒險、控制冒險
  4. 結構冒險:借鑑了哈佛結構的思路,雖然沒有把內存分開,但是把高速緩存分成了指令緩存和數據緩存兩部分
  5. 數據冒險:先寫後讀存在數據依賴的風險,先讀後寫即反依賴,寫後再寫即輸出依賴,最簡單是通過流水線冒泡等待解決
  6. 解決冒險的方法:操作數前推(轉發),硬件上爲旁路;亂序執行;縮短分支延遲、靜態分支預測(失敗則flush或zap)、動態分支預測(1比特飽和計數、狀態機即2比特飽和計數)
  7. 多層嵌套循環時把大循環寫在內部,減少分支預測失敗帶來的開銷(是最後一層循環的臨時變量創建次數,屬於棧的問題?)
  8. 通過更改硬件設計,一次取出多條指令,並行指令譯碼,叫做多發射和超標量
加速矩陣乘法
  1. 超線程:通過硬件設計實現邏輯上的多CPU,並行運行程序,也稱作同時多線程
  2. 單指令多數據流,一種數據並行的方案,一次取出多條數據,剛好適合向量不同維度的獨立計算
異常處理
  1. 檢測異常,拿到異常碼,再根據異常碼進行查表處理
  2. 中斷(來源I/O設備)、陷阱(斷點,最常見的是應用程序調用系統調用即用戶態切換到內核態時)、故障、中止
  3. 對於異常這樣的處理流程,不像是順序執行的指令間的函數調用關係。而是更像兩個不同的獨立進程之間在 CPU 層面的切換,所以這個過程我們稱之爲上下文切換
處理器綜合
  1. CISC提出了微指令架構,向RISC靠近
  2. 三維圖形在計算機裏的渲染過程。這個渲染過程,分成了頂點處理、圖元處理、 柵格化、片段處理,以及最後的像素操作
  3. GPU: 統一着色器架構 把任務交給shader或者cuba
  4. 從一個 CPU 的硬件電路出發,去掉了對 GPU 沒有什麼用的分支預測和亂序執行電路,來進行瘦身。之後,基於渲染管線裏面頂點處理和片段處理就是天然可以並行的了。在 GPU 裏面可以加上很多個核。
  5. 渲染管線裏面,整個指令流程是相同的,所以又引入了和 CPU 裏的 SIMD 類似的 SIMT 架構。這個改動,進一步增加了 GPU 裏面的 ALU 的數量。最後,爲了能夠讓 GPU 不要遭遇流水線停頓,又在同一個 GPU 的計算核裏面,加上了更多的執行上下文,讓 GPU 始終保持繁忙
  6. FPGA:現場可編程門陣列,用存儲換功能實現組合邏輯(有一張LUT表)、對於需要實現的時序邏輯電路,我們可以在 FPGA 裏面直接放上 D 觸發器,作爲寄存器,FPGA 是通過可編程邏輯佈線,來連接各個不同的 CLB,最終實現我們想要實現的芯片功能
  7. ASIC: 專用集成電路
  8. 虛擬機:解釋型虛擬機、虛擬機監視器(type2與解釋型並無太大區別,type1直接調用硬件,系統級的硬件)、docker

計算機存儲與IO

  1. CPU的寄存器、CPU cache(SRAM,分成L1、L2、L3三層)、內存(DRAM)、硬盤
  2. 時間局部性原理:LRU算法
  3. CPU高速緩存:彌補CPU和內存之間的性能差異,數據單元爲cache line即緩存塊;直接映射:通過求餘的方法將內存中的block地址與cache line地址形成映射;組標記:根據低位確認cache line地址後,根據組標記即記錄的高位確認是否是該數據
  4. 一個內存從CPU高速緩存中的訪問地址,最終包括高位代表的組標記、低位代表的索引,以及在對應的 Data Block 中定位對應字的位置偏移量。
  5. 不同線程變量共享時注意緩存一致性的問題;寫入方法有寫直達、寫回
  6. 多核CPU保持高速緩存一致性:總線嗅探,寫失效、寫廣播、MESI協議
  7. 在程序運行的時候,內存地址從頂部往下,不斷分配佔用的棧的空間。而堆的空間,內存地址則是從底部往上,是不斷分配佔用的
  8. 解決虛擬地址與物理地址映射表過大的問題:多級頁表就像一個多叉樹的數據結構,所以我們常常稱它爲頁表樹
  9. 加速地址轉換:TLB,專門在 CPU 裏放了一塊緩存芯片,全稱是地址變換高速緩衝,在 CPU 芯片裏面,我們封裝了內存管理單元(MMU,Memory Management Unit)芯片,用來完成地址轉換。和 TLB 的訪問和交互,都是由這個 MMU 控制的。
  10. 內存保護:地址空間佈局隨機化
  11. 雙獨立總線(Dual Independent Bus,縮寫爲 DIB)。CPU 裏,有一個快速的本地總線(Local Bus),連接高速緩存,以及一個速度相對較慢的前端總線(Front-side Bus)向外連接,從物理上可以分爲數據線、地址線、控制線,
  12. 北橋芯片連接CPU、內存
  13. 輸入輸出設備,由接口和實際的I/O設備組成,獲得命令
  14. CPU和IO設備通信:內存映射IO
  15. 硬盤IO指標:IOPS(每秒輸入輸出操作數)、DTR(數據傳輸率)
  16. 硬盤提升IOPS:partial stroking,犧牲部分磁道的存儲空間,換取時間
  17. SSD:適合用於讀多寫少的業務情景
  18. 解決SSD擦除的磨損問題:增加了FTL(閃存轉換層)的磨損均衡,SSD需要垃圾回收,導致了寫入放大,帶來了性能問題
  19. 解除IO與CPU耦合:DMA,即直接內存訪問,DMAC 最有價值的地方體現在,當我們要傳輸的數據特別大、速度特別快,或者傳輸的數據特別小、速度特別慢的時候。kafka利用DMA,把數據直接搬運到操作系統內核讀緩存區,再從讀緩存區發送到網卡緩存區,把四次搬運優化到兩次,沒有在內存層面拷貝,被稱作零拷貝
  20. 異地多活的系統設計
發佈了250 篇原創文章 · 獲贊 9 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章