一:計算機層次結構
(1)早期的馮諾依曼機
馮諾依曼機特點如下
- 計算機硬件系統由運算器、存儲器、控制器、輸入和輸出設備5部分組成
- 指令和數據以同等地位存儲在存儲器,并可按地址尋訪
- 指令由操作碼和地址碼組成,操作碼用于表示操作的性質,地址碼用于表示操作數在存儲器的位置
- 指令在存儲器内按順序存放。通常指令是按照順序存放的,但是在特定條件下可以進行設定
- 早期的馮諾依曼機器以運算器為中心,輸入輸出設備通過運算器與存儲器傳送數據
其中,實線是數據線,虛線是控制線(雙向)。在這種層次結構下,在控制器的指揮下,輸入和輸出設備輸入一些數據給運算器進行各種運算,如果産生中間結果,就會給存儲器,計算完成結果給到輸出設備。可以發現這種層次結構容易受到輸入和輸出設備的牽制,因為他們的速度相較于運算器太慢了,也即是短闆效應
(2)現代計算機的組織結構
為了解決I/O設備的速度和CPU速度差異懸殊的問題,現如今的計算機則采用以存儲器為中心的計算機組織結構
這種結果使I/O操作盡可能繞過CPU,直接在I/O設備和存儲器之間完成,以提高系統的整體運行效率
二:計算機硬件概述
(1)存儲器
A:存儲元、存儲單元、存儲體、存儲字和存儲字長
目前我們采用半導體器件來承擔存儲任務,一個半導體觸發器由于有0和1兩個狀态,就可以記憶一個二進制代碼。比如1個數需要用16位二進制代碼表示,那麼就需要有16個觸發器來保存這些代碼,這16個觸發器就是一個存儲單元。
主存儲器由許多存儲單元組成,每個存儲單元包含多個存儲元,每個存儲元存儲1位二進制代碼0或1.故存儲單元可存儲一串二進制代碼,稱這串代碼為存儲字,這串代碼的位數稱為存儲字長,存儲字長一般是一個字節(8位)或字節的偶數倍。許多存儲單元共同構成了一個存儲體。
B:存儲器的基本結構
存儲器分為主存(内存)和輔存(外存)。CPU可以直接訪問的是内存,内存主要存放的是程序和數據,是計算機實現“存儲程序”控制的基礎;外存中信息必須加載進内存後,CPU才可以訪問
主存最基本構成如下。存儲體存放二進制信息,MAR存放訪存地址,經過地址譯碼後找到所選存儲單元;MBR用于暫時存要從存儲器中讀入或寫入的信息。
【考點】
- 數據在存儲體中是按照地址存儲的,每個地址對應一個存儲單元;
- 存儲單元數目=2MAR位數
- ,例如如果MAR為10位,則存儲單元數目為210
- =1024。它用于尋址,其長度和PC長度一緻
- MDR的位數表示存儲字長,例如MDR為16,表示存儲字長為16,也表示1個字(word)=16bit
- 注意區分字(word)和字節(Byte),1個字節等于8個bit,而1個字的大小取決于機器
- 1B=1個字節,1b=1個bit
(2)運算器
運算器是計算機的執行部件,用于進行算數運算和邏輯運算
- 算數運算:比如加減乘除
- 邏輯運算:比如與、或、非、異或、比較等等
A:運算器基本結構
其中ALU是運算器造價最為高昂的部分,其實就是一堆複雜的電路
其餘三個分别是寄存器,輔助ALU完成計算功能,作用如下了解即可
B:運算器過程僞代碼描述
設M為主存中的某一個存儲單元,(M)表示取M中的數據,->表示将内容送入寄存器
加法實現:假設ACC中已經存在一個數,那麼首先取M的内容送入操作數寄存器X,即(M)->X;然後兩者相加重新送入寄存器ACC中,即(ACC) (M)->(ACC)
乘法實現:假設ACC中已經存在一個數,那麼首先取M的内容送入乘商寄存器MQ作為乘數,即(M)->MQ,再取ACC寄存器的内容放入X寄存器作為被乘數,即ACC->X,接着将ACC清零,即0->ACC,然後乘數乘以被乘數,一個送入乘積高位,一個送入乘積低位,即(X)×(MQ)->ACC//MQ
除法實現:假設ACC中已經存在一個數,首先取M的内容送入X作為除數,即(M)->X,ACC中的内容作為被除數,結果一個放入MQ作為整數部分,即(ACC)/(X)->MQ,另一個放入ACC作為餘數,即(ACC)%(X)->ACC
(3)控制器
控制器是計算機的指揮中心,由其指揮各部件自動協調地進行工作
A:指令
計算機指令就是指揮機器工作的指示和命令,程序本質就是一系列按照一定順序排列的指令
控制器靠指令指揮機器工作,人們用指令表達自己的意圖,并交給控制器執行
指令=操作碼 地址碼
操作碼就是指示計算機要幹什麼,地址碼可以理解為幹這些事情需要的原材料在哪裡,比如主存中就有可能存儲一些我們需要用到的數據,甚至可以是一些IO設備,比如鍵盤的地址
B:控制器基本結構
控制器基本結構如下
- 控制單元(CU):分析指令、發出信号、協調操作
- 指令寄存器(IR):存放當前要執行的指令,注意内容來源于MDR,因為指令和數據一樣也被存在存儲器
- 程序計算器(PC):存放當前要執行的指令地址, 與MAR直接連通,并且可以自動 1
C:控制器過程僞代碼描述
完成一條指令的過程為:取指令(PC)->分析指令(IR)->執行指令(CU)
具體過程:首先取出指令,即(IR),接着獲取指令的操作碼,即OP(IR),然後獲取指令的地址碼,即AD(IR),然後将操作碼送入控制單元分析,即OP(IR)->CU,操作碼表示需要幹什麼,但是幹活需要原材料,所以再把指令的地址碼送入MAR,AD(IR)->MAR,從MAR指示的存儲體取出原材料即可。
結合前面的加法,我們可以寫出完整的加法運算的過程的: 首要取加法指令,而指令存儲在存儲體中,想要取出指令必須要知道的指令的地址,而這個地址就存放在PC中,PC又和MAR直接相連,即(PC)->MAR,于是指令此時被放入了MDR中,那麼接着将指令放入IR中,即(MDR)->IR,接着取指令的操作碼送入控制單元,即OP(IR)->CU,然後再把原材料(就是一些操作數)的地址碼送入MAR,即AD(IR)->MAR。接着就可以進行加法操作了,由于上一步已經将操作數的地址碼送入了MDR中,所以現在送入操作數寄存器,即(MDR)->X,然後(ACC) (X)->ACC,最後PC要自增,即(PC) 1->PC,表示下一條指令
精華:計算機的工作過程
學習到這裡,我們就可以從硬件到角度分析一下,看似簡單的C語言代碼,在背後計算機究竟做了多少事情
以下程序非常簡單,聲明了4個變量并賦值,然後在main函數内進行運算
int a=2,b=3,c=1,y=0; void main() { y=a*b c; }
經過編譯器編譯後,這段程序在主存中就是這樣的
- 下半部分是定義的變量,上半部分則是對應于高級語言對應的機器指令
為了方便演示,我們将控制器、運算器和存儲體也放在旁邊
第一組
1:程序開始運行,PC的值為0,保存的是第一條指令的地址。然後将PC的内容,也就是指令的地址送入到MAR中,即(PC)->MAR,MAR=0。也就是說控制器向存儲器指明,我接下來要訪問主存0号地址處的數據,同時告訴存儲器進行讀操作
2 3:主存儲器會根據MAR記錄的地址信息,到存儲體中找出0号地址對應的二進制數據,并将其放入到MDR中,此時MDR中存放了第一條指令。即M(MAR)->MDR,此時MDR=000001 0000000101
4:接着将MDR中的指令放入IR中,于是控制器就存放了當前要執行的指令。即(MDR)->IR,(IR)=000001 0000000101
5:這條指令的前6個比特位是地址碼,會被送入到控制單元CU中,CU分析後,得知這是一條取數命令。即OP(IR)->CU
6:取數指令會将變量a的内容放入寄存器ACC中。但是現在變量a不知道在哪裡,所以現在會把指令的地址碼送到MAR當中,即(MAR)=5
7 8:接着主存儲器根據MAR指明的地址,也就是a的地址(5),去存儲體中找出5号地址的數據,并将其放入MDR當中。即M(MAR)->MDR,(MDR)=0000000000000010,也即(MDR)=2
9:接着在控制單元的指揮下,MDR中的數據就被放入到了ACC中。至此第一條指令完成
10:最後PC自增1,進行下一條指令,即(PC)=1
接下來進行下一組操作
1:程序接着運行,PC的值為1,保存的是第二條指令的地址。然後将PC的内容,也就是指令的地址送入到MAR中,即(PC)->MAR,MAR=1。也就是說控制器向存儲器指明,我接下來要訪問主存1号地址處的數據,同時告訴存儲器進行讀操作
2 3:主存儲器會根據MAR記錄的地址信息,到存儲體中找出1号地址對應的二進制數據,并将其放入到MDR中,此時MDR中存放了第二條指令。即M(MAR)->MDR,此時MDR=000100 0000000110
4:接着将MDR中的指令放入IR中,于是控制器就存放了當前要執行的指令。即(MDR)->IR,(IR)=000100 0000000110
5:這條指令的前6個比特位是地址碼,會被送入到控制單元CU中,CU分析後,得知這是一條乘法命令。即OP(IR)->CU
6:接着把指令的地址碼送到MAR當中,即(MAR)=6
7 8:接着主存儲器根據MAR指明的地址,也就是b的地址(6),去存儲體中找出6号地址的數據,并将其放入MDR當中。即M(MAR)->MDR,(MDR)=0000000000000011,也即(MDR)=3
9:由于是乘法,所以控制單元将MDR中的内容送入到乘商寄存器MQ中,即(MDR)->MQ,此時(MQ)=0000000000000011=3
10:先把a的值放入通用寄存器X中,即(ACC)->X,(X)=2
11:CU告訴ALU,讓其進行乘法運算。即(MQ)×(X)->ACC,(ACC)=6。注意如果乘積過大,需要MQ輔助存儲,也就是最上面講到過的(X)×(MQ)->ACC//MQ
接着進行下一組操作,具體過程就不詳細演示了,步驟如下
- 1:PC存儲2号指令的地址,(PC)->MAR,(MAR)=2
- 2 3:M(MAR)->MDR,(MDR)=000011 0000000111
- 4:(MDR)->IR,(IR)=000011 0000000111
- 5:OP(IR)->CU,CU分析操作碼,得知這是加法執行
- 6:Ad(IR)->MAR,将指令的地址碼送入MAR,(MAR)=7
- 7 8:M(MAR)->MDR,(MDR)=00000000 00000001=1
- 9:(MDR)->x,(X)= 00000000 00000001=1
- 10:(ACC) (X)->ACC,(ACC)->7,由ALU實現加法運算
接着進行下一組操作
- 1:(PC)->MAR,(MAR)=3
- 2 3:M(MAR)->MDR,MDR=000010 0000001000
- 4:(MDR)->IR,(IR)000010 0000001000
- 5:OP(IR)->CU,CU分析得知,這是存數指令
- 6:AD(IR)->MAR,(MAR)=8
- 7 8:(ACC)->MDR,MDR=7
- 9:(MDR)->地址為8的存儲單元,導緻y=7
最後再讀取到停機指令時,計算機通過中斷機制就結束了程序的運行
,