你管這破玩意叫 CPU?

作者 |碼農的荒島求生 責編 | 歐陽姝黎

每次回家開燈時你有沒有想過,用你按的簡單開關實際上能打造出複雜的 CPU 來,只不過需要的數量會比較多,也就幾十億個吧。

偉大的發明

過去200年人類最重要的發明是什麼?蒸汽機?電燈?火箭?這些可能都不是,最重要的也許是這個小東西:

你管這破玩意叫 CPU?

這個小東西就叫電晶體,你可能會問,電晶體有什麼用呢?

實際上電晶體的功能簡單到不能再簡單,給一端通上電,那麼電流可以從另外兩端透過,否則不能透過,其本質就是一個開關。

就是這個小東西的發明讓三個人獲得了諾貝爾物理學獎,可見其舉足輕重的地位。

無論程式設計師編寫的程式多麼複雜,軟體承載的功能最終都是透過這個小東西簡單的開閉完成的

,除了神奇二字,我想不出其它詞來。

AND、OR、NOT

現在有了電晶體,也就是開關,在此基礎之上就可以搭積木了,你隨手搭建出來這樣三種組合:

兩個開關只有同時開啟電流才會透過,燈才會亮

兩個開關中只要有一個開啟電流就能透過,燈就會亮

當開關關閉時電流透過燈會亮,開啟開關燈反而電流不能透過燈會滅

天賦異稟的你搭建的上述組合分別就是:與門,AND Gate、或門,OR gate、非門,NOT gate,用符號表示就是這樣:

道生一、一生二、二生三、三生萬物

最神奇的是,你隨手搭建的三種電路竟然有一種很amazing的特性,那就是:任何一個邏輯函式最終都可以透過AND、OR以及NOT表達出來,這就是所謂的

邏輯完備性

,就是這麼神奇。

也就是說

給定足夠的AND、OR以及NOT門,就可以實現任何一個邏輯函式,除此之外我們不需要任何其它型別的邏輯閘電路

,這時我們認為AND、OR、NOT門就是邏輯完備的。

這一結論的得出吹響了計算機革命的號角,這個結論告訴我們計算機最終可以透過簡單的AND、OR、NOT門構造出來,這些簡單的邏輯閘電路就好比基因。

你管這破玩意叫 CPU?

老子有云:

道生一、一生二、二生三、三生萬物,實乃異曲同工之妙。

雖然,我們可以用AND、OR、NOT來實現所有的邏輯運算,但我們真的需要把所有的邏輯運算都用AND、OR、NOT門實現出來嗎?顯然不是,而且這也不太可行。

計算能力是怎麼來的

現在能生成萬物的基礎元素與或非門出現了,接下來我們著手設計CPU 最重要的能力:計算,以加法為例。

由於CPU只認知 0 和 1,也就是二進位制,那麼二進位制的加法有哪些組合呢:

0 + 0,結果為0,進位為0

0 + 1,結果為1,進位為0

1 + 0,結果為1,進位為0

1 + 1,結果為0,進位為1,二進位制嘛!

注意進位一列,只有當兩路輸入的值都是 1 時,進位才是 1 ,看一下你設計的三種組合電路,這就是與門啊,有沒有!

再看下結果一列,當兩路輸入的值不同時結果為1,輸入結果相同時結果為0,這就是異或啊,有沒有!我們說過與或非門是邏輯完備可以生萬物,異或邏輯當然不在話下,用一個與門和一個異或門就可以實現二進位制加法:

你管這破玩意叫 CPU?

上述電路就是一個簡單的加法器,就問你神奇不神奇,加法可以用與或非門實現,其它的也一樣能實現,邏輯完備嘛。

除了加法,我們也可以根據需要將不同的算數運算設計出來,負責計算的電路有一個統稱,這就是所謂的arithmetic/logic unit,ALU,CPU 中專門負責運算的模組,本質上和上面的簡單電路沒什麼區別,就是更加複雜而已。

現在,透過與或非門的組合我們獲得了計算能力,計算能力就是這麼來的。

但,只有計算能力是不夠的,電路需要能記得住資訊。

神奇的記憶能力

到目前為止,你設計的組合電路比如加法器天生是沒有辦法儲存資訊的,它們只是簡單的根據輸入得出輸出,但輸入輸出總的有個地方能夠儲存起來,這就是需要電路能儲存資訊。

