前一篇文章介紹了馮諾依曼體系結構的計算機的基本工做原理,其中主要介紹了CPU的結構和工做原理。這一篇主要來介紹存儲區,總線,以及IO設備等其餘幾大組件,來了解整個計算機是如何工做的。 這些東西都是看得見摸得着的硬件,平時咱們買電腦時最關注的就是CPU的速度,內存的大小,主板芯片等等的參數。html
前面咱們以一個簡單通用的計算機模型來介紹了CPU的工做方式,CPU執行指令,而存儲器爲CPU提供指令和數據。 在這個簡單的模型中,存儲器是一個線性的字節數組。CPU能夠在一個常數的時間內訪問每一個存儲器的位置,雖然這個模型是有效的,可是並不能徹底反應現代計算機實際的工做方式。前端
在前面介紹中,咱們一直把存儲器等同於了內存,可是實際上在現代計算機中,存儲器系統是一個具備不一樣容量,不一樣訪問速度的存儲設備的層次結構。整個存儲器系統中包括了寄存器、Cache、內部存儲器、外部存儲。下圖展現了一個計算機存儲系統的層次圖。層次越高速度越快,可是價格越高,而層次越低,速度越慢,價格越低。程序員
相對於CPU來講,存儲器的速度是相對比較慢的。不管CPU如何發展,速度多塊,對於計算機來講CPU老是一個稀缺的資源,因此咱們應該最大程度的去利用CPU。其面咱們提到過CPU週期,一個CPU週期是取1條指令的最短的時間。因而可知,CPU週期在很大程度上決定了計算機的總體性能。你想一想若是當CPU去取一條指令須要2s,而執行一個指令只須要2ms,對於計算機來講性能是多麼大的損失。因此存儲器的速度對於計算機的速度影響是很大的。編程
對於咱們來講,老是但願存儲器的速度能和CPU同樣或儘可能的塊,這樣一個CPU週期須要的時鐘週期就越少。可是現實是,這樣的計算機可能至關的昂貴。因此在計算機的存儲系統中,採用了一種分層的結構。速度越快的存儲器容量越小,這樣就能作到在性能和價格之間的一個很好的平衡。數組
計算機的發展離不開存儲器的發展,早起的計算機沒用硬盤,只有幾千字節的RAM可用。而咱們如今4G,8G的內存已經隨處可見,1T的大硬盤以及上百G的固態硬盤,而價格也比10年,20年前便宜的不少不少。因此我先大概瞭解下各類存儲技術。目前存儲技術大體分爲SRAM存儲器、DRAM存儲器、ROM存儲器和磁盤。瀏覽器
在上一篇文章的圖中咱們有看得CPU內部有不少寄存器,而上一張圖也顯示,寄存器在存儲層次結構的頂端。它也叫觸發器,它每每和CPU同時鍾頻率,因此速度很是快。可是一個寄存器須要20多個晶體管,因此若是大量使用,CPU的體積會很是大。因此在CPU中只有少許的寄存器。而每一個寄存器的大小都是8-64字節。緩存
RAM(Read-Access Memory)分爲兩類,靜態(SRAM)和動態(DRAM)。SDRAM比DRAM要快的多,可是價格也要貴的多。網絡
SRAM相比DRAM速度更快功耗更低,而因爲結構相對複雜佔用面積較大,因此通常少許在CPU內部用做Cache,而不適合大規模的集成使用,如內存。而DRAM主要用來做爲計算機的內部主存。架構
前面的RAM在斷電後都會丟失數據,因此他們是易失的。另外一方面非易失的存儲器即使在斷點後也能保存數據。通常咱們稱之爲ROM(Read-Only Memory)。雖然這麼說,可是ROM在特殊的狀況下仍是能夠寫入數據的,不然就不能叫存儲器了。異步
ROM在計算機中應用也比較多,好比咱們的BIOS芯片,最開始採用PROM,後來使用EPROM,若是損壞計算機就沒法啓動了。而目前手機中也採用ROM來燒入系統,而RAM做爲內存,使用Flash Memory做爲機身存儲。
也就是咱們最多見的硬盤。目前硬盤主流已是500G,1T。轉速也在7200轉左右。相對於8G的內存,一個500G的硬盤能夠說是至關的便宜。可是問題在於他的速度很是的慢,從磁盤讀取數據須要幾個毫秒,而CPU時鐘週期是以納秒計算。磁盤讀取操做要比DRAM慢10萬倍,比SRAM慢百萬倍。
相對於CPU,內部存儲的電子結構,磁盤存儲是一種機械結構。數據都經過電磁流來改變極性的方式被電磁流寫到磁盤上,而經過相反的方式讀回。一個硬盤由多個盤片組成,每一個盤片被劃分爲磁道,扇區和最小的單位簇。而每一個盤面都有一個磁頭用來讀取和寫入數據。而硬盤的馬達裝置則控制了磁頭的運動。
隨着計算機的發展,緩慢的磁盤速度已經成爲計算機速度的障礙了。大多數狀況下,你的CPU夠快,內存夠大,但是打開一個程序或遊戲時,加載的速度總仍是很慢。(關於程序加載的過程後面的文章會講到)。緣由就是磁盤讀寫速度太慢,因此一度出現了虛擬硬盤。就是把一部份內存虛擬成硬盤,這樣一些緩存文件直接放到內存中,這樣就加快了程序訪問這些數據的速度。可是他的問題是易失的。固然你能夠保存到磁盤,可是加載和回寫的速度會隨着數據量加大而加大。因此這個適用於一些臨時數據的狀況,好比瀏覽器緩存文件。
而固態硬盤是最近幾年出來的,並且隨着技術的發展,價格也愈來愈便宜,愈來愈多的人採用SSD+HHD的方式來搭建系統,提升系統的速度。其實SSD在上世紀80年代就有基於DRAM的產品,可是由於易失性和價格而沒法推廣開來。而如今的SSD則是使用Flash Memory。目前市面上最多見的是SLC,MLC,TLC存儲介質的固態硬盤。咱們知道Flash都是與寫入次數限制的。而SLC>MLC>TLC。目前主流的SSD都是使用MLC,好比Intel 520,三星830系列。固然目前三星也退出了基於TLC的固態硬盤,價格相對要便宜一些。
簡單能夠理解爲是將數據指令存儲在其餘機器上,好比分佈式系統,WebService Server,HTTP Server以及如今炒的火熱的雲端存儲。計算機經過網絡相互鏈接。比較起磁盤,遠程存儲的速度是以秒來計算。
經過上面介紹咱們對計算機存儲器有了一個瞭解,而且知道了存儲器層次越高速度越快。那麼爲何咱們要對存儲器分層呢? 分紅是爲了彌補CPU和存儲器直接速度的差距。這種方式之全部有效,是由於應用程序的一個特性:局部性。
咱們知道計算機的體系是存儲程序,順序執行。因此在執行一個程序的指令時,它後面的指令有很大的可能在下一個指令週期被執行。而一個存儲區被訪問後,也可能在接下來的操做中再次被訪問。這就是局部性的兩種形式:
對於現代計算機來講,不管是應用程序,操做系統,硬件的各個層次咱們都是用了局部性。
CODE1:
int sumarraycols(int a[m][n]) { int i, j , sum = 0; for(j = 0; j < n; j++) for(i = 0; i < m; i++) sum += a[i][j]; return sum; }
CODE2:
int sumarraycols(int a[m][n]) { int i, j , sum = 0; for(i = 0; i < m; i++) for(j = 0; j < n; j++) sum += a[i][j]; return sum; }
以上2段代碼差異只有for循環的順序,可是局部性卻相差了不少。咱們知道數組在內存中是按照行的順序來存儲的。可是CODE1確實按列去訪問,這可能就致使緩存不命中(須要的數據並不在Cache中,由於Cache存儲的是連續的內存數據,而CODE1訪問的是不聯繫的),也就下降了程序運行的速度。
前面介紹了存儲器的存儲技術和分層,也一直提到CPU從存儲器中獲取數據和指令,這一節就介紹一下CPU和存儲器之間是如何通訊的。
所謂總線是各類功能部件之間傳送信息的公共通訊幹線,它是由導線組成的傳輸線束。咱們知道計算機有運算器,控制器,存儲器,輸入輸出設備這五大組件,因此總線就是用來鏈接這些組件的導線。
按照計算機所傳輸的信息種類,計算機的總線能夠劃分爲
總線也能夠按照CPU內外來分類:
前面我面介紹了總線的分類,在咱們的簡單模型中。CPU經過總線和存儲器之間直接進行通訊。實際上在現代的計算機中,存在一個控制芯片的模塊。CPU須要和存儲器,I/O設備等進行交互,會有多種不一樣功能的控制芯片,咱們稱之爲控制芯片組(Chipset)。
對於目前的計算機結構來講,控制芯片集成在主板上,典型的有南北橋結構和單芯片結構。與芯片相鏈接的總線能夠分爲前端總線(FSB)、存儲總線、IQ總線,擴展總線等。
數據帶寬 = (總線頻率*數據位寬)/ 8
外頻是創建在數字脈衝信號震動速度基礎上的。它是CPU與系統總線以及其餘外部設備共同運行的速度。咱們知道計算機中有一個時序發生器來保證各個部件協同工做,而這裏說的外頻率就是這個時序發生器的頻率。外頻也是系統總線的工做頻率。
前面咱們如今已經知道CPU和北橋芯片鏈接是經過FSB。而FSB頻率表示CPU和北橋芯片之間的工做速度。可是從前面咱們就知道FSB的實際頻率是和外頻同樣的。可是隨着技術的發展,Intel的QDR技術和AMD的HT技術,使得CPU在一個時鐘週期能夠傳送4次數據,因此對於FSB淶說雖然工做早外頻的頻率下,可是等效的頻率是外頻的4倍。因此咱們說的FSB頻率是等效頻率,而不是實際的工做頻率。隨着技術的發展,Intel芯片的FSB有800MHz,1600HMz等等。但隨着北橋芯片的消失,FSB的機率也慢慢遠去。
對於內存頻率咱們能夠看到,通常包括了核心頻率,總線頻率和傳輸頻率:
對於SDR來講,它的3個頻率是一致的。而DDR在一個時鐘週期能夠傳送2次數據,因此它的傳輸頻率是核心和總線頻率的2倍。DDR2在DDR的基礎上,採用了4bit預讀,因此總線頻率是核心頻率的2倍,而DDR3採用了8bit預讀,總線頻率是核心頻率的4倍。
DDR SDRAM Standard |
Bus clock (MHz) |
Internal rate (MHz) |
Prefetch (min burst) |
Transfer Rate (MT/s) |
Voltage | DIMM pins |
SO-DIMM pins |
MicroDIMM pins |
---|---|---|---|---|---|---|---|---|
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個內存控制器,因此可使得傳輸速率翻倍。
由於內存總線頻率不一樣,因此內存和CPU之間存在同步和異步兩種工做方式。
從性能上來說,同步方式的延遲要好於異步方式,這也是爲何之前會說P4 200外頻的CPU要使用DDR400才能發揮最大功效。但這也不是絕對的。好比個人I5處理器CPU外頻工做在100MHz,而我使用的DDR3-1600的總線頻率在200MHz,雖然不一樣步,可是擁有更高的傳輸速率。因此不能一律而論。
從前面咱們知道了FSB對整個系統的性能影響很大,1600MHZ的FSB能提供的數據帶寬也只有12.8GB/s,因此隨着技術的發展,如今最新的計算機基本都採用了單芯片設計,北橋的功能被集成到了CPU內部。因而咱們前面說的FSB也就不存在了。對於Intel和AMD這2大芯片廠商,分別有本身的技術來提升CPU和存儲器以及其餘設備之間的傳輸速率,知足更高的計算要求。
除此以外,但芯片中的QPI和HT傳輸不須要通過北橋新片,在CPU內存除了集成內存控制器意外還能夠集成PCI-E2.0的圖形核心,使得集成顯卡的核心頻率和數據吞吐量大幅提升。
如圖,Core I7處理器外頻只有133MHz, 使用QPI技術後總線頻率達到2.4GMhz,而使用DDR3-1600的內存,內存總線頻率在800MHz。
這一結介紹了計算機總線系統以及CPU和各個設備之間的交互。咱們能夠看到除了CPU自身的速度以外,總線的速度也影響這計算機的總體性能。從發展的過程來看,總線也是一個分分合合的過程。從最初的一條總線,到後來的單獨出來的I/O總線,內存總線,就是爲了提升CPU的效率。而當CPU和內存速度都發展到必定階段後,又出現了DDR,雙通道等技術,在不提升核心頻率的狀況下提升了傳輸率。因而又出現了CPU和內存間直接總線通訊下降延遲的狀況。 (從2000年開始接觸電腦DIY,一直到07年畢業,都對DIY頗有興趣,可是隨着電腦愈來愈快,目前以及弄不太清楚了,複習這些知識也費了我好多時間。)
前面主要介紹了系統總線和CPU與內存之間的通訊,最後一部分簡單介紹一下CPU和I/O設備是如何通訊的。對於計算機來講輸入輸出設備也是五大組件。咱們知道相對於CPU,I/O設備的工做頻率要慢的不少。好比早期的PCI接口工做頻率只有33MHz,硬盤的IDE-ATA6的傳輸速率也只有133MB/s。而如今的 SATA3接口速率能達到600MB/s。
對於硬件工程師來講,I/O設備是電子芯片、導線、電源、電子控制設備、電機等組成的物理設備。而對於程序員來講,關注的只是I/O設備的編程接口。
I/O設備通常由機械部件和電子部件兩部分組成。電子設備通常稱爲設備控制器,在計算機上通常以芯片的形式出現,好比咱們前面介紹的南橋芯片。不一樣的控制器能夠控制不一樣的設備。因此南橋芯片中包含了多種設備的控制器,好比硬盤控制器,USB控制器,網卡、聲卡控制器等等。而經過總線以及卡槽提供和設備自己的鏈接。好比PCI,PCI-E,SATA,USB等。
對於不一樣的設備控制器,進行的操做控制也是不一樣的。因此須要專門的軟件對他進行控制。這個軟件的做用就是用來專門和設別控制器對話,這種軟件稱爲驅動程序。通常來講驅動程序由硬件設別廠商提供。因此咱們有時會碰到一些設備由於沒有安裝驅動程序而沒法使用的狀況。 而目前的OS總都包含了大量的通用驅動程序,使得咱們在安裝完系統後不須要在額外的安裝驅動。可是通用的驅動只能使用設備的基本功能。
驅動程序由於是非操做系統廠商開發,而且須要被安裝到操做系統並調用,因此須要有一個統一的模型來開發驅動程序。不然操做系統是沒法操做各式各樣的設備的。前面咱們知道設備非爲兩大類,因此通常操做系統都定義了這兩類設備的標準接口。
每一個控制器都有幾個寄存器和CPU進行通訊。經過寫入這些寄存器,能夠命令設備發送或接受數據,開啓或關閉。而經過讀這些寄存器就能知道設備的狀態。由於寄存器數量和大小是有限的,因此設備通常會有一個RAM的緩衝區,來存放一些數據。好比硬盤的讀寫緩存,顯卡的顯存等。一方面提供數據存放,一方面也是提升I/O操做的速度。
如今的問題是CPU如何和這些設備的寄存器或數據緩衝區進行通訊呢?存在兩個可選方案:
另外一種方式是兩種的結合,寄存器擁有I/O端口,而數據緩衝區則映射到內存空間。Pentinum就是使用這種方式,因此在IBM-PC兼容機中,內存的0-640K是I/O端口地址,640K-1M的地址是保留給設備數據緩衝區的。(關於內存分佈後面文章會介紹)
對於咱們程序員來講這兩種方案有所不一樣
任何技術有有點就會有缺點,I/O內存映射也同樣:
前面已經知道CPU經過內存映射的方式和I/O設備交換數據,可是對於CPU來講,不管是從內存仍是I/O設備讀取數據,都須要把地址放到地址總線上,而後在向控制總線傳遞一個READ信號,還要用一條信號線來表示是從內存仍是I/O讀取數據。由於I/O映射的內存區域是特定的,因此不存在沒法區分是內存仍是I/O操做。目前一共有3種方式進行操做:
這一篇文章介紹了計算機組件中的存儲器的分類和工做原理,以及I/O設別的工做方式。經過總線將各個部件鏈接起來。咱們能夠看到計算機的發展不光是CPU,存儲器以及I/O設備的發展,總線也是起了很是關鍵的做用。經過前2章的介紹,應該對計算機硬件的工做原理有了大概的瞭解。後面開始將主要偏向計算機操做系統軟件的工做方式。固然這些也是和一些硬件的特性分不開的。
《深刻理解計算機系統》
《現代操做系統(原書第3版)》