咱們若是留意的話,可能常常會聽到什麼 x86/x86_6四、ARM、RISC-V 等關鍵詞,可是不少人並不知道指的是什麼。好比:Java 程序員在下載官方 JDK 時,若是對這個概念不瞭解的話,只知道選 x64 那個東西下載就好,其餘一臉懵逼。因此有必要了解一下 CPU 的相關知識。程序員
這篇主要講解一下三個知識點:算法
- CPU 內部結構
- CPU 指令集
- SMP 和 NUMA
1.CPU 內部結構服務器
CPU 內部有不少組件,好比MMU/TLB 等,可是主要的部件主要有三類:控制單元、存儲單元、運算單元。架構
控制單元由程序計數器(PC)、指令寄存器(IR)、指令譯碼器(ID)等控制器組成,不少同窗應該對程序計數器(PC)比較耳熟。控制單元主要功能有:性能
- 從內存中獲取指令
- 對指令進行譯碼,譯碼獲得電氣信號用來控制 CPU 的操做
- 控制 CPU 與內存的數據流動
運算單元主要部件是算術邏輯單元(ALU)。控制單元會將對應的數據輸入到這個部件,讓它進行數據的運算。它能支持的運算主要是加減乘除、移位、邏輯。設計
存儲單元它主要用來暫時存放 cpu 將要獲取的數據或者剛產生的數據,它由專用寄存器和通用寄存器兩個部分組成。通用寄存器是能夠由程序員進行控制的,通常可用匯編語言來控制。那專用寄存器和通用寄存器都有哪些呢?這個問題就比較專業了,我也記不住那些 AX、BX、CX、DX、BP、SP、SI、DI 的名稱。咱們大概瞭解一下它裏面的組成,想了解的能夠去翻一下《深刻理解計算機系統》第三版,第二版講的是 32 位的,第三版的是 64 位。如今市面上 CPU 基本都是 64 位的了,因此最好仍是看第三版。orm
2.CPU 指令集blog
什麼是指令集?它有什麼用?排序
指令集是指揮 CPU 工做的指示和命令,好比:讓某個數進行乘法運算。指令集有不少種,由於在早期每一個芯片製造公司都各自爲政搞本身的 CPU 指令集,好比 Intel,IBM,AMD 等。不一樣的指令集對於表達同一個事的效率是不同的,有些比較高效,有些比較低效冗餘。好比:讓 100 乘以 2,高效的指令集會讓 100 進行往左移一位(左移一位至關於乘以2),低效的指令集則會讓 ALU 進行 100 x 2 乘法運算。內存
指令集雖然有不少種,可是能夠劃分爲兩大類:(RISC) 精簡指令集 和 (CISC) 複雜指令集。指令集剛出來的時候,芯片設計公司都在往指令集裏面不斷的加指令,顯得功能很強大,因此按照時間線來講 CISC(複雜指令集) 出來得比較早。後來有個工程師發現大部分指令其實用不到,這裏面涉及到了一個 "80/20 原則":CPU 百分之八十的功能只會用到指令集中百分之二十的指令。因此這個工程師將大部分的指令刪除了,精簡了指令集,這就成爲了 RISC(精簡指令集)。
目前市場上主要有以下這些指令集:
x86/x86_64:屬於 CISC 複雜指令集。這兩個指令集是 Intel 和 AMD 公司分別開發出來的,這裏面邊有個小故事,有興趣的同窗能夠去搜索一下。如今臺式機 CPU 和服務器 CPU 大多使用的是這個類型的指令集。
ARM:屬於 RISC 精簡指令集。大名鼎鼎的 ARM 公司開發的產品,這個公司只進行芯片設計,不涉及製造。咱們用的手機或者物聯網設備上的芯片大可能是這個類型的指令集。爲何會這樣呢?由於這個 ARM 類型的芯片功耗較低。
MIPS:屬於 RISC 精簡指令集。目前市面上不常見這種指令集的 CPU,可是我國的龍芯採用的是這種指令集,據說它的設計是很精緻的,但因爲這種指令集的約束力不強,能夠自由發揮,致使如今市場愈來愈少這種指令集。
RISC-V:屬於 RISC 精簡指令集。冉冉升起的新星,它是在美國大學裏面的實驗室誕生並開源,目前還沒成熟,可是據說頗有看頭。
關於 CISC 和 RISC 哪一個更好如今沒有定論,只是學術界大多比較傾向於 RISC,而老牌的芯片廠商則因爲歷史包袱一直對已有的 CISC 改良革新,孰強孰弱讓歷史見證吧。
3.SMP 和 NUMA
不少同窗可能對這個並不瞭解,但在基礎研發的同窗看來這是必知必會的知識點。
芯片裏面每一個核心如何存取數據是有不一樣的設計的,比較常見的設計有 SMP 和 NUMA。
SMP:對稱多處理器結構(Symmetric Multi-Processor)。假設一個 CPU 裏面有 4 個核,每一個核訪問任何一個內存地址所用的時間都是同樣的。以下圖所示:
NUMA:非一致存儲訪問結構(Non-Uniform Memory Access)。假設一個 CPU 裏面有 4 個核,每一個核訪問任何一個內存地址所用的時間都不太同樣。以下圖所示:
SMP 和 NUMA 適用的場景不一樣,SMP 適用於我的 PC,也就是咱們的我的用的電腦 CPU 大可能是 SMP 架構,由於 SMP 架構在 2-4 個核的時候性能是最好的,而我的用的計算機基本上 2-4 核已經夠用了。NUMA 適用於服務器領域,服務器是不少核心的,通常都 100 個核心往上走。在服務器這種場景中,若是用 SMP 架構的話性能會很慢,你想一想 100 我的同時衝向一個食堂打飯,場面確定混亂不堪,可是把食堂分紅 4 個小地方開設,讓 100 我的就近去 4 個食堂打飯,那確定比去同一個食堂打飯強不少。
SMP 架構和 NUMA 架構使用的場景不一樣,就像排序算法中的冒泡排序和快速排序,在小數據量的狀況下其實冒泡也是很快的。
ps.歡迎關注官方公衆號"哈扣"。