21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#1:
這次21天打卡行動害幅,之所以選擇這門課程主要是因為組成原理是基礎(chǔ)課程消恍,我們非常有必須去認真的學習它,雖然上學的時候,計算機專業(yè)的大多數(shù)人可能都學習過它以现,但是可能都沒學進去狠怨,或者說學習的角度不一樣。
隨著學習的不斷深入邑遏,總有一天我們會遇到一個瓶頸佣赖,我們會吃驚的發(fā)現(xiàn),我們寫了這么多年程序无宿,居然不了解這個我們天天朝夕相處的伙伴——計算機茵汰。正如蘇格拉底所說我們每個人最需要做的事就是——認識自己,我們每個程序員最需要做的事就是——認識計算機孽鸡。
這門課程大概有60篇文章蹂午,一天3篇差不多可以完成栏豺。
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#2:
1、馮.諾伊曼體系結(jié)構(gòu)
即存儲程序計算機=可編程+存儲計算機與可編程對應(yīng)的是“不可編程”豆胸,即將計算程序固定到電路板中奥洼,如計算器。與存儲計算對應(yīng)的是“不能存儲程序的計算機”晚胡,典型代表是Plugboard灵奖,真?zhèn)€計算機是一個巨大額插線板。
2估盘、計算機組成=運算器+控制器+存儲器+輸入是被+輸出設(shè)備
3瓷患、學習計算機組成原理,在學習什么遣妥?
1)學習控制器擅编、運算器的工作原理,即CPU是怎么工作的箫踩,為什么這么設(shè)計爱态;
2)學習內(nèi)存的工作原理,從基本的電路設(shè)計=》CPU=》應(yīng)用程序接口境钟;
3)CPU是如何與IO設(shè)備打交道锦担。
4、計算機組成原理知識地圖
計算機的基本組成:硬件設(shè)備組成(CPU+主板+內(nèi)存+硬盤+鼠標鍵盤+顯示器)
馮.諾伊曼結(jié)構(gòu):運算器/處理器單元慨削,控制器洞渔,存儲器,輸入設(shè)備缚态,輸出設(shè)備
計算機性能:CPU主頻+相應(yīng)時間+吞吐率
計算機功耗(散熱痘煤,能耗,電力)
計算機的指令和運算:指令(機器碼猿规、程序執(zhí)行)、運算(二進制編碼宙橱、數(shù)字電路)
存儲器和I/O系統(tǒng):存儲器的層次結(jié)構(gòu)姨俩、存儲器和IO系統(tǒng)
處理器設(shè)計:CPU、其它處理器
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#3:
計算機性能
程序?qū)嶋H花費的 CPU 執(zhí)行時間(CPU Time)师郑,就是 user time 加上 sys time
CPU Time=user time + sys time
排除主板环葵、內(nèi)存等硬件影響
程序的 CPU 執(zhí)行時間 =CPU 時鐘周期數(shù)×時鐘周期時間
** CPU 時鐘周期數(shù)=,指令數(shù)×每條指令的平均時鐘周期數(shù)(Cycles Per Instruction宝冕,簡稱 CPI)**
程序的 CPU 執(zhí)行時間 = 指令數(shù)×CPI×Clock Cycle Time
要提高計算機性能我們可以從右側(cè)三個指標著手张遭。
1、時鐘周期時間地梨,就是計算機主頻菊卷,這個取決于計算機硬件缔恳。
2、每條指令的平均時鐘周期數(shù) CPI洁闰,就是一條指令到底需要多少 CPU Cycle歉甚。
3、指令數(shù)扑眉,代表執(zhí)行我們的程序到底需要多少條指令纸泄、用哪些指令。
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#4:
浮點數(shù)在計算機中如何表示腰素。
寫程序的時候大家應(yīng)該都知道浮點數(shù)不能直接用等號對比聘裁,但可能很多人不太明白為什么。
今天學習了浮點數(shù)在計算機中的表示方法弓千,這個問題算是徹底明白了衡便。
并不是所有浮點數(shù)都不能用==好比較是否相等,只是大多數(shù)浮點數(shù)無法精確表示计呈,只能近似表示砰诵。
無論時整數(shù)還是浮點數(shù)在計算機中最終都會表示為二級制數(shù)。
浮點數(shù)在計算機中表示為:符號位s+指數(shù)位e+有效位數(shù)f
符號位s占1位
指數(shù)位e占8位
有效位f占23位
當有效位被截圖時就不能準確表達一個浮點數(shù)捌显。
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#5:
CPU周期
指令周期(Instruction Cycle)茁彭,CPU在永不停歇的執(zhí)行“Fetch - Decode - Execute”的循環(huán),一次循環(huán)稱之為一個指令周期扶歪。
Fetch(取得指令)-Decode(指令譯碼)-Execute(執(zhí)行指令)
機器周期(Machine Cycle)或CPU周期理肺,從內(nèi)存中讀取一條指令的最短時間稱為CPU周期。
時鐘周期(Clock Cycle)或振蕩周期善镰,時鐘頻率的倒數(shù)妹萨。時鐘周期是計算機中最基本的、最小的時間單位炫欺,在一個時鐘周期內(nèi)CPU僅完成一個基本動作乎完。
一個CPU周期通常會有幾個時鐘周期。
一個指令周期品洛,至少需要兩個CPU周期树姨。
一個指令周期包含多個CPU周期,一個CPU周期包含多個時鐘周期桥状。
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#6:
1)數(shù)據(jù)通路
由兩類原件組成帽揪,操作原件(也叫組合邏輯元件)、存儲原件(也叫狀態(tài)元件)辅斟。
通過數(shù)據(jù)總線转晰,將他們連接起來,就可以完成數(shù)據(jù)的存儲、處理和傳輸了查邢。
2)控制器
CPU支持的所有指令蔗崎,都在控制器中被解析成不同的輸出信號。
CPU有2000多種信號侠坎,控制器輸出的信號蚁趁,至少要有2000種不同的組合。
3)ALU和各種組合邏輯電路
可以認為他們是一個固定的電路实胸∷眨控制器翻譯指令輸出不同的控制信號,ALU去做不同的計算庐完。
控制器讓我們可以“編程”钢属。
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#7:
如何搭建CPU電路?
1)需要ALU——一個沒有狀態(tài)的门躯,根據(jù)輸入計算輸出結(jié)果的電路淆党。
2)寄存器——一個能夠進行狀態(tài)讀寫的電路元件。
鎖存器讶凉、D觸發(fā)器
3)一個自動電路染乌,按照固定的周期,不停的實現(xiàn)寄存器自增懂讯,自動的執(zhí)行“Fetch_Decode_Execute”
4)我們需要一個譯碼電路
CPU所需電路類型:
1)組合邏輯電路——給定輸入荷憋,給出固定輸出。如:加法器
2)時序邏輯電路——解決自動運行褐望、存儲問題勒庄,并讓各個功能按時序協(xié)調(diào)。
3)反饋電路瘫里,把電路輸出信號作為輸入信號实蔽。
通過一個在打開和關(guān)閉之間不斷切換的電路實現(xiàn)時鐘信號。
反相器——非門
通過D觸發(fā)器實現(xiàn)存儲功能局装,寄存器。
有了時鐘信號劳殖,可以提供定時的輸入贼邓;
有了D型觸發(fā)器,可以在時鐘信號控制的時間寫入數(shù)據(jù)闷尿。
以上兩個功能配合就可以實現(xiàn)程序計數(shù)器。
許多D型觸發(fā)器放在一起女坑,就可以形成一塊很大的存儲控件填具,甚至可以當做內(nèi)存使用。
尋址電路——譯碼器
CPU=D觸發(fā)器+自動計數(shù)+譯碼器+ALU
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#8:
1)單指令周期處理器
一個時鐘周期可以執(zhí)行一條執(zhí)行,CPI=1劳景。
CPU指令的復(fù)雜度不同誉简,為保證在一個時鐘周期內(nèi)可以執(zhí)行完一條指令,我們只能將時鐘周期設(shè)置為與耗時最長的指令一致盟广。
那么在執(zhí)行其它簡單指令時會有一部分時間CPU處于空閑狀態(tài)闷串。
2)指令流水線設(shè)計
為提高CPU的吞吐率,引入了流水線設(shè)計燎孟。
將一條指令拆分為多個子過程汉匙,比如將指令拆分為“取指令打颤、譯碼、執(zhí)行”三部分肋拔,這就是一個三級流水線。
進行指令拆分之后呀酸,執(zhí)行一條執(zhí)行就三個時鐘周期凉蜂,需要的時鐘周期多了,但我們可以提高CPU的主頻性誉。
引入指令流水線設(shè)計之后窿吩,我們不需要確保最復(fù)雜的指令在一個周期種執(zhí)行完成,
只需要保證一個最復(fù)雜的流水線在一個時鐘周期內(nèi)執(zhí)行完成错览。
ARM或Intel的CPU流水線級別為14纫雁。
3)超長流水線的瓶頸
既然流水線設(shè)計可以提高CPU的吞吐量,我們是不是可以無限加長流水線級數(shù)呢蝗砾?
流水線過程時先较,我們維護流水線執(zhí)行的開銷就會增加。
過沈的流水線不僅不能提升計算機指令的吞吐率悼粮,更會加大計算的功耗和散熱問題闲勺。
流水線設(shè)計并不是越多越好。
在實際的使用過程種扣猫,我們還需要解決直徑之間的依賴問題菜循。
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#9:
流水線設(shè)計種的三大冒險:結(jié)構(gòu)冒險(Structural Hazard)、數(shù)據(jù)冒險(Data Hazard)申尤、控制冒險(Control Hazard)癌幕。
1)結(jié)構(gòu)冒險(Structural Hazard)
CPU在同一時鐘周期,同時運行兩條指令的不同階段昧穿。但是兩個不同的階段可能會用到相同的硬件電路勺远。
例如:薄膜鍵盤多個按鈕公用一個線路,同一時間按下兩個共用一條線路的按鍵時只能傳出一個按鍵的信號时鸵;
機械鍵盤或者電容鍵盤胶逢,每個按鍵都有獨立的傳輸線路厅瞎,可以做到全鍵無沖。
現(xiàn)代CPU借用哈佛結(jié)構(gòu)初坠,將CPU內(nèi)部的高速緩存分為了指令緩存(Instruction Cache)和數(shù)據(jù)緩存(Data Cache)和簸。
該解決方案,是通過增加資源解決冒險問題碟刺。
2)數(shù)據(jù)冒險(Data Hazard)
數(shù)據(jù)冒險分為三類:
先寫后讀(數(shù)據(jù)依賴)
先讀后寫(反依賴)
寫后再寫(輸出依賴)
通過流水線停頓解決數(shù)據(jù)冒險锁保。
3)控制冒險(Control Hazard)
操作數(shù)前推、亂序執(zhí)行半沽、分支預(yù)測
21天打卡行動#
課程:《深入淺出計算機組成原理》
筆記#10:
前面我們通過“堆資源”和“等排期”方式解決了結(jié)構(gòu)冒險及數(shù)據(jù)冒險問題爽柒,但是這只是無奈之舉,只能避免沖突無法提高效率抄囚。
1)流水線里的接力賽:操作數(shù)前推 或者叫做操作數(shù)轉(zhuǎn)發(fā)
操作數(shù)前推通過在硬件層制造一條旁路讓一條指令的結(jié)果霉赡,可以直接傳輸給下一條指令。
不再需要指令1寫回寄存器幔托,指令2從寄存器種讀取穴亏。
2)填上空白的NOP:上菜的順序不必是點菜的順序——亂序執(zhí)行
在指令執(zhí)行階段通過一個類似線程池的保留站,讓系統(tǒng)自己取動態(tài)調(diào)度先執(zhí)行那些指令重挑∩せ可以有限解決流水線阻塞問題,
指令執(zhí)行的先后順序不再和程序種的順序有關(guān)谬哀。
在現(xiàn)代的Intel CPU的亂序執(zhí)行過程種刺覆,只有指令的執(zhí)行階段是亂序的。這種保證內(nèi)存數(shù)據(jù)訪問順序的模式史煎,叫做強內(nèi)存模式谦屑。
3)控制冒險解決方案——分支預(yù)測:今天下雨,明天還會繼續(xù)下雨嗎
在指令譯碼階段篇梭,提供對應(yīng)的判斷比較電路氢橙。
靜態(tài)分支預(yù)測:假裝分支不發(fā)生,按照順序執(zhí)行恬偷,一旦發(fā)生跳轉(zhuǎn)就丟棄之前的操作悍手。
動態(tài)分支預(yù)測:
一級分支預(yù)測,用一個比特記錄當前分支的比較情況袍患,使用當前分支比較情況坦康,預(yù)測下一次比較情況;
雙模態(tài)預(yù)測器:用兩個比特記錄對應(yīng)狀態(tài)诡延。