计算机组成原理笔记(王道考研) 第一章:计算机系统概述
內容基于中國大學MOOC的2023考研計算機組成原理課程所做的筆記。
感謝LY,他幫我做了一部分筆記。由于聽的時間不一樣,第四章前的內容看起來可能稍顯啰嗦,后面會記得簡略一些。
?
西電的計算機組織與體系結構課講法和王道考研的課不太一樣,要應付校內考試建議還是跟著老師學比較好。以下是20年西電計科院車向泉老師這門課的錄播下載鏈接(請勿將錄像上傳到B站等網站!!):
鏈接:https://pan.baidu.com/s/1bFs3ajhy8ZcbHopS9izGsw
提取碼:fdez
期中考試占20分,一般只考前兩章內容,期末考試占60分,一般前兩章內容不考,考察內容一般考前的復習課都會講清楚,請務必認真聽復習課。
?
其他各章節的鏈接如下:
計算機組成原理筆記(王道考研) 第一章:計算機系統概述
計算機組成原理筆記(王道考研) 第二章:數據的表示和運算1
計算機組成原理筆記(王道考研) 第二章:數據的表示和運算2
計算機組成原理筆記(王道考研) 第三章:存儲系統
計算機組成原理筆記(王道考研) 第四章:指令系統
計算機組成原理筆記(王道考研) 第五章:中央處理器
計算機組成原理筆記(王道考研) 第六章:總線
計算機組成原理筆記(王道考研) 第七章:輸入輸出系統
其他各科筆記匯總
計算機系統概述
導言
計算機組成原理研究計算機硬件在底層是如何相互協調工作的。
以玩游戲為例。CPU性能如何決定了玩游戲的時候圖像處理的速度。運行內存越大,同時開多個應用程序會更流暢。機身存儲決定了可以存多少資料。
以一款筆記本標出的硬件參數為例:I7-9750H(CPU型號,處理能力如何),8G(內存大小),512G固態(硬盤存儲容量,讀寫速度如何),GeForce GTX1660Ti 6G獨顯(顯卡)
計算機唯一能識別的數據是二進制0/1。用低/高電平分別表示0/1,通過電信號來傳遞數據。通過很多條電路(如主板上的印刷電路),可以傳遞多個二進制數位。每個二進制數位稱為1 bitbitbit(比特)。
此處的低/高電平理解成低/高電壓即可
計算機系統的發展
什么是計算機系統
計算機系統=硬件+軟件
-
硬件:計算機的實體,如主機,外設等。外設就是鼠標,鍵盤,顯示器這些設備。
-
軟件:由具有各類特殊功能的程序組成
?
軟件又可以分為系統軟件和應用軟件
- 系統軟件:用來管理整個計算機系統
Eg:操作系統,數據庫管理系統(DBMS),標準程序庫,網絡軟件,語言處理程序,服務程序
名詞的簡單解釋:
- 標準程序庫就是編程的時候使用的那些庫函數
- 網絡軟件是實現TCP-IP協議的那些軟件模塊
- 語言處理軟件是那些編譯程序,匯編程序。把編程使用的高級語言翻譯為更低級的機器語言
- 服務類程序有很多。我們調試代碼用的程序就是服務程序的一種
- 應用軟件:按任務需要編制成的各種程序
Eg:抖音,王者榮耀,迅雷,美圖秀秀…
硬件的發展
| 第一代:電子管時代 | 電子管 | 體積超大,耗電量超大。使用機器語言編程 |
| 第二代:晶體管時代 | 晶體管 | 體積,功耗降低。出現面向過程的程序設計語言:FORTRAN。有了操作系統雛形 |
| 第三代:中小規模集成電路時代 | 中小規模集成電路 | 將元件集成在基片上。計算機主要用于科學計算等專業用途。高級語言迅速發展。開始有了分時操作系統 |
| 第四代:大規模,超大規模集成電路時代 | 大規模,超大規模集成電路時代 | 開始出現“微處理器”(CPU就是微處理器的一部分),微型計算機。個人計算機(PC)萌芽。操作系統:Windows,MacOsMacOsMacOs,Linux |
微處理器的發展以微處理器技術為標志。微處理器不斷發展,對應的機器字長不斷增加。
機器字長:計算機一次整數運算所能處理的二進制位數
摩爾定律:集成電路上可容納的晶體管數目,約每隔18個月便會增加一倍,整體性能也將提升一倍
軟件的發展
機器語言/匯編語言→\to→FORTRAN/PASCAL/C++/Java…
使用高級語言編程的時候就不需要關心機器的具體特性如何,只需要專注于所需要解決的問題
DOS(只能用命令行的方式操作計算機)→\to→Windows,Android/iosiosios(擁有圖形化的界面)
目前的發展趨勢
目前計算機的發展趨勢呈現兩極分化:
一級是微型計算機向更微型化,網絡化,高性能,多用途方向發展。
另一極是巨型機向更巨型化,超高速,并行處理,智能化方向發展。
計算機硬件的基本組成
早期馮諾依曼機的結構
馮諾依曼提出了“存儲程序”的概念。指將指令以二進制代碼的形式事先輸入計算機的主存儲器(內存),然后按其在存儲器中的首地址執行程序的第一條指令,以后就按該程序的規定順序執行其他指令,直至程序執行結束
程序是指令和數據的集合
注意說的是主存儲器不是存儲器!存儲器包括主存(內存)和輔存(固態硬盤),前者屬于主機,后者則屬于I/O設備。像我們平時手機里的APP就是存放在輔存里面的,只有需要啟動運行的時候才會把輔存里面的APP相關程序代碼數據讀到主存里面
下圖就是一個馮諾依曼機的示意圖
控制器會利用電信號來協調其他部件相互配合的工作,也負責解析存儲器里所存儲的程序指令
?
馮諾依曼計算機的特點:
- 計算機由五大部件組成
- 指令和數據以同等地位存于存儲器,可按地址尋訪
- 指令和數據用二進制表示
- 指令由操作碼和地址碼組成
- 存儲程序
- 以運算器為中心
輸入/輸出設備與存儲器之間的數據傳送通過運算器完成
這幾個特點在學完下一節后再回頭來看下會有更好的體會
現代計算機的結構
現代計算機以存儲器為中心
?
我們常說的CPU=運算器+控制器,所以也可以上圖的結構框圖簡化一下為下圖
注意這里的主機和我們平常生活中說的主機是有區別的。平常說的主機除了有CPU和主存儲器之外,還有硬盤,風扇之類。
各個硬件的工作原理
主存儲器的基本組成
CPU從主存儲器中取數據會先把它想要的數據存放的地址寫到MAR中,主存儲器根據MAR接收到的地址信息從存儲體中拿出CPU想要的數據并存到MDR中。最后CPU通過數據線路從MDR中取走數據。
CPU寫入數據時會指明它想要寫入到哪個位置,寫入的具體數據放到MDR中。最后CPU通過控制總線告訴主存儲器要執行寫操作。主存儲器根據CPU發出的這三個信息就可以往對應的位置寫入數據
接下來把注意力放到存儲體上
運算器的基本組成
通用寄存器可能有多個。ALU是運算器的核心部件
控制器的基本組成
CU是控制器的核心部件
計算機最主要的工作就是執行代碼,而我們所用的代碼就是一條條的指令。每完成一條指令需要三個階段。先取指令,根據PC里記錄的指令地址從內存里取出對應的指令。取出的指令放在IR中,CU分析這條指令到底要干什么。分析完后CU控制其他部件配合著完成指令的具體執行
計算機的工作過程
下面舉一個具體的例子來演示計算機的工作過程。
C語言寫好的程序經過編譯鏈接后從高級語言被翻譯為機器語言并裝入主存。
由上圖可以看到每一個存儲單元都是16個bitbitbit,也就是存儲字長是16bitbitbit。每一條指令的兩個部分也是占16bitbitbit,只不過在執行這些指令的時候CPU會自動把它們拆解成操作碼和地址碼兩個部分
首先指令和變量的數據都存放在存儲體當中。這個程序要執行的第一個指令存放在0號位置。所以在程序運行之前,PC指向0位置。
接下來把這個位置存放的指令取出執行,首先PC存放的指令需要通過地址總線傳送到MAR中。因為PC=0,所以該操作導致(MAR)=0,也就是控制器向主存指明了接下來要訪問的是0號地址所對應的數據。同時控制器會通過控制總線告訴主存儲器這次要進行的是讀操作。
把寄存器外面打一個括號表示的是寄存器里面的內容
接下來主存儲器會根據MAR記錄的地址信息去存儲體中找出0號位置所對應的二進制數據并將這些數據放到MDR中。導致現在MDR當中存放的就是我們要讀取的第一條指令。
M(MAR)→\to→MDR。括號外M表示主存儲器,主存儲器里的MAR地址所指明的數據放到MDR當中
這條指令會沿地址總線被放到IR當中,導致IR中存放此次要執行的指令。
這條指令的前6個bitbitbit(操作碼,對應00001)會被送到CU控制單元里。CU分析得出這是“取數”指令。所以接下來要把地址碼所指明的內存單元里的數據取出并放到ACC寄存器當中。
既然要讀取主存的這個地址的信息,就需要把地址碼信息(0000000101,轉換為二進制為5)送到主存的MAR當中,導致(MAR)=5。5號存儲單元所指向的剛好就是a這個變量所存放的位置。
接下來主存儲器根據MAR指明的地址去存儲體當中找出5號單元的這些數據并且把這些數據放到MDR當中,也就是把a這個變量的值放到MDR里。
最后在控制單元的指揮下,MDR里的數據會被傳送到ACC當中。
到此為止我們就完成了取數的指令,最終導致a這個變量的值被放到ACC當中。
在上一步的取指令動作完成之后PC值就自動加一了,0+1=1指明了下一條我們要執行的指令應該在1這個單元。
接下來根據PC所指向的位置取得第2條指令,取指令的過程和之前是類似的。通過前4步把第2條指令放到IR當中。
取完指令之后就要分析指令。和之前一樣會把操作碼部分(00100)送到CU控制單元,CU控制單元分析得出這是乘法指令。接下來CU會指揮其他部件來協調完成乘法操作。
現在這步要完成的是 a×ba\times ba×b 的操作。而a變量之前已經被送到ACC中。所以現在這條乘法指令的地址碼(0000000110=6)指明的是另一個乘數b的存放位置,這條指令的地址碼會被送到MAR中指明我要取出6號存儲單元里的數據。
接下來主存會根據MAR所指明的地址取出相應的數據,也就是把b變量的值放到MDR當中。
接下來b的值會通過數據總線送到MQ中。
接下來還要把a的值放到x中。
當CPU執行乘法操作的時候,它會把被乘數放到x中,然后把被乘數放到MQ中
接下來CU通過控制線告訴ALU讓它進行乘法運算。ALU會把x和MQ里面存儲的數進行相乘操作然后把最終結果放到ACC中。
在這個例子中相乘的兩個數很小,如果兩個數很大,ACC可能存不下結果,這時就需要MQ輔助存儲。MQ里面會用來存放乘法結果的低位。
到此為止就完成了第2條指令也就是乘法指令
和前邊的一條指令相比,其實第1步到第5步每一步要做的事情都是一模一樣的。只有當CU分析出這條指令是乘法指令的時候接下來的操作才會產生區別。取指令結束后PC的值也會自動加1指向下一條要執行的指令。
上次取指令結束的時候,PC的值也會自動加1,所以這條指令執行結束之后得到的效果就是PC指向了2,也就是指向了下一條要執行的指令。ACC里面存儲了上一個運算的結果,即a×b=6a\times b=6a×b=6。
接下來執行2這個地址存放的指令,前面的幾個步驟都是一樣的。通過5個步驟可以完成取指令和分析指令的操作。最終CU分析得到這是“加法”指令。接下來CU會根據”加法“指令的步驟來指揮其他部件協調工作。
這次要計算的是 a×b+ca\times b+ca×b+c。a×ba\times ba×b的結果已經存放在ACC當中,所以這個加法指令的地址碼(0000000111=7)指明的是c這個變量的存放地址。
接下來要取出7這個地址存放的數據。需要把這個地址碼送到MAR,主存根據MAR指明的地址取出相應的數據,也就是把c的值放到MDR當中。
接下來這步會把MDR的值傳送到x中。
當我們進行加法運算的時候,ACC里面會先存入被加數,x里面存放加數。
然后控制單元會向ALU發送一個信號,告訴其此次要執行的是加法操作。ALU就會把ACC和x里面存放的值進行相加,并且把加得的值結果再次存回ACC當中。
因此這就導致了(ACC)=7,也就是把a×b+ca\times b+ca×b+c的值存放到了ACC里面。
到此為止我們完成了第三條指令也就是加法指令。
前面的5個步驟和之前的兩條指令沒有任何區別。另外在取完指令之后也會自動地進行PC加1的操作,也就是PC會指向下一條我們應該執行的指令
接下來這條指令的執行前邊的步驟都是一樣的。根據PC記錄的地址取出這條指令并且放到IR寄存器當中,然后第5個步驟會把操作碼送到CU中進行分析得到這是“存數”指令。也就是要把ACC里面的數據存到地址碼(0000001000=8)所指明的存儲單元中,而8這個存儲單元剛好對應的是y這個存儲單元的位置。現在ACC里面存的是7,也就是a×b+ca\times b+ca×b+c的值。
接下來執行存數指令。首先會把指令的地址碼部分送到MAR中,用來指明此次我要存入的是哪個存儲單元。另外還需要把ACC里面的運算結果通過數據總線送到MDR當中。也就是說此時MDR里面保存了a×b+ca\times b+ca×b+c的值,并且此時MAR里邊指明了這個值是要存到內存地址為8的地方。
接下來CU控制單元會通過控制總線告訴主存儲器說此次要進行的是寫操作。于是主存儲器會根據MAR的地址把MDR當中的數據放到相應的位置當中。這就導致了8號存儲單元的值變為了7,也就是最終我們想要得到的結果y=a?b+cy=a*b+cy=a?b+c。
同樣存數指令的執行,取指令和分析指令的階段做的事情和前面那些指令沒有什么區別。只有分析出了指令之后才會在CU控制單元的控制之下執行一些不一樣的操作。同樣PC會加1指向下一條應該執行的指令
接下來執行這條指令。和之前一樣首先需要取出指令,把這個指令取到IR中。接下來要把操作碼部分送到CU里面,CU分析得到這是“停機”指令。
執行到這一步就知道我們的這段程序運行結束了。學過操作系統就會知道要停止一個進程的運行需要通過系統調用或者中斷機制來通知操作系統終止該進程。于是接下來執行的指令就不是這一系列指令,而是操作系統相關的指令,后續的部分就不需要再關心了。
到此為止我們就一步一步模擬了這個程序執行的過程
總結一下
“取數”指令的執行可以分為取指令,分析指令和執行指令這三個階段。任何一條指令的執行一定都是這樣3個階段。
無論我們執行的是什么指令,前面取指令和分析指令的步驟其實都是一模一樣的,只有分析完指令之后,CU才會知道這條指令到底要做什么。于是接下來的步驟對于不同的指令來說就有可能不一樣。
在取指令的階段,MDR里的數據肯定是要傳到IR,而在執行指令的階段CU會根據具體的這條指令來決定MDR里的數據應該是放到ACC還是MQ還是其他的通用寄存器里面。所以根據指令執行周期的不同,它處于不同的階段,CPU就會區分出我們這次從內存里取出的到底是指令還是數據了。
我們這個小節給的例子中,每一條指令只有一個操作碼和一個地址碼。但有的計算機它所支持的指令有可能有多個地址碼,比如后面會講的二地址指令。
計算機系統的多級層次結構
高級語言編寫的代碼最終要翻譯成機器語言才能被CPU執行(機器語言指的就是用二進制表述的指令)。傳統意義上的機器只能識別機器語言。CPU在執行用二進制表示的機器指令時還需要把這些機器指令分為更細的小步驟(微指令,微操作)執行。
像上一節的例子中第一條機器指令(取數的指令)就需要被劃分為9個微指令依次執行才能完成
可以把下圖中的微程序機器看成對上層傳統機器的分解。也就是用微程序機器的微指令來解釋并執行傳統機器的每一條機器指令
顯然這樣編程很不方便,所以出現了符號式的設計語言,也就是匯編語言。對于使用匯編語言的程序員來說,他所看到的機器似乎是可以直接識別他所編寫的匯編語言程序的。所以使用匯編語言的程序員所看到的機器被稱為虛擬機器。
之所以叫虛擬是因為任何一臺機器都不可能直接識別匯編語言,匯編語言編寫的程序想要執行必須通過匯編程序的翻譯翻譯為等價的機器指令才可以執行。
隨著計算機的發展,慢慢出現了各種高級語言。用高級語言編寫的代碼需要經過編譯程序翻譯成匯編語言程序。
另一方面我們所編寫的這些程序難免會用到操作系統所提供的各種服務,比如說某些系統調用。所以一般來說用匯編語言編寫的程序同樣也需要請求操作系統的服務,也就是通過系統調用的方式來請求。系統調用又可以被稱為廣義指令。因此下圖的層次結構中在匯編語言的下方再插入操作系統機器。
操作系統及其之上的部分屬于軟件的部分,而傳統機器和微指令機器屬于硬件的部分。
?
剛才我們提到了三種級別的語言。高級語言編寫的源程序需要通過編譯程序翻譯為與之等價的匯編語言程序。匯編語言本質上是一些助記符,一些方便人類記憶的符號而已,本質上它和機器語言是一一對應的。匯編語言在經過匯編程序翻譯后就能得到與之對應的機器語言程序。機器語言程序才是可以讓CPU執行的程序。C/C++就需要一步編譯和一步匯編才能得到可執行的程序。
當然如果你的程序里調用了其他的庫函數,那么在經過匯編之后還要再經過鏈接的操作,也就是把你的程序還有你所調用的其他一些東西聯系起來。
也有一些語言經過編譯程序編譯之后可以直接由源程序得到最終可以執行的機器語言程序。
還有一些高級語言(很多腳本語言,例如JavaScript,Python,Shell)通過解釋程序翻譯為對等的機器指令。編譯程序和解釋程序是不一樣的,區別見下圖。
想想C語言編譯匯編之后得到的.exe文件,這個文件就是機器語言描述的程序
后面講了下計算機體系結構和計算機組成原理兩門課內容的區別,略過不記
計算機的性能指標
存儲器的性能指標
CPU性能指標
系統整體的性能指標
系統整體的性能指標(動態測試)
常說的“跑分軟件”比如魯大師之類就是基準程序
?
下面看幾個問題
1.主頻高的CPU一定比主頻低的CPU快嗎?
不一定,如兩個CPU,A的主頻為2GHz,平均CPI=10;B的主頻1GHz,平均CPI=1
2.若A、B兩個CPU的平均CPI相同,那么A一定更快嗎?
也不一定,還要看指令系統,如 A不支持乘法指令,只能用多次加法實現乘法;而B支持乘法指令
3.基準程序執行得越快說明機器性能越好嗎?
基準程序中的語句存在頻度差異,運行結果也不能完全說明問題
總結
以上是生活随笔為你收集整理的计算机组成原理笔记(王道考研) 第一章:计算机系统概述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端学习(3104):react-hel
- 下一篇: 犀牛建计算机键盘,犀牛建模基础教程 键盘