電路怎麼能儲存資訊呢?你不知道該怎麼設計,這個問題解決不了你寢食難安,吃飯時在思考、走路時在思考,蹲坑時在思考,直到有一天你在夢中遇一位英國物理學家,他給了你這樣一個簡單但極其神奇的電路:

你管這破玩意叫 CPU?

這是兩個NAND門的組合,不要緊張,NAND也是有你設計的與或非門組合而成的,所謂NAND門就是與非門,先與然後取非,比如給定輸入1和0,那麼與運算後為0,非運算後為1,這就是與非門,這些不重要。

比較獨特的是該電路的組合方式,

一個NAND門的輸出是兩一個NAND門的輸入

,該電路的組合方式會自帶一種很有趣的特性,

只要給S和R段輸入1,那麼這個電路只會有兩種狀態:

要麼a端為1,此時B=0、A=1、b=0;

要麼a端為0,此時B=1、A=0、b=1;

不會再有其他可能了,

我們把a端的值作為電路的輸出。

此後,你把S端置為0的話(R保持為1),那麼電路的輸出也就是a端永遠為1,這時就可以說我們把1存到電路中了;而如果你把R段置為0的話(S保持為1),那麼此時電路的輸出也就是a端永遠為0,此時我們可以說把0存到電路中了。

就問你神奇不神奇,

電路竟然具備儲存資訊的能力了。

現在為儲存資訊你需要同時設定S端和R端,但你的輸入是有一個(儲存一個bit位嘛),為此你對電路進行了簡單的改造:

你管這破玩意叫 CPU?

這樣,當D為0時,整個電路儲存的就是0,否則就是1。

暫存器與記憶體的誕生

現在你的電路能儲存一個位元位了,想儲存多個位元位還不簡單,複製貼上就可以了:

你管這破玩意叫 CPU?

我們管這個組合電路就叫

暫存器

,你沒有看錯,我們常說的暫存器就是這個東西。

你不滿足,還要繼續搭建更加複雜的電路以儲存更多資訊,同時提供定址功能,就這樣記憶體也誕生了。

暫存器及記憶體都離不開上一節那個簡單電路,只要通電,這個電路中就儲存資訊,但是斷電後很顯然儲存的資訊就丟掉了,

現在你應該明白為什麼記憶體在斷電後就不能儲存資料了吧。

硬體還是軟體?

現在我們的電路可以計算資料、也可以儲存資訊,但現在還有一個問題,那就是儘管我們可以用AND、OR、NOT表達出所有的邏輯函式,但我們真的有必要把所有的邏輯運算都用與或非門實現出來嗎?這顯然是不現實的。

這就好比廚師,你沒有聽說只專做一道菜的廚師然後酒店要把各個菜系廚師僱全才能做出一桌菜來吧!

中國菜系博大精深,千差萬別,但製作每道菜品的方式大同小異,其中包括刀工、顛勺技術等,這些是基本功,製作每道菜品都要經過這些步驟,變化的也無非就是食材、火候、調料等,這些放到菜譜中即可,這樣給廚師一個菜譜他就能製作出任意的菜來,在這裡廚師就好比硬體,菜譜就好比軟體。

你管這破玩意叫 CPU?

同樣的道理,

我們沒有必要為所有的計算邏輯實現出對應的硬體,

硬體只需要提供最基本的功能,最終所有的計算邏輯都透過這些最基本的功能用軟體表達出來就好,這就是所謂的軟體一詞的來源,

硬體不可變,但軟體可變,不變的是硬體但提供不同的軟體就能讓硬體實現全新的功能,無比天才的思想

,人類真的是太聰明瞭。

同樣一臺計算機硬體,安裝上word你就能編輯文件,安裝上微信你就能讀到碼農的荒島求生公眾號、安裝上游戲你就能玩王者農藥,硬體還是那套硬體,提供不同的軟體就是實現不同的功能,

每次開啟電腦使用各種App時沒有在內心高呼一聲牛逼你都對不起計算機這麼偉大的發明創造

,這就是為什麼計算機被稱為

通用

計算裝置的原因,這一思想是計算機科學祖師爺圖靈提出的。

你管這破玩意叫 CPU?

扯遠了,接下來我們看下硬體是怎麼提供所謂的基本功能的。

硬體的基本功

讓我們來思考一個問題,CPU怎麼能知道自己要去對兩個數進行加法計算,以及哪兩個數進行加法計算呢?

