1.計算機的發(fā)展
??計算機的發(fā)展包括了硬件和軟件的發(fā)展倔撞,硬件的發(fā)展為計算機提供了更快的處理速度盒犹,而軟件的發(fā)展為用戶提供了更好的體驗权悟。兩者相輔相成缰揪,密不可分陨享。
第一階段: 60年代中期以前葱淳,是計算機系統(tǒng)發(fā)展的早期時代。在這個時期通用硬件已經(jīng)相當(dāng)普遍抛姑,軟件卻是為每個具體應(yīng)用而專門編寫的赞厕,大多數(shù)人認為軟件開發(fā)是無需預(yù)先計劃的事情。這時的軟件實際上就是規(guī)模較小的程序定硝,程序的編寫者和使用者往往是同一個(或同一組)人皿桑;
第二階段:從60年代中期到70年代中期,是計算機系統(tǒng)發(fā)展的第二代蔬啡。在這10年中計算機技術(shù)有了很大進步诲侮。多道程序、多用戶系統(tǒng)引入了人機交互的新概念箱蟆,開創(chuàng)了計算機應(yīng)用的新境界沟绪,使硬件和軟件的配合上了一個新的層次;
第三階段:計算機系統(tǒng)發(fā)展的第三代從20世紀70年代中期開始空猜,并且跨越了整整10年绽慈。在這10年中計算機技術(shù)又有了很大進步。分布式系統(tǒng)極大地增加亍計算機系統(tǒng)的復(fù)雜性辈毯,局域網(wǎng)坝疼、廣域網(wǎng)、寬帶數(shù)字通信以及對“即時”數(shù)據(jù)訪問需求的增加谆沃,都對軟件開發(fā)者提出了更高的要求裙士;
第四階段:在計算機系統(tǒng)發(fā)展的第四代已經(jīng)不再看重單臺計算機和程序,人們感受到的是硬件和軟件的綜合效果管毙。由復(fù)雜操作系統(tǒng)控制的強大的桌面機及局域網(wǎng)和廣域網(wǎng),與先進的應(yīng)用軟件相配合桌硫,已經(jīng)成為當(dāng)前的主流夭咬。計算機體系結(jié)構(gòu)已迅速地從集中的主機環(huán)境轉(zhuǎn)變成分布的客戶機/服務(wù)器。
2. 計算機基本原理
??Copy了點計算機的發(fā)展歷史铆隘,現(xiàn)在可以來看看計算機的基本工作原理了∽慷妫現(xiàn)代計算機,大部分都是基于馮諾依曼體系結(jié)構(gòu)膀钠,而我們這里談?wù)摰囊彩谴藛柷疤崽屯濉qT諾依曼的核心是:存儲程序,順序執(zhí)行肿嘲。所以不管計算機如何發(fā)展融击,基本原理是相同的。計算機程序?qū)嶋H上是告訴計算機做什么雳窟。
- 馮諾依曼體系結(jié)構(gòu)
馮諾依曼體系結(jié)構(gòu)有以下特點:
計算機處理的數(shù)據(jù)和指令一律用二進制數(shù)表示尊浪;
指令和數(shù)據(jù)不加區(qū)別混合存儲在同一個存儲器中;
順序執(zhí)行程序的每一條指令;
計算機硬件由運算器拇涤、控制器捣作、存儲器、輸入設(shè)備和輸出設(shè)備五大部分組成鹅士。
馮諾依曼體系結(jié)構(gòu)的計算機必須具有如下功能:
把需要的程序和數(shù)據(jù)送至計算機中券躁;
必須具有長期記憶程序、數(shù)據(jù)掉盅、中間結(jié)果及最終運算結(jié)果的能力也拜;
能夠完成各種算術(shù)、邏輯運算和數(shù)據(jù)傳送等數(shù)據(jù)加工處理的能力怔接;
能夠根據(jù)需要控制程序走向搪泳,并能根據(jù)指令控制機器的各部件協(xié)調(diào)操作;
能夠按照要求將處理結(jié)果輸出給用戶扼脐。
2.2 計算機工作原理
對于我們現(xiàn)代計算機來說岸军,最關(guān)鍵的2個部件就是CPU和內(nèi)存。內(nèi)存存儲了要執(zhí)行的程序指令瓦侮,而CPU就是用來執(zhí)行這些指令艰赞。CPU首先要知道這些指定存放在存儲器的那個區(qū)域,然后才能執(zhí)行肚吏,并且把執(zhí)行的結(jié)果寫入到執(zhí)行區(qū)域方妖。
2.2.1 CPU指令和編程語言
在了解CPU和存儲器工作原理之前,先來了解一下CPU指令和我們編程語言之間的一些關(guān)系罚攀。
2.2.1.1 CPU指令
因為在計算機中指令和數(shù)據(jù)都用二進制來表示党觅,也就是說它只認識0和1這樣的數(shù)字。最早期的計算機程序通過在紙帶上打洞來人工操操作的方式來模擬0和1斋泄,根據(jù)不同的組合來完成一些操作杯瞻。后來直接通過直0和1編程程序,這種稱之為機器語言炫掐。這里就會有一個疑問魁莉,計算機怎么知道你這些組合的意思?
于是就出現(xiàn)了CPU指令募胃,我們現(xiàn)在買CPU都會聽到指令集這一說旗唁。CPU指令其實就對應(yīng)了我們這里說的0和1的一些組合。每款CPU在設(shè)計時就規(guī)定了一系列與其硬件電路相配合的指令系統(tǒng)痹束。有了CPU指令集的文檔你就可以通過這個編寫CPU認識的機器代碼了检疫。所以對于不同CPU來說可能會有不同的機器碼。比如下面我們就定義了一套我們CPU硬件電路可以完成的CPU指令参袱。
指令 | ** 格式** | ** 說明** |
---|---|---|
0001 | [address][register] | **讀取存儲取值到寄存器 ** |
0010 | [register][address] | 寫入寄存器的值到存儲器 |
0011 | [register1][register2] | 加法操作 |
隨著計算機的發(fā)展电谣,CPU支持的指令也越來越多秽梅,功能也越來越強,上圖就是現(xiàn)在Core I5處理器支持的指令集剿牺。
2.2.1.2 匯編語言
使用0和1這樣的機器語言好處是CPU認識企垦,可以直接執(zhí)行,但是對于程序本身來說晒来,沒有可讀性钞诡,難以維護,容易出錯湃崩。所以就出現(xiàn)了匯編語言荧降,它用助記符(代替操作碼指令,用地址符號代替地址碼攒读。實際是對機器語言的一種映射朵诫,可讀性高。
指令 | 匯編指令 | 格式 | 說明 |
---|---|---|---|
0001 | READ | [addLable][regLab] | 讀取存儲取值到寄存器 |
0010 | WRITE | [addLable][regLab] | 寫入寄存器的值到存儲器 |
0011 | ADD | [var1][var2] | 加法操作 |
把匯編語言轉(zhuǎn)換為機器語言需要一個叫做匯編器的工具薄扁。對于目前的CPU廠商剪返,在推出的CPU指令時都會同時退出新的匯編器。如果你還在使用老版本的匯編器那么只能使用機器碼來使用新的指令了邓梅。
2.2.1.3 高級語言
匯編語言的出現(xiàn)大大提高了編程效率脱盲,但是有一個問題就是不同CPU的指令集可能不同,這樣就需要為不同的CPU編寫不同的匯編程序日缨。于是又出現(xiàn)了高級語言比如C钱反,或者是后來的C++,JAVA,C#。 高級語言把多條匯編指令合成成為了一個表達式匣距,并且去除了許多操作細節(jié)(比如堆棧操作面哥,寄存器操作),而是以一種更直觀的方式來編寫程序毅待,而面向?qū)ο蟮恼Z言的出現(xiàn)使得程序編寫更加符合我們的思維方式幢竹。我們不必把盡力放到低層的細節(jié)上,而更多的關(guān)注程序的本身的邏輯的實現(xiàn)恩静。
對于高級語言來說需要一個編譯器來完成高級語言到匯編語言的轉(zhuǎn)換。所以對比不同的CPU結(jié)構(gòu)蹲坷,只需要有不同編譯器和匯編器就能使得我們的程序在不同CPU上都能運行了驶乾。如下圖在VS2010中,我們可以選擇程序編譯的目標(biāo)平臺循签,X86级乐,X64,ARM等县匠。當(dāng)然除了這些編譯類的語言之外還有解釋類型的語言如JS风科,就不在此討論范圍內(nèi)撒轮。
到這里有一個疑問:當(dāng)CPU的指令集更新后高級語言會有什么影響和變化?對于目前來說贼穆,一般出現(xiàn)了新的指令题山,會有對應(yīng)的新的匯編器和編譯器。所以編譯器可以把一些高級語言的表達式編譯成新的匯編指令故痊,這樣對于高級來說不會有任何變化顶瞳; 當(dāng)然還有一種情況就是高級語言會增加新的語法來對應(yīng)一些新的匯編語言和指令。但是這種情況出現(xiàn)的幾率很小愕秫。所以如果編譯器不支持新的指令慨菱,那么只有只用匯編會來實現(xiàn)了。
2.2.1.4 小結(jié)
從上面的我們可以看出戴甩,我們寫的程序最終都將變成機器認識的二進制可執(zhí)行程序符喝,然后加載到內(nèi)存順序的執(zhí)行。 從機器碼到匯編到高級語言甜孤,我們可以看到計算機中無處不在的分層协饲,抽象的思想。不光光是軟件课蔬,硬件同樣適用囱稽。最后留下一個問題在這里: C#和JAVA程序編譯出來的文件不是二進制的機器碼,而是中間語言二跋,那么他們又是怎么運行的呢战惊?
2.2.2 CPU工作原理
前面已經(jīng)了解了現(xiàn)代計算機的大致結(jié)構(gòu),也知道CPU是按照CPU指令來執(zhí)行操作扎即,那么就看看CPU的結(jié)構(gòu)和他是如何執(zhí)行順序操作的吞获。
2.2.2.1 CPU功能
- 指令控制: 指令控制也稱為程序的順序控制,控制程序嚴格按照規(guī)定的順序執(zhí)行谚鄙。
- 操作控制: 將取出的指令的產(chǎn)生一系列的控制信號(微指令)各拷,分別送往相應(yīng)的部件,從而控制這些部件按指令的要求進行工作闷营。
- 時間控制: 有些控制信號在時間上有嚴格的先后順序烤黍,如讀取存儲器的數(shù)據(jù),只有當(dāng)?shù)刂肪€信號穩(wěn)定以后傻盟,才能通過數(shù)據(jù)線將所需的數(shù)據(jù)讀出速蕊,否則讀出的數(shù)據(jù)是不正確的數(shù)據(jù),這樣計算機才能有條不紊地工作娘赴。
- 數(shù)據(jù)加工: 所謂數(shù)據(jù)加工规哲,就是對數(shù)據(jù)進行算術(shù)運算和邏輯運算處理。 所謂數(shù)據(jù)加工诽表,就是對數(shù)據(jù)進行算術(shù)運算和邏輯運算處理
2.2.2.2 CPU基本組成
以前CPU主要由運算器和控制器兩大部分組成唉锌,隨著集成電路的發(fā)展隅肥,目前CPU芯片集成了一些其它邏輯功能部件來擴充CPU的功能,如浮點運算器袄简、內(nèi)存管理單元腥放、cache和MMX等。下面2張圖分別是8086和Pentium CPU的結(jié)構(gòu)圖痘番。
.
對于一個通用的CPU來說捉片,我們只需要關(guān)注他的核心部件算數(shù)邏輯單元和操作控制單元。
1. 控制器的組成和功能: 控制器由程序計數(shù)器汞舱、指令寄存器伍纫、指令譯碼器、時序產(chǎn)生器和操作控制器組成昂芜。它是計算機指揮系統(tǒng)莹规,完成計算機的指揮工作。盡管不同計算機的控制器結(jié)構(gòu)上有很大的區(qū)別泌神,當(dāng)就其基本功能而言良漱,具有如下功能:
- 取指令 從內(nèi)存中取出當(dāng)前指令,并生成下一條指令在內(nèi)存中的地址欢际。
- 分析指令 指令取出后母市,控制器還必須具有兩種分析的功能。一是對指令進行譯碼或測試损趋,并產(chǎn)生相應(yīng)的操作控制信號患久,以便啟動規(guī)定的動作。比如一次內(nèi)存讀/寫操作浑槽,一個算術(shù)邏輯運算操作蒋失,或一個輸入/輸出操作。二是分析參與這次操作的各操作數(shù)所在的地址桐玻,即操作數(shù)的有效地址篙挽。
- 執(zhí)行指令 控制器還必須具備執(zhí)行指令的功能,指揮并控制CPU镊靴、內(nèi)存和輸入/輸出設(shè)備之間數(shù)據(jù)流動的方向铣卡,完成指令的各種功能。
- 發(fā)出各種微操作命令 在指令執(zhí)行過程中偏竟,要求控制器按照操作性質(zhì)要求算行,發(fā)出各種相應(yīng)的微操作命令,使相應(yīng)的部件完成各種功能苫耸。
- 改變指令的執(zhí)行順序 在編程過程中,分支結(jié)構(gòu)儡陨、循環(huán)結(jié)構(gòu)等非順序結(jié)構(gòu)的引用可以大大提供編程的工作效率褪子×刻剩控制器的這種功能可以根據(jù)指令執(zhí)行后的結(jié)果,確定下一步是繼續(xù)按原程序的順序執(zhí)行嫌褪,還是改變原來的執(zhí)行順序呀枢,而轉(zhuǎn)去執(zhí)行其它的指令。
- 控制程序和數(shù)據(jù)的輸入與結(jié)果輸出 這實際也是一個人機對話的設(shè)計笼痛,通過編寫程序裙秋,在適當(dāng)?shù)臅r候輸入數(shù)據(jù)和輸出程序的結(jié)果。
- 對異常情況和某些請求的處理 當(dāng)計算機正在執(zhí)行程序的過程中缨伊,發(fā)生了一些異常的情況摘刑,例如除法出錯、溢出中斷刻坊、鍵盤中斷等枷恕。
2. 運算器的組成和功能: 運算器由算術(shù)邏輯單元(ALU)、累加寄存器谭胚、數(shù)據(jù)緩沖寄存器和狀態(tài)條件寄存器組成徐块,它是數(shù)據(jù)加工處理部件,完成計算機的各種算術(shù)和邏輯運算灾而。相對控制器而言胡控,運算器接受控制器的命令而進行動作,即運算器所進行的全部操作都是由控制器發(fā)出的控制信號來指揮的旁趟,所以它是執(zhí)行部件昼激。運算器有兩個主要功能:
- 執(zhí)行所有的算術(shù)運算,如加轻庆、減癣猾、乘、除等基本運算及附加運算余爆;
- 執(zhí)行所有的邏輯運算纷宇,并進行邏輯測試,如與蛾方、或像捶、非、零值測試或兩個值的比較等桩砰。
2.2.2.3 CPU工作流程
CPU的基本工作是執(zhí)行存儲的指令序列拓春,即程序。程序的執(zhí)行過程實際上是不斷地取出指令亚隅、分析指令硼莽、執(zhí)行指令的過程。幾乎所有的馮?諾伊曼型計算機的CPU煮纵,其工作都可以分為5個階段:取指令懂鸵、指令譯碼偏螺、執(zhí)行指令、訪存取數(shù)和結(jié)果寫回匆光。
2.2.2.4 指令周期
指令周期: CPU取出一條指令并執(zhí)行該指令所需的時間稱為指令周期套像。指令周期的長短與指令的復(fù)雜程度有關(guān)。
CPU周期:從主存讀取一條指令的最短時間來規(guī)定CPU周期终息。指令周期常常用若干個CPU周期數(shù)來表示夺巩。
時鐘周期:時鐘周期是處理操作的最基本時間單位,由機器的主頻決定周崭。一個CPU周期包含有若干個時鐘周期柳譬。
從上面的定義可以知道,對于CPU來說取出和執(zhí)行任何一條指令所需的最短時間為兩個CPU周期休傍。所以頻率越高征绎,那么時鐘周期越短,這樣CPU周期和指令周期也就越短磨取,理論上程序執(zhí)行的速度也越快人柿。但是頻率不能無限的提高,而且頻率的提高也帶來了功耗忙厌,發(fā)熱等問題凫岖,所以目前也有超線程,流水線等技術(shù)來提高CPU執(zhí)行的速度逢净。
2.2.2.5 時序發(fā)生器
- 時序信號: 在計算機高速運行的過程中哥放,計算機內(nèi)各部件的每一個動作都必須嚴格遵守時間規(guī)定,不能有任何差錯爹土。計算機內(nèi)各部件的協(xié)調(diào)動作需要時間標(biāo)志甥雕,而時間標(biāo)志則是用時序信號來體現(xiàn)的。計算機各部分工作所需的時序信號胀茵,在CPU中統(tǒng)一由時序發(fā)生器來產(chǎn)生社露。
- 時序發(fā)生器: 時序信號發(fā)生器是產(chǎn)生指令周期控制時序信號的部件,當(dāng)CPU開始取指令并執(zhí)行指令時琼娘,操作控制器利用時序信號發(fā)生器產(chǎn)生的定時脈沖的順序和不同的脈沖間隔峭弟,提供計算機各部分工作時所需的各種微操作定時控制信號,有條理脱拼、有節(jié)奏地指揮機器各個部件按規(guī)定時間動作瞒瘸。
在這里有一個疑問:指令和數(shù)據(jù)都存放在內(nèi)存中,那么CPU怎么區(qū)分是指令還是數(shù)據(jù)呢熄浓?
從時間上來說情臭,取指令事件發(fā)生在指令周期的第一個CPU周期中,即發(fā)生在“取指令”階段,而取數(shù)據(jù)事件發(fā)生在指令周期的后面幾個CPU周期中俯在,即發(fā)生在“執(zhí)行指令”階段丁侄。從空間上來說,如果取出的代碼是指令朝巫,那么一定送往指令寄存器,如果取出的代碼是數(shù)據(jù)石景,那么一定送往運算器劈猿。