计算机原理学习(一)
計算機基本原理
? ? ? ?現代計算機,大部分都是基于馮諾依曼體系結構,而我們這里談論的也是此問前提。馮諾依曼的核心是:存儲程序,順序執行。所以不管計算機如何發展,基本原理是相同的。計算機程序實際上是告訴計算機做什么
?馮諾依曼體系結構
馮諾依曼體系結構有以下特點:
馮諾依曼體系結構的計算機必須具有如下功能:
- 把需要的程序和數據送至計算機中;
- 必須具有長期記憶程序、數據、中間結果及最終運算結果的能力;
- 能夠完成各種算術、邏輯運算和數據傳送等數據加工處理的能力;
- 能夠根據需要控制程序走向,并能根據指令控制機器的各部件協調操作;
- 能夠按照要求將處理結果輸出給用戶。
?
2.2 計算機工作原理
對于我們現代計算機來說,最關鍵的2個部件就是CPU和內存。內存存儲了要執行的程序指令,而CPU就是用來執行這些指令。CPU首先要知道這些指定存放在存儲器的那個區域,然后才能執行,并且把執行的結果寫入到執行區域。
?
2.2.1 CPU指令和編程語言
在了解CPU和存儲器工作原理之前,先來了解一下CPU指令和我們編程語言之間的一些關系。
?
2.2.1.1 CPU指令
因為在計算機中指令和數據都用二進制來表示,也就是說它只認識0和1這樣的數字。最早期的計算機程序通過在紙帶上打洞來人工操操作的方式來模擬0和1,根據不同的組合來完成一些操作。后來直接通過直0和1編程程序,這種稱之為機器語言。這里就會有一個疑問,計算機怎么知道你這些組合的意思?
于是就出現了CPU指令,我們現在買CPU都會聽到指令集這一說。CPU指令其實就對應了我們這里說的0和1的一些組合。每款CPU在設計時就規定了一系列與其硬件電路相配合的指令系統。有了CPU指令集的文檔你就可以通過這個編寫CPU認識的機器代碼了。所以對于不同CPU來說可能會有不同的機器碼。比如下面我們就定義了一套我們CPU硬件電路可以完成的CPU指令。
| ?指令 | ?????????????? 格式 | ???????????????????說明 |
| 0001 | [address][register] | 讀取存儲取值到寄存器? |
| 0010 | [register][address] | 寫入寄存器的值到存儲器 |
| 0011 | [register1][register2] | 加法操作 |
隨著計算機的發展,CPU支持的指令也越來越多,功能也越來越強,上圖就是現在Core I5處理器支持的指令集。
?
2.2.1.2 匯編語言
使用0和1這樣的機器語言好處是CPU認識,可以直接執行,但是對于程序本身來說,沒有可讀性,難以維護,容易出錯。所以就出現了匯編語言,它用助記符(代替操作碼指令,用地址符號代替地址碼。實際是對機器語言的一種映射,可讀性高。
| 0001 | READ | [addLable][regLab] | 讀取存儲取值到寄存器 |
| 0010 | WRITE | [addLable][regLab] | 寫入寄存器的值到存儲器 |
| 0011 | ADD | [var1][var2] | 加法操作 |
?
?
?
?
把匯編語言轉換為機器語言需要一個叫做匯編器的工具。對于目前的CPU廠商,在推出的CPU指令時都會同時退出新的匯編器。如果你還在使用老版本的匯編器那么只能使用機器碼來使用新的指令了。
?
2.2.1.3 高級語言
匯編語言的出現大大提高了編程效率,但是有一個問題就是不同CPU的指令集可能不同,這樣就需要為不同的CPU編寫不同的匯編程序。于是又出現了高級語言比如C,或者是后來的C++,Java,C#。 高級語言把多條匯編指令合成成為了一個表達式,并且去除了許多操作細節(比如堆棧操作,寄存器操作),而是以一種更直觀的方式來編寫程序,而面向對象的語言的出現使得程序編寫更加符合我們的思維方式。我們不必把盡力放到低層的細節上,而更多的關注程序的本身的邏輯的實現。
對于高級語言來說需要一個編譯器來完成高級語言到匯編語言的轉換。所以對比不同的CPU結構,只需要有不同編譯器和匯編器就能使得我們的程序在不同CPU上都能運行了。如下圖在VS2010中,我們可以選擇程序編譯的目標平臺,X86,X64,ARM等。當然除了這些編譯類的語言之外還有解釋類型的語言如JS,就不在此討論范圍內。
到這里有一個疑問:當CPU的指令集更新后高級語言會有什么影響和變化?對于目前來說,一般出現了新的指令,會有對應的新的匯編器和編譯器。所以編譯器可以把一些高級語言的表達式編譯成新的匯編指令,這樣對于高級來說不會有任何變化; 當然還有一種情況就是高級語言會增加新的語法來對應一些新的匯編語言和指令。但是這種情況出現的幾率很小。所以如果編譯器不支持新的指令,那么只有只用匯編會來實現了。
?
2.2.1.4 小結
從上面的我們可以看出,我們寫的程序最終都將變成機器認識的二進制可執行程序,然后加載到內存順序的執行。 從機器碼到匯編到高級語言,我們可以看到計算機中無處不在的分層,抽象的思想。不光光是軟件,硬件同樣適用。最后留下一個問題在這里: C#和JAVA程序編譯出來的文件不是二進制的機器碼,而是中間語言,那么他們又是怎么運行的呢?
?
2.2.2 CPU工作原理
前面已經了解了現代計算機的大致結構,也知道CPU是按照CPU指令來執行操作,那么就看看CPU的結構和他是如何執行順序操作的。
2.2.2.1 CPU功能
2.2.2.2 CPU基本組成
以前CPU主要由運算器和控制器兩大部分組成,隨著集成電路的發展,目前CPU芯片集成了一些其它邏輯功能部件來擴充CPU的功能,如浮點運算器、內存管理單元、cache和MMX等。下面2張圖分別是8086和Pentium CPU的結構圖。
?.
?
對于一個通用的CPU來說,我們只需要關注他的核心部件算數邏輯單元和操作控制單元。
?
1. 控制器的組成和功能: 控制器由程序計數器、指令寄存器、指令譯碼器、時序產生器和操作控制器組成。它是計算機指揮系統,完成計算機的指揮工作。盡管不同計算機的控制器結構上有很大的區別,當就其基本功能而言,具有如下功能:?
- 取指令 從內存中取出當前指令,并生成下一條指令在內存中的地址。?
- 分析指令 指令取出后,控制器還必須具有兩種分析的功能。一是對指令進行譯碼或測試,并產生相應的操作控制信號,以便啟動規定的動作。比如一次內存讀/寫操作,一個算術邏輯運算操作,或一個輸入/輸出操作。二是分析參與這次操作的各操作數所在的地址,即操作數的有效地址。?
- 執行指令 控制器還必須具備執行指令的功能,指揮并控制CPU、內存和輸入/輸出設備之間數據流動的方向,完成指令的各種功能。?
- 發出各種微操作命令 在指令執行過程中,要求控制器按照操作性質要求,發出各種相應的微操作命令,使相應的部件完成各種功能。?
- 改變指令的執行順序 在編程過程中,分支結構、循環結構等非順序結構的引用可以大大提供編程的工作效率。控制器的這種功能可以根據指令執行后的結果,確定下一步是繼續按原程序的順序執行,還是改變原來的執行順序,而轉去執行其它的指令。?
- 控制程序和數據的輸入與結果輸出 這實際也是一個人機對話的設計,通過編寫程序,在適當的時候輸入數據和輸出程序的結果。?
- 對異常情況和某些請求的處理 當計算機正在執行程序的過程中,發生了一些異常的情況,例如除法出錯、溢出中斷、鍵盤中斷等。
2. 運算器的組成和功能: 運算器由算術邏輯單元(ALU)、累加寄存器、數據緩沖寄存器和狀態條件寄存器組成,它是數據加工處理部件,完成計算機的各種算術和邏輯運算。相對控制器而言,運算器接受控制器的命令而進行動作,即運算器所進行的全部操作都是由控制器發出的控制信號來指揮的,所以它是執行部件。運算器有兩個主要功能:?
- 執行所有的算術運算,如加、減、乘、除等基本運算及附加運算;
- 執行所有的邏輯運算,并進行邏輯測試,如與、或、非、零值測試或兩個值的比較等。
2.2.2.3 CPU工作流程
CPU的基本工作是執行存儲的指令序列,即程序。程序的執行過程實際上是不斷地取出指令、分析指令、執行指令的過程。幾乎所有的馮?諾伊曼型計算機的CPU,其工作都可以分為5個階段:取指令、指令譯碼、執行指令、訪存取數和結果寫回。
??
2.2.2.4 指令周期
從上面的定義可以知道,對于CPU來說取出和執行任何一條指令所需的最短時間為兩個CPU周期。所以頻率越高,那么時鐘周期越短,這樣CPU周期和指令周期也就越短,理論上程序執行的速度也越快。但是頻率不能無限的提高,而且頻率的提高也帶來了功耗,發熱等問題,所以目前也有超線程,流水線等技術來提高CPU執行的速度。
?
2.2.2.5 時序發生器
在這里有一個疑問:指令和數據都存放在內存中,那么CPU怎么區分是指令還是數據呢?
從時間上來說,取指令事件發生在指令周期的第一個CPU周期中,即發生在“取指令”階段,而取數據事件發生在指令周期的后面幾個CPU周期中,即發生在“執行指令”階段。從空間上來說,如果取出的代碼是指令,那么一定送往指令寄存器,如果取出的代碼是數據,那么一定送往運算器。
?
2.2.3 小結
通過以上我們了解了CPU的工作過程。簡單來說就是CPU要順序執行一個程序的指令,首先是控制器獲得第一條指令的地址,當CPU取得這個指令并執行后,控制器需要生成下一條要執行的指令的地址。ALU單元負責一些運算操作。下面的FLASH演示了CPU執行一個加法操作的流程。
?
CPU工作流程FLASH:?http://218.5.241.24:8018/C35/Course/ZCYL-HB/WLKJ/jy/Chap05/flash-htm/5.6.swf
?
本文主要是簡單介紹了計算機的一些發展歷史和通用CPU的結構以及工作流程。加深了我們對馮諾依曼體系的儲存程序,順序執行的理解。無論硬件是什么樣子,馮諾依曼計算機的基本原理就是這樣。
?
1. 存儲器
?
前面我們以一個簡單通用的計算機模型來介紹了CPU的工作方式,CPU執行指令,而存儲器為CPU提供指令和數據。 在這個簡單的模型中,存儲器是一個線性的字節數組。CPU可以在一個常數的時間內訪問每個存儲器的位置,雖然這個模型是有效的,但是并不能完全反應現代計算機實際的工作方式。
?
1.1 存儲器系統層次結構
在前面介紹中,我們一直把存儲器等同于了內存,但是實際上在現代計算機中,存儲器系統是一個具有不同容量,不同訪問速度的存儲設備的層次結構。整個存儲器系統中包括了寄存器、Cache、內部存儲器、外部存儲。下圖展示了一個計算機存儲系統的層次圖。層次越高速度越快,但是價格越高,而層次越低,速度越慢,價格越低。
相對于CPU來說,存儲器的速度是相對比較慢的。無論CPU如何發展,速度多塊,對于計算機來說CPU總是一個稀缺的資源,所以我們應該最大程度的去利用CPU。其面我們提到過CPU周期,一個CPU周期是取1條指令的最短的時間。由此可見,CPU周期在很大程度上決定了計算機的整體性能。你想想如果當CPU去取一條指令需要2s,而執行一個指令只需要2ms,對于計算機來說性能是多么大的損失。所以存儲器的速度對于計算機的速度影響是很大的。
對于我們來說,總是希望存儲器的速度能和CPU一樣或盡量的塊,這樣一個CPU周期需要的時鐘周期就越少。但是現實是,這樣的計算機可能相當的昂貴。所以在計算機的存儲系統中,采用了一種分層的結構。速度越快的存儲器容量越小,這樣就能做到在性能和價格之間的一個很好的平衡。
?
1.2 存儲技術
計算機的發展離不開存儲器的發展,早起的計算機沒用硬盤,只有幾千字節的RAM可用。而我們現在4G,8G的內存已經隨處可見,1T的大硬盤以及上百G的固態硬盤,而價格也比10年,20年前便宜的很多很多。所以我先大概了解下各種存儲技術。目前存儲技術大致分為SRAM存儲器、DRAM存儲器、ROM存儲器和磁盤。
?
1.2.1 寄存器
在上一篇文章的圖中我們有看得CPU內部有很多寄存器,而上一張圖也顯示,寄存器在存儲層次結構的頂端。它也叫觸發器,它往往和CPU同時鐘頻率,所以速度非常快。但是一個寄存器需要20多個晶體管,所以如果大量使用,CPU的體積會非常大。所以在CPU中只有少量的寄存器。而每個寄存器的大小都是8-64字節。
?
1.2.2 RAM隨機訪問存儲
RAM(Read-Access Memory)分為兩類,靜態(SRAM)和動態(DRAM)。SDRAM比DRAM要快的多,但是價格也要貴的多。
- 靜態RAM: SRAM將每個位存儲在一個雙穩態的存儲單元中,每個存儲單元是用一個六晶體管電路實現的。它的特點是可以無限期(只要有電)的保持在兩個穩定狀態中的一個(正好可以存放0或1),而其他任何狀態都是不穩定的會馬上切換到這兩個狀態中的一個;
- 動態RAM: DRAM是利用電容內儲存電荷的多寡來代表一個二進制位元(bit)是1還是0,每一bit由一個晶體管和電容組成。由于在現實中電容會有漏電的現象,導致電位差不足而使記憶消失,因此除非電容經常周期性地充電,否則無法確保記憶長存。由于這種需要定時刷新的特性,因此被稱為“動態”記憶體。
SRAM相比DRAM速度更快功耗更低,而由于結構相對復雜占用面積較大,所以一般少量在CPU內部用作Cache,而不適合大規模的集成使用,如內存。而DRAM主要用來作為計算機的內部主存。
- Cache: 目前我們CPU中一般集成了2到3級的Cache,容量從128K到4M。對于CPU總的Cache來說,它們的也是和CPU同頻率的,所以理論上執行速度和寄存器應該是相同的,但是Cache往往用來存儲一些指令和數據,這樣就存在一個命中的問題。當沒有命中的時候,需要向下一集的存儲器獲取新的數據,這時Cache會被lock,所以導致實際的執行速度要比寄存器慢。同樣對于L1,L2,L3來說,速度也是越來越慢的;
- 主存: 也就是我們說的內存,使用DRAM來實現。但是我們目前聽的內存一般叫DDR SDRAM,還有早期的SDRAM。這是一種同步的DRAM技術,我們不需要了解他的詳情,只需要知道它能有效的提高DRAM的傳輸帶寬。而DDR表示雙倍的速率,而現在又有了DDR2,DDR3,DDR4,他們的帶寬也是越來越大。
?
1.2.3 ROM只讀存儲
前面的RAM在斷電后都會丟失數據,所以他們是易失的。另一方面非易失的存儲器即便在斷點后也能保存數據。一般我們稱之為ROM(Read-Only Memory)。雖然這么說,但是ROM在特殊的情況下還是可以寫入數據的,否則就不能叫存儲器了。
- PROM: 可編程ROM,只能被編程一次,PROM包含一種熔絲,每個存儲單元只能用高電流燒斷一次;
- EPROM:可擦寫可編程ROM,有一個透明的石英窗口,紫外線通過窗口照射到存儲單元就被清除為0,而對它編程是使用一種特殊的設備來寫入1。寫入次數1K次;
- EEPROM:: 電子可擦除可編程ROM,不需要特殊設備而可以直接在印制的電路板上編程。寫入次數10萬次;
- Flash Memory: 這是我們見到最多的閃存,有NOR Flash、NAND Flash、V-NAND Flash、SLC、MLC、TLC。雖然是基于EEPROM,但是速度上卻要快很多。其中NOR 、NANA Flash大量的使用在U盤,SD卡、手機存儲上。
ROM在計算機中應用也比較多,比如我們的BIOS芯片,最開始采用PROM,后來使用EPROM,如果損壞計算機就無法啟動了。而目前手機中也采用ROM來燒入系統,而RAM作為內存,使用Flash Memory作為機身存儲。
?
1.2.4 磁盤存儲
也就是我們最常見的硬盤。目前硬盤主流已經是500G,1T。轉速也在7200轉左右。相對于8G的內存,一個500G的硬盤可以說是相當的便宜。但是問題在于他的速度非常的慢,從磁盤讀取數據需要幾個毫秒,而CPU時鐘周期是以納秒計算。磁盤讀取操作要比DRAM慢10萬倍,比SRAM慢百萬倍。
相對于CPU,內部存儲的電子結構,磁盤存儲是一種機械結構。數據都通過電磁流來改變極性的方式被電磁流寫到磁盤上,而通過相反的方式讀回。一個硬盤由多個盤片組成,每個盤片被劃分為磁道,扇區和最小的單位簇。而每個盤面都有一個磁頭用來讀取和寫入數據。而硬盤的馬達裝置則控制了磁頭的運動。
?
1.2.5 虛擬硬盤(VHD)和固態硬盤(SSD)
隨著計算機的發展,緩慢的磁盤速度已經成為計算機速度的障礙了。大多數情況下,你的CPU夠快,內存夠大,可是打開一個程序或游戲時,加載的速度總還是很慢。(關于程序加載的過程后面的文章會講到)。原因就是磁盤讀寫速度太慢,所以一度出現了虛擬硬盤。就是把一部分內存虛擬成硬盤,這樣一些緩存文件直接放到內存中,這樣就加快了程序訪問這些數據的速度。但是他的問題是易失的。當然你可以保存到磁盤,但是加載和回寫的速度會隨著數據量加大而加大。所以這個適用于一些臨時數據的情況,比如瀏覽器緩存文件。
而固態硬盤是最近幾年出來的,而且隨著技術的發展,價格也越來越便宜,越來越多的人采用SSD+HHD的方式來搭建系統,提高系統的速度。其實SSD在上世紀80年代就有基于DRAM的產品,但是因為易失性和價格而無法推廣開來。而現在的SSD則是使用Flash Memory。目前市面上最常見的是SLC,MLC,TLC存儲介質的固態硬盤。我們知道Flash都是與寫入次數限制的。而SLC>MLC>TLC。目前主流的SSD都是使用MLC,比如Intel 520,三星830系列。當然目前三星也退出了基于TLC的固態硬盤,價格相對要便宜一些。
?
1.2.6 遠程存儲
簡單可以理解為是將數據指令存儲在其他機器上,比如分布式系統,WebService Server,HTTP Server以及現在炒的火熱的云端存儲。計算機通過網絡相互連接。比較起磁盤,遠程存儲的速度是以秒來計算。
?
1.3 局部性
通過上面介紹我們對計算機存儲器有了一個了解,并且知道了存儲器層次越高速度越快。那么為什么我們要對存儲器分層呢? 分成是為了彌補CPU和存儲器直接速度的差距。這種方式之所有有效,是因為應用程序的一個特性:局部性。
我們知道計算機的體系是存儲程序,順序執行。所以在執行一個程序的指令時,它后面的指令有很大的可能在下一個指令周期被執行。而一個存儲區被訪問后,也可能在接下來的操作中再次被訪問。這就是局部性的兩種形式:
- 時間局部性
- 空間局部性
對于現代計算機來說,無論是應用程序,操作系統,硬件的各個層次我們都是用了局部性。
CODE1:
[cpp]?view plaincopyprint?CODE2:
[cpp]?view plaincopyprint?以上2段代碼差別只有for循環的順序,但是局部性卻相差了很多。我們知道數組在內存中是按照行的順序來存儲的。但是CODE1確實按列去訪問,這可能就導致緩存不命中(需要的數據并不在Cache中,因為Cache存儲的是連續的內存數據,而CODE1訪問的是不聯系的),也就降低了程序運行的速度。
?
2 存儲器訪問和總線
?
前面介紹了存儲器的存儲技術和分層,也一直提到CPU從存儲器中獲取數據和指令,這一節就介紹一下CPU和存儲器之間是如何通信的。
?
2.1 總線
所謂總線是各種功能部件之間傳送信息的公共通信干線,它是由導線組成的傳輸線束。我們知道計算機有運算器,控制器,存儲器,輸入輸出設備這五大組件,所以總線就是用來連接這些組件的導線。
按照計算機所傳輸的信息種類,計算機的總線可以劃分為
- 數據總線: 數據總線DB是雙向三態形式的總線,即它既可以把CPU的數據傳送到存儲器或輸入輸出接口等其它部件,也可以將其它部件的數據傳送到CPU。數據總線的位數是微型計算機的一個重要指標,通常與微處理的字長相一致。我們說的32位,64位計算機指的就是數據總線。
- 地址總線: 地址總線AB是專門用來傳送地址的,由于地址只能從CPU傳向外部存儲器或I/O端口,所以地址總線總是單向三態的,這與數據總線不同。地址總線的位數決定了CPU可直接尋址的內存空間大小。
- 控制總線:控制總線主要用來傳送控制信號和時序信號。控制總線的傳送方向由具體控制信號而定,一般是雙向的,控制總線的位數要根據系統的實際控制需要而定。其實數據總線和控制總線可以共用。
總線也可以按照CPU內外來分類:
- 內部總線:在CPU內部,寄存器之間和算術邏輯部件ALU與控制部件之間傳輸數據所用的總線稱為片內部總線。
- 外部總線:通常所說的總線指片外部總線,是CPU與內存RAM、ROM和輸入/輸出設備接口之間進行通訊的通路,也稱系統總線。
?
2.2 控制芯片
前面我面介紹了總線的分類,在我們的簡單模型中。CPU通過總線和存儲器之間直接進行通信。實際上在現代的計算機中,存在一個控制芯片的模塊。CPU需要和存儲器,I/O設備等進行交互,會有多種不同功能的控制芯片,我們稱之為控制芯片組(Chipset)。
對于目前的計算機結構來說,控制芯片集成在主板上,典型的有南北橋結構和單芯片結構。與芯片相連接的總線可以分為前端總線(FSB)、存儲總線、IQ總線,擴展總線等。
- 南北橋芯片結構:
- 北橋芯片,它控制著CPU的類型,主板的總線頻率,內存控制器,顯示核心等。它直接與CPU、內存、顯卡、南橋相連,所以它數據量非常大;
- 前端總線:是將CPU連接到北橋芯片的總線。FSB的頻率是指CPU和北橋之間的數據交換速度。速度越快,數據帶寬越高,計算機性能越好;
- 內存總線:是將內存連接到北橋芯片的總線。用于和北橋之間的通信;
- 顯卡總線:是將顯卡連接到北橋芯片的總新。目前有AGP,PCI-E等接口。其實并沒有顯卡總線一說,一般認為屬于I/O總線;
- 南橋芯片,它主要負責外部接口和內部CPU的聯系;
- I/O總線:連接外部I/O設備連接到南橋的總線, 比如USB設備,ATA,SATA設備,以及一些擴展接口;
- 擴展總線:主要是主板上提供的一些PCI,ISA等插槽;
- 北橋芯片,它控制著CPU的類型,主板的總線頻率,內存控制器,顯示核心等。它直接與CPU、內存、顯卡、南橋相連,所以它數據量非常大;
- 單芯片結構: 單芯片組主要是是取消了北橋,因為現在CPU中內置了內存控制器,不需要再通過北橋來控制,這樣就能提高內存控制器的頻率,減少延遲。而現在一些CPU還集成了顯示單元。也使得顯示芯片的頻率更高,延遲更低。
2.3 運行頻率
?
數據帶寬 = (總線頻率*數據位寬)/ 8
?
2.3.1 外頻
外頻是建立在數字脈沖信號震動速度基礎上的。它是CPU與系統總線以及其他外部設備共同運行的速度。我們知道計算機中有一個時序發生器來保證各個部件協同工作,而這里說的外頻率就是這個時序發生器的頻率。外頻也是系統總線的工作頻率。
?
2.3.2 頻率和控制芯片
- 在計算機剛開始的時候,CPU和內存還有I/O設置是直接通過總線連接的而沒有控制芯片。所有設備都同步的工作在同一個總線頻率下。
- 但是隨著CPU的發展,CPU速度越來越塊。但受限于I/O設備。于是就出現了芯片。他使得I/O總線不在直接和CPU的系統總線相連。這樣就有了2個不同頻率的總線,這個芯片實際起到了一個降頻的作用,也就相對于系統總線的分頻技術。
- 但CPU速度發展相當快,CPU的速度已經高于內存運行的速度,于是引入了倍頻的概念。CPU在不改變外頻和系統總線頻率的情況下運行在更高的頻率。
- 發展到后來,就出現了北橋芯片,而CPU和北橋之前的總線稱為了FSB總線,而內存與北橋之前稱為內存總線。
?
2.3.2 分頻和倍頻
- 分頻:使得I/O設備可以和較高的外頻協同工作。比如AGP,PCI總線,運行頻率在66MHZ和33MHZ,所以對于一個100MHZ的外頻來說,采用2/3或1/3分頻的方式就能使得CPU和外設同步的工作了。否則設備可能無法正常工作。
- 倍頻: 為了提高CPU頻率又正常的和內存進行工作,所以產生了倍頻。所以對于CPU來說他實際的頻率是外頻*倍頻。
?
2.3.3 FSB頻率
前面我們現在已經知道CPU和北橋芯片連接是通過FSB。而FSB頻率表示CPU和北橋芯片之間的工作速度。但是從前面我們就知道FSB的實際頻率是和外頻一樣的。但是隨著技術的發展,Intel的QDR技術和AMD的HT技術,使得CPU在一個時鐘周期可以傳送4次數據,所以對于FSB淶說雖然工作早外頻的頻率下,但是等效的頻率是外頻的4倍。所以我們說的FSB頻率是等效頻率,而不是實際的工作頻率。隨著技術的發展,Intel芯片的FSB有800MHz,1600HMz等等。但隨著北橋芯片的消失,FSB的概率也慢慢遠去。
?
2.3.4 內存頻率
對于內存頻率我們可以看到,一般包括了核心頻率,總線頻率和傳輸頻率:
- 核心頻率和外頻類似,是建立在脈沖震蕩信號上的。
- 總線頻率就是指內存總線的工作頻率。也就是內存和北橋芯片之間的工作頻率。
- 而傳輸頻率類似FSB,是指實際傳輸數據的頻率。
對于SDR來說,它的3個頻率是一致的。而DDR在一個時鐘周期可以傳送2次數據,所以它的傳輸頻率是核心和總線頻率的2倍。DDR2在DDR的基礎上,采用了4bit預讀,所以總線頻率是核心頻率的2倍,而DDR3采用了8bit預讀,總線頻率是核心頻率的4倍。
| DDR | 100–200 | 100–200 | 2n | 200–400 | 2.5/2.6 | 184 | 200 | 172 |
| DDR2 | 200–533 | 100–266 | 4n | 400–1066 | 1.8 | 240 | 200 | 214 |
| DDR3 | 400–1066 | 100–266 | 8n | 800–2133 | 1.5 | 240 | 204 | 214 |
從下表我們就能看出。所以我們常說的DDR3 1600,DDR2 800指的是內存的傳輸頻率。相同的技術還有顯卡的AGP4X,8X,PCIE-8X,16X等技術。
而隨著FSB速度不斷加快,內存的總線頻率組建成為了瓶頸,于是出現了DDR雙通道,雙通道是指芯片擁有2個內存控制器,所以可以使得傳輸速率翻倍。
?
2.3.5 內存總線工作方式
因為內存總線頻率不同,所以內存和CPU之間存在同步和異步兩種工作方式。
- 同步方式:內存總線頻率和CPU外頻相同。比如以前的PC133和P3處理器,他們以同步的方式工作在133MHZ下。而當你超頻時就需要擁有更高總線頻率的內存。當然也需要北橋芯片的支持。
- 異步方式:內存總線頻率和CPU外頻不同。睡著CPU外頻的提高,內存也必須更新,所以出現了異步的方式。比如P4 CPU外頻為200MHz,而內存卻可以使用DDR333來運行。同時異步方式也在超頻時經常使用。一般來說會有一個內存異步比率。在BIOS中會有相應的選項。
從性能上來講,同步方式的延遲要好于異步方式,這也是為什么以前會說P4 200外頻的CPU要使用DDR400才能發揮最大功效。但這也不是絕對的。比如我的I5處理器CPU外頻工作在100MHz,而我使用的DDR3-1600的總線頻率在200MHz,雖然不同步,但是擁有更高的傳輸速率。所以不能一概而論。
?
2.3.6 QPI和HT總線技術
從前面我們知道了FSB對整個系統的性能影響很大,1600MHZ的FSB能提供的數據帶寬也只有12.8GB/s,所以隨著技術的發展,現在最新的計算機基本都采用了單芯片設計,北橋的功能被集成到了CPU內部。于是我們前面說的FSB也就不存在了。對于Intel和AMD這2大芯片廠商,分別有自己的技術來提高CPU和存儲器以及其他設備之間的傳輸速率,滿足更高的計算要求。
- QPI: Intel的QuickPath Interconnect技術縮寫為QPI,譯為快速通道互聯。用來實現芯片之間的直接互聯,而不是在通過FSB連接到北橋。早期20位寬的QPI連接其帶寬可達驚人的每秒25.6GB,遠非FSB可比。而隨著技術發展,在高端安騰處理中峰值可以達到96GB/s。
- HT:HyperTransport本質是一種為主板上的集成電路互連而設計的端到端總線技術,目的是加快芯片間的數據傳輸速度。HyperTransport技術在AMD平臺上使用后,是指AMD CPU到主板芯片之間的連接總線(如果主板芯片組是南北橋架構,則指CPU到北橋)即HT總線。HT3.1理論上可以達到51.2GB/s。
除此之外,但芯片中的QPI和HT傳輸不需要經過北橋新片,在CPU內存除了集成內存控制器意外還可以集成PCI-E2.0的圖形核心,使得集成顯卡的核心頻率和數據吞吐量大幅提高。
??
如圖,Core I7處理器外頻只有133MHz, 使用QPI技術后總線頻率達到2.4GMhz,而使用DDR3-1600的內存,內存總線頻率在800MHz。
?
2.3.7 小結
這一結介紹了計算機總線系統以及CPU和各個設備之間的交互。我們可以看到除了CPU自身的速度之外,總線的速度也影響這計算機的整體性能。從發展的過程來看,總線也是一個分分合合的過程。從最初的一條總線,到后來的單獨出來的I/O總線,內存總線,就是為了提高CPU的效率。而當CPU和內存速度都發展到一定階段后,又出現了DDR,雙通道等技術,在不提高核心頻率的情況下提高了傳輸率。于是又出現了CPU和內存間直接總線通信降低延遲的情況。?(從2000年開始接觸電腦DIY,一直到07年畢業,都對DIY很有興趣,但是隨著電腦越來越快,目前以及弄不太清楚了,復習這些知識也費了我好多時間。)
?
?
3. I/O設備
?
前面主要介紹了系統總線和CPU與內存之間的通信,最后一部分簡單介紹一下CPU和I/O設備是如何通信的。對于計算機來說輸入輸出設備也是五大組件。我們知道相對于CPU,I/O設備的工作頻率要慢的很多。比如早期的PCI接口工作頻率只有33MHz,硬盤的IDE-ATA6的傳輸速率也只有133MB/s。而現在的 SATA3接口速率能達到600MB/s。
?
3.1 I/O設備原理
對于硬件工程師來說,I/O設備是電子芯片、導線、電源、電子控制設備、電機等組成的物理設備。而對于程序員來說,關注的只是I/O設備的編程接口。
?
3.1.1 I/O設備分類
- 塊設備: 塊設備把信息存放在固定大小的塊中,每個塊都有自己的地址,獨立于其他塊,可尋址。例如磁盤,USB閃存,CD-ROM等。
- 符號設備:字符設備以字符為單位接收或發送一個字符流,字符設備不可以尋址。列入打印機、網卡、鼠標鍵盤等。
3.1.2 設備控制器
I/O設備一般由機械部件和電子部件兩部分組成。電子設備一般稱為設備控制器,在計算機上一般以芯片的形式出現,比如我們前面介紹的南橋芯片。不同的控制器可以控制不同的設備。所以南橋芯片中包含了多種設備的控制器,比如硬盤控制器,USB控制器,網卡、聲卡控制器等等。而通過總線以及卡槽提供和設備本身的連接。比如PCI,PCI-E,SATA,USB等。
?
3.1.3 驅動程序
對于不同的設備控制器,進行的操作控制也是不同的。所以需要專門的軟件對他進行控制。這個軟件的作用就是用來專門和設備控制器對話,這種軟件稱為驅動程序。一般來說驅動程序由硬件設別廠商提供。所以我們有時會碰到一些設備因為沒有安裝驅動程序而無法使用的情況。 而目前的OS總都包含了大量的通用驅動程序,使得我們在安裝完系統后不需要在額外的安裝驅動。但是通用的驅動只能使用設備的基本功能。
驅動程序因為是非操作系統廠商開發,并且需要被安裝到操作系統并調用,所以需要有一個統一的模型來開發驅動程序。否則操作系統是無法操作各式各樣的設備的。前面我們知道設備非為兩大類,所以一般操作系統都定義了這兩類設備的標準接口。
?
3.1.4 內存映射I/O
每個控制器都有幾個寄存器和CPU進行通信。通過寫入這些寄存器,可以命令設備發送或接受數據,開啟或關閉。而通過讀這些寄存器就能知道設備的狀態。因為寄存器數量和大小是有限的,所以設備一般會有一個RAM的緩沖區,來存放一些數據。比如硬盤的讀寫緩存,顯卡的顯存等。一方面提供數據存放,一方面也是提高I/O操作的速度。
現在的問題是CPU如何和這些設備的寄存器或數據緩沖區進行通信呢?存在兩個可選方案:
另一種方式是兩種的結合,寄存器擁有I/O端口,而數據緩沖區則映射到內存空間。Pentinum就是使用這種方式,所以在IBM-PC兼容機中,內存的0-640K是I/O端口地址,640K-1M的地址是保留給設備數據緩沖區的。(關于內存分布后面文章會介紹)
對于我們程序員來說這兩種方案有所不同
任何技術有有點就會有缺點,I/O內存映射也一樣:
?
3.2 CPU和I/O設備數據交換方式
前面已經知道CPU通過內存映射的方式和I/O設備交換數據,但是對于CPU來說,無論是從內存還是I/O設備讀取數據,都需要把地址放到地址總線上,然后在向控制總線傳遞一個READ信號,還要用一條信號線來表示是從內存還是I/O讀取數據。因為I/O映射的內存區域是特定的,所以不存在無法區分是內存還是I/O操作。目前一共有3種方式進行操作:
?
總結
以上是生活随笔為你收集整理的计算机原理学习(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 语法错误:No enclosing in
- 下一篇: 单片机1602液晶显示