靈感範文站

位置:首頁 > 實用文 > 實用文精選

CPU基礎知識多篇詳解

CPU基礎知識多篇詳解

CPU基礎知識大全詳解有哪些?CPU在電腦中是最核心關鍵的硬體之一,相當於人的大腦,決定了電腦運算能力,因此CPU的選擇至關重要。下面就讓小編帶你去看看CPU基礎知識大全詳解,希望對你有所幫助吧!

程式設計師必須瞭解的CPU知識 - 科普篇

1導讀

對於一名程式設計師來說,無論你使用的是什麼語言,程式碼最終都會交給CPU來執行。所以瞭解CPU相關的知識一方面屬於程式設計師的內功,另一方面也可以幫助你在日常編寫程式碼時寫出更加高效的程式碼

本文不打算對CPU進行深入探究,相反是以簡單的語言來幫助大家瞭解CPU的工作原理以及不得不提到的CPU快取相關知識,其中晦澀的內容我會通過配圖來幫助大家理解,最後會以幾個例子來幫助大家更直觀的感受到CPU快取帶來的效能影響

2CPU基礎知識

CPU即Central ProcessingUnit(中央處理器),是我們的程式碼打交道最多的硬體之一,要想讓一個CPU工作,就必須給它提供指令和資料,而這裡的指令和資料一般就放在我們的記憶體當中。其中指令就是由我們平常編寫的程式碼翻譯而來,資料也是我們程式碼中需要用到的資料(例如一個int值、一串字串等等)

以C語言為例,從我們開始編寫到執行的生命週期可以粗略的用下圖表示:

大致分為以下幾個步驟

我們日常中使用編輯器或者IDE敲入程式碼

程式碼編寫完成後使用編譯和連結工具生成可以被執行的程式,也就是機器語言(指令的集合)

當程式被執行時,整個程式(包括指令和資料)會被完整的載入到記憶體當中

CPU不停的向記憶體讀取該程式的指令執行直到程式結束

通過上述第4步我們知道,CPU自身是沒有儲存我們的程式的,需要不停的向記憶體讀取

那麼有個問題是CPU是如何向記憶體讀取的呢?

這裡其實存在一個“匯流排”的概念,即CPU會通過地址匯流排、控制匯流排、資料匯流排來與我們的記憶體進行互動。其中地址匯流排的作用是定址,即CPU告訴記憶體需要哪一個記憶體地址上的資料;控制匯流排的作用是對外部元件的控制,例如CPU希望從記憶體讀取資料則會在控制總線上發一個“讀訊號”,如果希望往記憶體中寫一個數據則會發一個“寫訊號”;而資料匯流排的作用顧名思義就是用來傳輸資料本身的了

例如CPU需要希望從記憶體中讀一條資料,那麼整個過程為:

到這裡我們已經知道了CPU在執行我們程式的過程中會不斷的與記憶體互動,讀取需要的指令和資料或者寫入相關的資料。這個過程是非常非常快的,一般CPU與記憶體互動一次需要200個時鐘週期左右,而現代的處理器單個時鐘週期一般都短於1納秒(1秒= 十億納秒)

但我們的前輩們仍然對這個速度不滿足,所以又對CPU設計了一套快取系統來加速對記憶體中資料的讀取

3CPU快取

現代CPU通常設計三級快取(L1、L2、L3),其中L1、L2快取是每個CPU核心獨享的,L3快取是所有CPU核心共享的,而L1快取又分為資料快取和指令快取

我們的資料就從記憶體先到L3快取中,再到L2快取中,再到L1快取中,最後再到CPU暫存器中

按照大小來看,通常L1 < L2 < L3 < 記憶體 <磁碟,如果你手邊有一臺Linu__機器的話,可以通過下面的命令檢視CPU各級快取的大小

以我手上這臺伺服器為例,L1指令快取大小為32K、資料快取大小為32K,L2快取大小為1MB,L3快取大小為35.75MB

按照速度來看,通常L1 > L2 > L3 > 記憶體 > 磁碟,以時鐘週期為計量單位

L1快取:約 4 個CPU時鐘週期

L2快取:約 10 個CPU時鐘週期

L3快取:約 40 個CPU時鐘週期

記憶體:約 200 個CPU時鐘週期

也就意味著如果能命中快取,我們程式的執行速度至少提升5倍左右,如果能命中L1快取則提升50倍左右,這已經屬於相當大的效能提升了

有了快取系統後,CPU就不必要每條指令或資料都讀一次了,可以一次性讀取若干條指令或資料然後放到快取裡供以後查詢,因為根據區域性性原理,CPU訪問記憶體時,無論是讀取指令還是資料,所訪問的記憶體單元都趨於聚集在一個較小的連續區域中,所以一次性讀取一塊連續的記憶體有利於後續的快取命中

現實中,CPU通常情況下每次的讀取記憶體時都會一次性讀取記憶體中連續的64個位元組,這個連續的64位元組術語就叫做CacheLine(快取行),所以每一級CPU快取就像下面這樣

