一:計算機層次結構
(1)早期的馮諾依曼機
馮諾依曼機特點如下
其中,實線是數據線,虛線是控制線(雙向)。在這種層次結構下,在控制器的指揮下,輸入和輸出設備輸入一些數據給運算器進行各種運算,如果産生中間結果,就會給存儲器,計算完成結果給到輸出設備。可以發現這種層次結構容易受到輸入和輸出設備的牽制,因為他們的速度相較于運算器太慢了,也即是短闆效應
(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用于暫時存要從存儲器中讀入或寫入的信息。
【考點】
(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:控制器基本結構
控制器基本結構如下
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
接着進行下一組操作,具體過程就不詳細演示了,步驟如下
接着進行下一組操作
最後再讀取到停機指令時,計算機通過中斷機制就結束了程序的運行
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!