很顯然,你得告訴CPU,該怎麼告訴呢?還記得上一節中給廚師的菜譜嗎?沒錯,CPU也需要一張菜譜告訴自己該接下來該幹啥,在這裡菜譜就是機器指令,指令透過我們上述實現的組合電路來執行。

接下來我們面臨另一個問題,那就是這樣的指令應該會很多吧,廢話,還是以加法指令為例,你可以讓CPU計算1+1,也可以計算1+2等等,實際上單單加法指令就可以有無數種組合,顯然CPU不可能去實現所有的指令。

實際上CPU只需要提供

加法操作

,你提供

運算元

就可以了,CPU 說:“我可以打人”,你告訴CPU該打誰、CPU 說:“我可以唱歌”,你告訴CPU唱什麼,CPU 說我可以做飯,你告訴CPU該做什麼飯,CPU 說:“我可以炒股”,你告訴CPU快滾一邊去吧韭菜。

因此我們可以看到CPU只提供

機制

或者說功能(打人、唱歌、炒菜,加法、減法、跳轉),我們提供

策略

(打誰、歌名、菜名,運算元,跳轉地址)。

CPU 表達機制就透過指令集來實現的。

指令集

指令集告訴我們 CPU 可以執行什麼指令,每種指令需要提供什麼樣的運算元。不同型別的CPU會有不同的指令集。

指令集中的指令其實都非常簡單,畫風大體上是這樣的:

從記憶體中讀一個數,地址是abc

對兩個數加和

檢查一個數是不是大於6

把這數儲存到記憶體,地址是abc

等等

看上去很像碎碎念有沒有,這就是機器指令,我們用高階語言編寫的程式,比如對一個數組進行排序,

最終都會等價轉換為上面的碎碎念指令,然後 CPU 一條一條的去執行,很神奇有沒有

接下來我們看一條可能的機器指令:

這條指令佔據16位元,其中前四個位元告訴CPU這是加法指令,這意味著該CPU的指令集中可以包含2^4也就是16個機器指令,這四個位元位告訴CPU該做什麼,剩下的bit告訴CPU該怎麼做,也就是把暫存器R6和暫存器R2中的值相加然後寫到暫存器R6中。

可以看到,機器指令是非常繁瑣的,現代程式設計師都使用高階語言來編寫程式,關於高階程式語言以及機器指令的話題請參見《你管這破玩意叫程式語言?》。

指揮家:讓我們演奏一曲

現在我們的電路有了計算功能、儲存功能,還可以透過指令告訴該電路執行什麼操作,還有一個問題沒有解決。

我們的電路有很多部分,用來計算的、用來儲存的,以最簡單的加法為例,假設我們要計算1+1,這兩個數分別來自暫存器R1 和 R2,要知道暫存器中可以儲存任意值,

我們怎麼能確保加法器開始工作時R1和R2中在這一時刻儲存的都是1而不是其它數?

即,我們靠什麼來協調或者說靠什麼來同步電路各個部分讓它們協同工作呢?就像一場成功的交響樂演離不開指揮家一樣,我們的計算組合電路也需要這樣一個指揮家。

你管這破玩意叫 CPU?

負責指揮角色的就是時鐘訊號。

時鐘訊號就像指揮家手裡拿的指揮棒,

指揮棒揮動一下整個樂隊會整齊劃一的有個相應動作,

同樣的,時鐘訊號每一次電壓改變,整個電路中的各個暫存器(也就是整個電路的狀態)會更新一下,這樣我們就能確保整個電路協同工作不會這裡提到的問題。

現在你應該知道CPU的主頻是什麼意思了吧,主頻是說一秒鐘指揮棒揮動了多少次,顯然主頻越高CPU在一秒內完成的操作也就越多。

大功告成

現在我們有了可以完成各種計算的ALU、可以儲存資訊的暫存器以及控制它們協同工作的時鐘訊號,這些統稱

Central Processing Unit

,簡稱就是 CPU。

總結

一個小小的開關竟然能構造出功能強大的 CPU ,這背後理論和製造工藝的突破是人類史上的里程碑時刻,說 CPU 是智慧的結晶簡直再正確不過。

本文從一枚開關開始講解了 CPU 構造的基本原理,希望這篇對大家理解 CPU 有所幫助。

TAG: CPU電路就是加法我們