如果你手邊有一臺Linu__機器的話,可以通過下面的命令檢視你的機器使用的CPU的Cache Line大小是多少

對於我的伺服器來說,L1快取就有 32KB / 64B = 512 個Cache Line

到這裡,我們已經知道了CPU快取的工作原理和載入方式,這裡實際上還遺留了兩個話題沒有講,一個是如何組織每一級的 Cache Line(例如 L1 的512 個CacheLine)來提升訪問的命中率;另一個更加複雜一點,在現代CPU都是多核的場景下如何保證資料的一致性,因為每個核都有自己的L1和L2快取,那麼如果核心1修改的時候只修改了快取的資料而沒有修改記憶體中的資料,其他核心讀到的就是舊資料了,如何解決這一問題?

由於本篇文章只是期望對CPU知識進行一個科普,不希望對於小白來說一次性接觸大量的新內容,所以這兩個問題我準備在後面的另外兩篇再進行更細緻的討論

4效能對比

下面以幾個實際的例子來加深大家對Cache Line如何影響程式效能的理解

示例一

我們假設有一個5000萬長度的int陣列,接著把這個陣列的其中一些元素乘以2,考慮下面這兩份程式碼

直覺上程式碼一比程式碼二少迴圈了4倍,並且也少乘2了4倍,理論上程式碼一比程式碼二快4倍左右才合理

但在我的伺服器上執行的結果是程式碼一平均花費90毫秒,程式碼二平均花費93毫秒,效能幾乎是差不多的,讀者可以自行思考一下原因,再點選下方空白處檢視解析

點選下方空白區域檢視解析

解析

這裡最主要的原因還是CacheLine,雖然程式碼一需要執行的指令確實比程式碼二要少4倍,但由於CPU一次會把連續的64個位元組都讀入快取,而讀寫快取的速度又特別快(還記得嗎?L1的讀取速度只有約4個時鐘週期,是記憶體的50倍),以至於我們很難察覺到這4倍指令的差距

示例二

假設我們需要遍歷一個二維陣列,考慮下面這兩種遍歷方法:

由於陣列長度是一模一樣的,直覺上我們期望的是兩份程式碼執行時間相差無幾。但在我的伺服器上程式碼一執行需要23毫秒,程式碼二執行需要51毫秒,讀者可以自行思考一下原因,再點選下方空白處檢視解析

點選下方空白區域檢視解析

解析

這裡最主要的原因依然是Cache Line,由於C語言中二維陣列的記憶體是連續的,所以我們按行訪問的時候訪問的一直都是連續的記憶體,而CacheLine也是連續的64個位元組,所以按行訪問對Cache Line更友好,更容易命中快取

而按列訪問的話每次訪問的記憶體不是連續的,每次的跨度都是256__sizeof(int)也就是1KB,更容易出現快取Miss

示例三

假設我們有一個數組,我們希望計算所有大於100的元素的和,考慮下面兩份程式碼

其中程式碼一是隨機生成了個長度為1000W的陣列,然後統計大於100的所有數字的和;程式碼二也是隨機生成了個長度為1000W的陣列,但是是先排完序,再統計大於100的所有數字的和。並且可以看到,兩份程式碼都是隻計算了統計sum的那段程式碼的消耗時間,所以兩份程式碼都不考慮隨機生成陣列和排序花費的時間

理論上來講兩份程式碼花費時間應當是相差無幾的,但實際上在我的機器上跑出來第一份程式碼輸出的是46毫秒,第二份程式碼輸出的是23毫秒

讀者可以自行思考一下原因,再點選下方空白處檢視解析,提示:第二份程式碼中在統計sum之前陣列是有序的

電腦CPU如何選購?桌上型電腦CPU知識掃盲和選購建議

CPU有幾個重要的引數:架構、主頻、核心、執行緒、快取、介面。

架構:

有句老話叫“拋開架構看核心主頻都是耍流氓”,那什麼是架構?假如我們把架構想象成交通工具,那麼老的架構就是火車,而新的架構就是高鐵,所以架構的提升直接影響CPU的效能。這也就是為什麼老式的CPU雖然也有超高的主頻但效能還是被現在的i3碾壓的原因了。

電腦CPU如何選購?桌上型電腦CPU知識掃盲和選購建議

主頻:

我們常在CPU的資訊裡看到某某CPU主頻3.6GHz,這裡的主頻其實是CPU核心工作的時鐘頻率,並不直接等於CPU的運算速度,但是高的主頻對於CPU的運算速度卻至關重要。

核心:

核心又稱核心,是CPU用來完成所有計算、接受/儲存命令、處理資料等任務的裝置。我們可以簡單的把核心理解為人的手,單核就是一隻手、雙核就是兩隻手、四核就是四隻手。

核心數並不是越多越好的,要看使用場景,比如在打字的時候,兩隻手就比一隻手效率高,但是在操作滑鼠的時候,使用兩隻手只會起到適得其反的效果。至於什麼場景需要使用多少核心的CPU在下面會講到。

