計算機發展歷程
什麼是計算機系統
計算機系統 = 硬體 + 軟體
硬體:計算機的實體,比如說CPU,記憶體條,硬碟等
軟體:具有各類特殊功能,而軟體又分為系統軟體和應用軟體
- 系統軟體:用來管理整個計算機系統,比如說Windows系統,Linux系統等
- 應用軟體:任務需要編織成的各種程式,比如QQ,微信,支付寶等
硬體的發展
發展階段`` | 時間 | 邏輯元件 | 速度 | 記憶體 | 外存 |
---|---|---|---|---|---|
第一代 | 1946-1957 | 電子管 | 幾千-幾萬 | 汞延遲線、磁鼓 | 穿孔卡片、紙帶 |
第二代 | 1958-1964 | 電晶體 | 幾萬-幾十萬 | 磁芯儲存器 | 磁帶 |
第三代 | 1964-1971 | 中小規模積體電路 | 幾十萬-幾百萬 | 半導體儲存器 | 磁帶、磁碟 |
第四代 | 1972-現在 | 大規模、超大規模積體電路 | 上千萬-上億 | 半導體儲存器 | 磁帶、磁碟、光碟、半導體光碟 |
軟體的發展
分為計算機語言的發展和作業系統的發展
計算機語言:機器語言,組合語言,高階語言
作業系統:Windows,Linux,安卓等
計算機硬體組成
計算機層次結構
馮諾依曼機特點
- 計算機硬體由運算器、儲存器、控制器、輸入和輸出裝置5個部分組成
- 指令和資料以同等地位儲存在儲存器,並可按地址尋訪
- 指令是由操作碼和地址碼組成,操作碼用於表示這是一個什麼型別的操作,地址碼用於表示運算元儲存中的存放位置
- 指令在儲存器內按順序存放(一般情況下是這樣的,但在特定條件下也可以進行設定)
- 早期的馮諾依曼機器以運算器為中心,輸入輸出裝置通過運算器與儲存器傳送資料
- 上圖中,實線是資料線,虛線是控制線(雙向)
馮諾依曼機缺陷(早期)
在控制器的指揮下,輸入和輸出裝置輸入一些資料交給運算器,如果產生中間結果,就會傳送給儲存器,計算完成後最終結果會給輸出裝置。
可以發現這種層次結構容易收到輸入和輸出裝置的牽制,因為他們的速度相較於運算器太慢了(短板效應)
現代計算機的組織結構
為了解決I/O裝置的速度和CPU速度差異懸殊的問題,現如今的計算機則採用以儲存器為中心的計算機結構組織,這種結果使I/O操作儘可能繞過CPU,直接在I/O裝置和儲存器之間完成,以提高系統的整體執行效率
計算機硬體概述
儲存器
儲存器的基本結構
儲存器基本結構:儲存器主要分為主存(記憶體)與輔存(外存)
- 主存:CPU可以直接訪問;主要存放程式和資料;是計算機實現“儲存程式”控制的基礎;外存中資訊必須載入進主存之後CPU才可以訪問;
- 輔存:CPU不可以直接訪問
主存的結構如下所示
- 儲存體M:存放二進位制
- MAR(地址暫存器):存放的是訪存地址(經過地址譯碼後找到所選儲存單元)
- MDR(資料暫存器):存放的是要從儲存器中讀入或寫入的資訊
儲存器相關基本定義
儲存器相關基本定義:目前我們採用的半導體器件來承擔儲存任務,一個半導體觸發器由於有0和1兩個狀態,就可以記憶一個二進位制程式碼,關於儲存器有如下五個非常重要的概念。
- 儲存元:也可稱為儲存元件和儲存基元,用來存放一位二進位制資訊
- 儲存單元:由若干個儲存元組成,能存放多位二進位制資訊
- 儲存體:許多儲存單元可組成儲存體,也即儲存矩陣
- 儲存字:每個儲存單元中二進位制程式碼的組合即為儲存字,可代表數值、指令和地址等
- 儲存字長:每個儲存單元中二進位制程式碼的位數就是儲存字長
上述概念可以這樣記憶:主儲存器由許多儲存單元組成,每個儲存單元包含多個儲存元,每個儲存元儲存1位二進位制程式碼0或1,故儲存單元可儲存一串二進位制程式碼,稱這串程式碼為儲存字,而這串程式碼的位數稱為儲存字長,儲存字長一般是一個位元組(8位)或位元組的偶數倍。
儲存器相關小考點
- 資料在儲存體中是按照地址儲存的,每個地址對應一個儲存單元
- 儲存單元數目=2 M A R 位數 2^{MAR位數}2
- MAR位數(如果MAR為10位,則儲存單元數目為2 10 = 1024 2^{10}=10242 10 =1024)。它用於定址,其長度和PC(程式計數器)長度一致
- MDR的位數表示儲存字長(例如MDR為16,表示儲存字長為16,也表示1個字(word)=16bit)
- 注意區分字(word)和位元組(Byte),1個位元組等於8個bit,而1個字的大小取決於機器
- 1B=1個位元組,1b=1個bit
運算器
運算器:是計算機的執行部件,主要進行
- 算數運算:比如加減乘除
- 邏輯運算:比如與、或、非、異或、比較等等
運算器基本結構
運算器基本結構:由以下四部分構成
- ALU(算數邏輯單元):運算器中造價最為高昂的部分,本質是一對電路
- ACC(累加器):用於存放運算元,或運算結果
- MQ(乘商暫存器):在乘除運算式,用於存放運算元或運算結果
- X(運算元暫存器):用於存放運算元
運算器過程虛擬碼描述(瞭解)
設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
控制器
運算器:是計算機的指揮中心,由其指揮各部分自動協調地進行工作
指令:是指指揮機器工作的指示和命令,程式本質就是一系列按照一定順序排列的指令。人們用程式表達自己的意圖,控制器則通過指令指揮機器工作,指令 = 操作碼 + 地址碼
- 操作碼:指示計算機要幹什麼
- 地址碼:幹這些事情需要的原材料在哪裡
控制器基本結構
- 控制單元(CU):分析指令、發出訊號、協調操作
- 指令暫存器(IR):存放當前要執行的指令。注意其內容來源MDR,因為指令和資料本質是一樣的,都被存放在儲存器
- 程式計數器(PC):存放當前要執行的指令地址。注意其與MAR直接連通,並且可以自動+1
控制器過程虛擬碼描述
完成一條指令的過程為:取指令(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
最後再讀取到停機指令時,計算機通過中斷機制就結束了程式的執行
計算機系統的層次結構
計算機系統的層次結構:指的是計算機系統由硬體和軟體兩大部分所構成,而如果按功能再細分,可分為7層。把計算機系統按功能分為多級層次結構,就是有利於正確理解計算機系統的工作過程,明確軟體,硬體在計算機系統中的地位和作用。
計算機效能指標
儲存器的效能指標
儲存器的效能指標主要有:儲存容量,單位成本,儲存速度
儲存容量 = 儲存字數 * 儲存字長
儲存字數:儲存器的地址空間大小
(用在儲存裡的M常表示2^20, 而在通訊中常表示10^6)
字長:一次存取操作的資料量(單位bit)