1.1 現代計算機五大部件
運算器
控制器
存儲器
輸入裝置
輸出裝置
1.1.1 計算機各部件的功用
運算器是用來做計算的,隻能做二進制計算,做簡單的算術運算和邏輯運算。如加、減、乘、除、取模等等。運算器的核心就是一個加法器。
控制器是用來控制計算機各部件之間的協調的。
比如運算器要想做運算,必須先把資料從存儲器中取出來,交給運算器計算以後再在存儲器中找一塊空閑的存儲單元把計算後的結果給存儲起來。而這僅僅是控制器的工作之一。
現代計算機已經将運算器和控制器合二為一,就是我們所熟知的中央處理器(CPU)。
人的大腦有存儲記憶的能力,但是計算機不行,計算機要想存儲記憶則需要一個部件來實作。運算器是一個部件、控制器是一個部件、存儲器也是一個部件,而部件與部件之間的資料交換則需要通過線路來實作,也就是接下來要說的總線(bus)。
現代電腦有三種總線,分别是控制總線、資料總線、位址總線。
位址總線的功能是實作尋址。那麼什麼是尋址呢?
資料是存儲在存儲器中的,而運算器要想運算則必須通過控制器将資料從存儲器上調出來再進行運算,運算完以後還要把結果給存儲到存儲器中。那麼控制器怎麼知道要運算的資料是存儲在存儲器的哪個存儲單元中呢?我們先來說說存儲器。
存儲器(Memory)是一種編址儲存設備。
<a href="https://s2.51cto.com/wyfs02/M02/8E/15/wKiom1i1HLHha3KlAAAeIcQNdkE924.jpg" target="_blank"></a>
如圖所示,存儲器中每8位(8bit=1Byte)為一個存儲單元,每個存儲單元(8bit)可以存儲8bit資料。存儲器就是由衆多的存儲單元組成的一個整體的存儲空間。
我們把資料存儲在存儲器中,我們需要的時候要在存儲器中找到它,而這個找到存儲器中資料的過程就是尋址。
存儲器中的每一個存儲單元都是有位址的,那麼這個位址能有多少種變化形式呢?
計算機隻能識别二進制,是以存儲器是通過二進制進行編址的。如果我們要使用4G記憶體空間,那麼就需要2的32次方bit來進行編址。
之是以32位作業系統隻支援4G記憶體空間就是因為其隻有32根位址總線,每根總線隻能表示0和1兩種數字。是以我們要表示4G種變化,就需要32個二進制數字排在一塊,一直從00000000000000000000000000000000到11111111111111111111111111111111,這中間有4294967296種變化。假如你的計算機是64位的,那麼就有2的64次方種變化。
1.1.2 I/O裝置
I/O裝置已經不算計算機的核心部件了,I/O存在的目的是為了與外部互動。
假如CPU和記憶體是一個自循環系統,不需要與外部互動,其所有的工作都能在其内部完成,那麼就不需要I/O裝置了。但這是不可能的。
由于記憶體是一種易失性存儲器,斷電後其所有内容會丢失。另外計算機還需要跟其他計算機進行互動,這些都需要用到I/O裝置。
I/O裝置說白了就是一個與外部部件(如磁盤、網卡、鍵盤、滑鼠等)進行互動的元件。
I/O裝置通常是最慢的裝置。
1.1.3 主機闆
計算機内各部件需要通過線纜給連接配接起來,如果弄一大堆線纜就非常麻煩了,不好整理,于是就有了主機闆(motherboard)。主機闆就負責把計算機内各部件給連接配接起來。
1.1.4 傳統硬碟
傳統硬碟是一種固定角度的裝置。硬碟是有盤片的,盤片上面有磁條,磁條懸浮在盤片上面,大約5微米的間隙。通過磁盤碰觸盤片的方式讀寫資料。
硬碟從外向内分了很多磁道,一個盤片2面都能讀寫,不同盤面上面,相同磁道的編号我們稱之為柱面。分區就是按柱面由内向外進行的。
1.2 緩存
如果存儲器與運算器之間的操作一個快一個慢的話,最終速度取決于慢的操作。那麼為什麼會有快慢的概念呢?
很多人可能知道,CPU是有時鐘頻率的,時鐘頻率是指其在機關時間内電頻可以變化的次數。4GHz指的是在1秒内能夠變化40多億次,這也就意味着1秒内可以完成40多億bit資料的傳輸。
衆所周知,現代的CPU工作速率很高,動辄3GHz是很常見的。但是記憶體通常是1500MHz、1866MHz。其速率比起CPU來說要慢很多。而資料處理的速度是以慢的為準,假如記憶體處理的速度過于緩慢的話就很影響計算機處理的效率,為了解決這個問題,緩存應運而生。
CPU有一級緩存、二級緩存、三級緩存等,這些緩存的工作方式很獨特,其能以幾乎接近CPU工作頻率的速度來工作,但是其造價非常高,是以緩存空間一般都很小。
緩存能夠極大的加速CPU與記憶體的互動,因為計算機程式的運作具有局部性的特性。通常資料有兩種局部性,分别是空間局部性和時間局部性。
1.2.1 資料的局部性
如果你通路一個資料,離這個資料很近的其他資料也可能很快就會被通路到,是以加載資料的時候就把其後面的資料提前加載好,這就是預取(read ahead)。先把其加載到緩存中去,等用到的時候由CPU直接去緩存中取。如此就不必等CPU去記憶體中取,速度就加快了很多。此為資料的空間局部性。
剛剛通路過的資料,過一會可能還會被通路到,把多次需要用到的資料放到緩存中,等需要的時候就不必去記憶體中取。此為資料的時間局部性。
1.3 CPU工作原理
CPU被邏輯切割成N個時間片,讓每個程式在CPU中執行一段時間,假定是5毫秒,不管程式是否執行完畢,均使其退出并記錄執行狀态。
假如有2個程式需要同時運作,第1個程式執行5毫秒以後,由CPU中止其運作,并記錄其運作到哪裡了,然後将第2個程式放到CPU中運作,運作5毫秒以後,由CPU中止其運作,并記錄其運作到哪裡了,然後将第1個程式調到CPU中,從上次運作結束的位置繼續執行該程式,以此類推。通過這種分時機制實作多任務同時運作的目的。
前面已經說過了,CPU是由運算器和控制器組成的,且隻能運作二進制指令。那麼CPU能夠進行什麼運算取決于什麼呢?CPU為什麼能夠執行運算?
<a href="https://s1.51cto.com/wyfs02/M02/8E/13/wKioL1i1HYjTHzyGAACbCTLeJhU368.jpg" target="_blank"></a>
如上圖所示,CPU有很多針腳,每根針腳對應不同的功能。CPU的運算其實就是由控制器到存儲器中取出資料和運算符,并在CPU中找到該運算符所對應的針腳,調用該針腳的功能的過程。
每個CPU的功能都通過CPU的指令來實作,多個CPU指令聯合起來我們稱之為CPU指令集。同一顆CPU當中,為了完成不同的運算功能,很多時候可能由多個不同的晶片組成。比如完成多媒體處理和完成整數運算那是兩回事,完全是由2個不同的晶片完成的。同一個CPU内部,可能有多種功能上各自獨立的晶片,而且每一組晶片提供的運算能力和指令都不一樣。是以,同一個CPU内部所能夠提供的指令集有很多。不同廠商的CPU指令集的功能可能各不相同。
cpu的指令集中的指令分為兩種:
a) 特權指令(擁有管理功能,隻能被作業系統調用)
b) 普通指令
一般來說,程式員寫的程式隻能調用普通指令,隻有作業系統才能夠調用特權指令。
<a href="https://s5.51cto.com/wyfs02/M01/8E/17/wKiom1i1PO3wMN9lAAAnvrn2LCw574.jpg" target="_blank"></a>
如上圖所示,CPU生産廠商把整個CPU所能夠實作的指令集分成了4個環,環0所包含的指令都是特權指令,隻有作業系統才有權限去運作。所有的普通指令都在環3上,出于曆史原因,環1和環2沒有使用。
作業系統運作時通常運作環0和環3中的指令,而應用程式隻能運作環3上的指令。但是有些應用程式可能要做管理操作,比如要在系統中建立一個目錄(mkdir指令),這個目錄要存儲在硬碟上,而操作硬碟寫資料就屬于特權指令,隻有作業系統才有權限執行。
任何情況下,一個普通程式要想完成一個特權操作,是沒辦法直接進行的,它必須向核心申請。
1.4 記憶體工作原理
記憶體的存儲空間是固定的。如果有10個程式需要運作,第一個程式占據了一部分記憶體,第二個程式有可能把第一個程式的記憶體給覆寫了,這就是記憶體溢出。記憶體溢出是不被允許的,是以我們必須把有限的記憶體給邏輯切割以後配置設定給多個程式使用。
現代計算機中的記憶體存儲空間本來就是虛拟的,給每個程式配置設定的空間都是假的。在程式看來自己是唯一的,程式看不到其他的程式。假定其運作在一根512M的記憶體上,但程式卻可以認為其有4G記憶體空間可用。但事實上其所能用的空間可能僅僅就是幾M,多則幾十M。這種就稱之為線性位址空間。
本文轉自 忘情OK 51CTO部落格,原文連結:http://blog.51cto.com/itchentao/1902012,如需轉載請自行聯系原作者