電腦CPU如何選購?桌上型電腦CPU知識掃盲和選購建議

執行緒:

我們通常會看到“四核四執行緒”和“四核八執行緒”這兩種說法,我們可以簡單的把工廠裡的流水線比作執行緒,把工人比作核心,早先由於工人工作技能不高,一個工人只能處理一條流水線的任務,我們可以把這個稱為單核單執行緒,但是後來工人技術熟練了,覺得操作一條流水線很無聊,不能體現自己的價值,於是就給又分配一條流水線,讓這個工人同時處理兩條流水線的任務,我們可以把這個稱為“單核雙執行緒”。

快取:

快取也是CPU裡的一項非常重要的引數,由於CPU的運算速度比記憶體條的讀寫速度要快很多,這會讓CPU花費很長的時間等待資料的到來或是把資料寫入記憶體條,這個時候CPU內的快取記憶體可以作為臨時的儲存介質來緩解CPU的運算速度與記憶體讀寫速度不匹配的矛盾,所以快取越大越好。

電腦CPU如何選購?桌上型電腦CPU知識掃盲和選購建議

介面:

CPU需要通過介面安裝在主機板上才能工作,而目前CPU的介面都是針腳式介面,AMD和英特爾的CPU在介面上就有很大的差別,所以需要使用適配介面的主機板才能正常工作。目前英特爾主流的介面型別為LGA-1151介面(6、7、8代i3i5 i7都是這種介面);AMD平臺主流的介面型別有AM4介面(銳龍系列)和FM2+介面(速龍系列、APU系列)。

PS:英特爾最新的酷睿8代CPU雖然也是LGA-1151介面,但不適配老式的LGA-1151介面主機板的平臺,需要另購主機板

說完了這些重要的引數,相信你也對CPU有了一個大概的瞭解,我們再談談不同場景對CPU的選擇。

計算機系統基礎:CPU相關知識筆記

1、什麼是CPU

計算機的基本硬體系統由運算器、控制器、儲存器、輸入裝置、輸出裝置5大部件組成。

運算器和控制器等部件被整合在一起稱為中央處理單元(Central Processing Unit,CPU)

是硬體系統的核心。

2、CPU的用途

CPU主要負責獲取程式指令、對指令進行譯碼並加以執行。

CPU的功能如下:

3、CPU的組成

CPU主要由運算器、控制器、暫存器和內部匯流排等部件組成。

3.1

運算器

運算器包括算術邏輯單元(ALU)、累加器、緩衝暫存器、狀態條件暫存器等。它的主要工作是完成所規定的的各種算術和邏輯運算。

算術邏輯單元(ALU):ALU的重要組成部件,負責處理資料,實現算術和邏輯運算。

累加器(AC):當執行算術或邏輯運算時,為ALU提供一個工作區。

資料緩衝器(DR):作為CPU和記憶體、外部裝置之間資料傳送的中轉站、操作速度的緩衝;

在單累加器結構的運算器中,DR還可以作為運算元暫存器。

狀態暫存器(PSW):儲存算術指令和邏輯指令執行或測試的結果建立的的各種條件碼內容,分為狀態標誌和控制標誌。

3.2

控制器

用於控制這個CPU的工作,不僅要保證程式的正確執行,還要能處理異常事件。

控制器主要包括指令控制邏輯、時序控制邏輯、匯流排控制邏輯、中斷控制邏輯。

3.2.1

指令控制

指令暫存器(IR):當執行一條指令時,需要先把它從記憶體儲存器取到緩衝暫存器中,再送入IR中暫存,指令譯碼器會根據IR的內容產生各種微操作命令,控制其他部件協調工作,完成指令的功能。

程式計數器(PC):PC具有寄存和計數兩種功能。又稱為指令計數器。

地址暫存器(AR):用來儲存當前CPU所訪問的記憶體單元地址。

指令譯碼器(ID):包含指令操作碼和地址碼兩部分,為了能執行任何給定的指令必須對操作碼進行分析,以便識別要進行的操作。

3.2.2

時序控制

時序控制要為每條指令按時間順序提供應有的控制訊號。

3.2.3

匯流排控制

為多個功能部件提供服務的資訊通路的控制電路。

3.2.4

中斷控制

用於控制各種中斷請求,並根據優先順序排隊,逐個交給CPU處理。

3.3

暫存器組

分為專用暫存器、通用暫存器。運算器和控制器中的暫存器是專用暫存器,作用是固定的。

通用暫存器用途廣泛由程式設計師規定其用途。

4、什麼是多核CPU

核心:CPU的核心稱為核心,是CPU的最重要組成部分。CPU的所有計算、接收/儲存命令、處理資料都是由核心執行。

多核:在一個單晶片上整合兩個或者更多個處理器核心,並且每個核心都有自己的邏輯單元、控制單元、中端處理器、運算單元、一級Cache、二級Cache共享或獨有。

多核CPU優點:可滿足使用者同時進行多工處理等要求。

標籤:CPU 多篇