一文了解二進(jìn)制和CPU工作原理
Part 1. 原來(lái),我們是這樣記數(shù)的

“本節(jié)內(nèi)容節(jié)選自下方 參考資料 1
在討論「二進(jìn)制」和「CPU 如何工作」之前,我們先來(lái)討論一下我們生活中最稀疏平常的 數(shù)字,我們與之頻繁地打交道:一個(gè)約定的時(shí)間、一件商品的價(jià)格、一個(gè)人的身高....卻很少有人細(xì)細(xì)想過,這些數(shù)字是如何表達(dá)出來(lái)的?為什么你理所當(dāng)然地把 1024
理解為「一千零二十四」而不是別的含義?
也許你從未想過,在這簡(jiǎn)單的記數(shù)中,沉淀著人類的大智慧。
一進(jìn)制計(jì)數(shù)法

-
圖片來(lái)源:https://www.goethe.de/ins/cn/cn/kul/mag/20629923.html
早在數(shù)字的概念產(chǎn)生之前,人類就學(xué)會(huì)了使用樹枝、石子、貝殼等自然界隨處可見的小物件表示獵物的、果實(shí)的、部落人口的數(shù)量。比如在某個(gè)角落堆上一堆石子,每打到 1 只獵物,就扔 1 顆石子進(jìn)去,每吃掉 2 只獵物,就從中取走 2 顆石子。他們并不在意石子的總數(shù),只是時(shí)不時(shí)地瞅一眼,心底大致有數(shù)。
其實(shí)這是一種最樸素的記數(shù)方式,數(shù)學(xué)家稱之為 一進(jìn)制記數(shù)法(unary numeral system)。我們把它符號(hào)化一下,比如用斜杠 /
來(lái)表示:
-
1
就是/
; -
2
就是//
; -
4
就是////
;
好像沒毛病,我們平時(shí)掰手指用的就是這種記數(shù)法,但數(shù)字一大,場(chǎng)面就要失控了。
符值相加記數(shù)法
為了解決記錄大數(shù)的問題,于是我們得發(fā)明一些其他符號(hào)來(lái)表示更大的數(shù)值,比如用橫杠 -
表示 10
,用十字 +
表示 100
。那么:
-
16
就是-//////
; -
32
就是---//
; -
128
就是+--////////
;
漂亮....這種靠符號(hào)類型和符號(hào)數(shù)量表示數(shù)字的方法被稱為 符值相加記數(shù)法(sign-value notation),古埃及和古羅馬用的都是它,只不過符號(hào)各不相同。
古埃及的記數(shù)符號(hào):
1 | 10 | 100 | 1000 | 10000 | 100000 | 1000000 |
---|---|---|---|---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
1024
在古埃及就寫作:

你會(huì)發(fā)現(xiàn),符值相加記數(shù)法的一大優(yōu)點(diǎn)是,符號(hào)的順序可以任意打亂,數(shù)字含義不受影響。我國(guó)藏族曾用石子表示 1
、木棍表示 10
、果核表示 100
、蠶豆表示 1000
、瓦片表示 10000
,那么,當(dāng)你把 1
顆蠶豆、2
根木棍和 4
顆石子胡亂地攥在手里,別人依然知道它們是 1024
。
古羅馬的做法略有不同,他們對(duì)五進(jìn)制情有獨(dú)鐘:
1 | 5 | 10 | 50 | 100 | 500 | 1000 |
---|---|---|---|---|---|---|
I | V | X | L | C | D | M |
這些符號(hào)沿用至今,想必大家(至少對(duì)前 3
個(gè))都比較熟悉,許多鐘表仍保留著使用羅馬數(shù)字的習(xí)慣,1~12
分別表示為:I
、II
、III
、IV
、V
、VI
、VII
、VIII
、IX
、X
、XI
、XII
。你會(huì)發(fā)現(xiàn),羅馬記數(shù)法是符值相加記數(shù)法的變種,因?yàn)樗还狻赶嗉印?,還「相減」。這種方式就不允許符號(hào)亂序了,IV
和 VI
表示的是不同的數(shù)字。
那羅馬人何苦要使用這種更復(fù)雜的記數(shù)法呢?無(wú)非是為了讀寫方便。同樣表示 9
,IX
比 VIIII
更簡(jiǎn)潔。
其實(shí)有一種更好使的方法——用另外一些列符號(hào)來(lái)表示符號(hào)的數(shù)量。比如用 A
表示 1
個(gè)符號(hào),用 B
表示 2
個(gè)符號(hào),以此類推,用 I
表示 9
個(gè)符號(hào)。
如此,上文表示 256
的 ++-----//////
就可以寫作 B+E-F/
。你一定感覺莫名其妙,這種寫法哪里方便了。其實(shí)中文的數(shù)字表示就是這種形式,只不過我們用得太習(xí)慣了,以至于沒有發(fā)現(xiàn)。
在中文中,個(gè)
、十
、百
代替了 /
、-
、+
,而 一
、二
、三
代替了 A
、B
、C
。256
就寫作 二百五十六個(gè)
,個(gè)
比較累贅,我們通常把它省略了。
其實(shí)像日語(yǔ)、英語(yǔ)用的也同樣是這種記數(shù)法,簡(jiǎn)潔、優(yōu)雅。
美中不足的是,這種形式雖便于讀寫,卻不便于計(jì)算。中國(guó)古人為算籌和算盤這類經(jīng)典算具搭建起廣闊的舞臺(tái),卻沒給筆算留出一席之地。想象一下,如果讓你把這些漢字寫在草稿紙上,列個(gè)豎式,你的內(nèi)心一定非常別扭。
位值制記數(shù)法
公元5世紀(jì),印度數(shù)學(xué)家阿耶波多(Aryabhata 476–550)創(chuàng)立了現(xiàn)在廣泛使用的 位值制記數(shù)法(positional notation/place-value notation),該記數(shù)法使用的主要符號(hào),是同為印度人發(fā)明的阿拉伯?dāng)?shù)字:0
、1
、2
、3
、4
、5
、6
、7
、8
、9
。
與符值相加記數(shù)法類比,位值制中的 1
、2
、3
代替的是 A
、B
、C
,那 /
、-
、+
呢?是 靠阿拉伯?dāng)?shù)字的位置來(lái)表示的。眾所周知,最右位相當(dāng)于 /
,次右位相當(dāng)于 -
。靠每個(gè)位置上的數(shù)值來(lái)表示數(shù)字,故名位值制。
嚴(yán)謹(jǐn)?shù)臄?shù)學(xué)家用一種多項(xiàng)式高度概括了位值制記數(shù)法的本質(zhì),在十進(jìn)制中,這個(gè)多項(xiàng)式是這樣的:


這是一個(gè) n
位十進(jìn)制數(shù),ai 就是第 i 位上的數(shù)值。為便于直觀理解,舉個(gè) 1024
的例子吧:

由于我們熟悉了十進(jìn)制,這樣費(fèi)心費(fèi)力的展開可能會(huì)讓你覺得好笑,但當(dāng)我們把它推廣到其他進(jìn)制時(shí),這個(gè)多項(xiàng)式的價(jià)值就體現(xiàn)了出來(lái)。n 位 b 進(jìn)制數(shù)的位值制表示:


1024
用二進(jìn)制怎么表示?

因此,1024
的二進(jìn)制寫作 10000000000
。
除了最普遍的十進(jìn)制和計(jì)算機(jī)中的二進(jìn)制,常見的還有七進(jìn)制(如 1
周 7
天)、十二進(jìn)制(如 1
年 12
個(gè)月)、十六進(jìn)制(如古代 1
斤 16
兩)、六十進(jìn)制(如六十甲子)等等,只要有意義,任何進(jìn)制都可以為你所用。
非標(biāo)準(zhǔn)位值制
在上述的多項(xiàng)式中,如果 ai 或 b 的取值奇葩一點(diǎn),就形成了 非標(biāo)準(zhǔn)位值制(non-standard positional numeral systems),這類記數(shù)法往往應(yīng)用于專業(yè)領(lǐng)域,很難在日常生活中見到。比如標(biāo)準(zhǔn)位值制中的三進(jìn)制 ai 的取值為 0
、1
、2
,但在一種名為平衡三進(jìn)制(balanced ternary)的非標(biāo)準(zhǔn)位值制中,ai 取 -1
、0
、1
,蘇聯(lián)曾使用這種進(jìn)制研發(fā)電子計(jì)算機(jī)。
Part 2. 二進(jìn)制簡(jiǎn)介

-
圖片來(lái)源:https://zhuanlan.zhihu.com/p/26743163
至此,你對(duì)「二進(jìn)制」應(yīng)該會(huì)感覺親切了些,它只是一種數(shù)制而已,本質(zhì)上與我們熟悉的十進(jìn)制沒有很大的差別,我們這一 Part 來(lái)稍微理解一下二進(jìn)制。(至于電腦為什么使用二進(jìn)制我們?cè)谙乱?Part 中介紹)
二進(jìn)制的基本運(yùn)算
十進(jìn)制中的那些基本運(yùn)算原則,二進(jìn)制中同樣適用,只不過需要稍加變幻而已,下面我們分別就加、減、乘、除四則運(yùn)算來(lái)介紹。
二級(jí)制加法
根據(jù)「逢二進(jìn)一」規(guī)則,二進(jìn)制數(shù)加法的法則為:
0+0=0
0+1=1+0=1
1+1=0?。ㄟM(jìn)位為1)
1+1+1=1 (進(jìn)位為1)
例如:1101
和 1011
相加過程如下:

二進(jìn)制數(shù)的減法
根據(jù)「借一有二」的規(guī)則,二進(jìn)制數(shù)減法的法則為:
0-0=0
1-1=0
1-0=1
0-1=1 (借位為1)
例如:1101
減去 1011
的過程如下:

二進(jìn)制的乘法
二進(jìn)制數(shù)乘法過程可仿照十進(jìn)制數(shù)乘法進(jìn)行。但由于二進(jìn)制數(shù)只有 0
或 1
兩種可能的乘數(shù)位,導(dǎo)致二進(jìn)制乘法更為簡(jiǎn)單。二進(jìn)制數(shù)乘法的法則為:
0×0=0
0×1=1×0=0
1×1=1
例如:1001
和 1010
相乘的過程如下:

二進(jìn)制的除法
二進(jìn)制數(shù)除法與十進(jìn)制數(shù)除法很類似。
例如:100110
÷ 110
的過程如下:

二進(jìn)制為什么能表示所有的數(shù)據(jù)
因?yàn)榫幋a規(guī)定。
之前我們有說到,所有保存的程序和數(shù)據(jù)在計(jì)算機(jī)中都被描述為 文件,也就是說我們能夠知道當(dāng)前的數(shù)據(jù)集合被期望的用途是什么,也就能夠找到對(duì)應(yīng)的 處理器 來(lái)正確處理當(dāng)前的數(shù)據(jù)。
例如保存文字
拿文字舉例,為了讓一串 0
、1
能夠代表特定的文字,人們規(guī)定使用一個(gè)字節(jié)中的七位來(lái)表達(dá)特定的文字, 這就是大名鼎鼎 ASCII (American Standard Code for Information Interchange) 碼,ASCll 碼能夠表達(dá) 27=128 種字符(編碼從 0~127
),對(duì)于 26
個(gè)英文字母和一些常用的可打印字符,這完全足夠了:

可是,世界文化是多元的,面對(duì)類似漢字這樣的象形文字,ASCll碼表用起來(lái)自然是捉襟見肘。
窮則思變,一個(gè)字節(jié)不行,那就兩個(gè)字節(jié),這就是大名鼎鼎的 Unicode 碼,不難看出,Unicode 碼有 216=65536 種表示方式,這樣就足以表達(dá)一些常用的字符了,值得一提的是,Unicode 碼算是在 ASCll 碼上的一種擴(kuò)充,其第 0~127
個(gè)編碼字符與 ASCll 碼表一模一樣。
再比如圖片
這里涉及一點(diǎn)點(diǎn)物理知識(shí),話說很久以前,牛頓通過三棱鏡把白色的光分解成七種不同顏色的光,后來(lái)又通過各種實(shí)驗(yàn)發(fā)現(xiàn)紅、綠、藍(lán)三種顏色的光是無(wú)法被分解的,因此我們就稱為紅藍(lán)綠為光的三原色。

至此人類已經(jīng)知道了:可以通過組合不同比例的紅、綠、藍(lán)三種顏色來(lái)獲得各種各樣的顏色,那么我們就可以在計(jì)算機(jī)上模擬了?,F(xiàn)在的計(jì)算機(jī),一般使用 32
位來(lái)表示顏色,32
位平分給四個(gè)分量,也就是每個(gè)分量 8
位。
為啥是四個(gè)顏色分量?
因?yàn)轭伾P椭杏幸粋€(gè) alpha 值,用來(lái)表示透明度,這一點(diǎn)我們先不考慮??傊N顏色,每個(gè)使用 8
位來(lái)表示的話,我們就能夠表示 256 * 256 * 256 = 16777216
種顏色了,已經(jīng)足夠基礎(chǔ)的使用了。
先來(lái)看一張圖片:

這張圖像的尺寸是 600px * 664px
(px 是一種圖片單位,中文名稱為像素,你可以暫時(shí)理解為一個(gè)點(diǎn))。我們把它放大一下,如下圖所示:
看見了嗎?實(shí)際上,大部分圖像(你拍攝的照片、你掃描的圖片、你使用 iPad 畫的圖片等等...)都是位圖文件,位圖就是由像素點(diǎn)構(gòu)成的,它就像是一個(gè)網(wǎng)格一樣,每個(gè)格子里面填一個(gè)顏色。(除了位圖外,還有一種圖是矢量圖,它描述的是形狀而非網(wǎng)格)
OK,我想你已經(jīng)能理解圖像是由像素點(diǎn)組成的了(事實(shí)上我們的顯示器也是),我們只需要在編碼中附帶上一些額外的信息,例如圖像有多大的尺寸、時(shí)間、作者、顏色深度、是否支持透明度之類的就能夠?qū)D像進(jìn)行正確表示了。(視頻可以簡(jiǎn)單理解成一張張連續(xù)不斷的圖片)
要讓顯示器正確顯示圖片或者視頻,只需要讓顯示器上每個(gè)像素顯示特定的顏色就好了。

-
圖片來(lái)源:https://www.bbc.co.uk/bitesize/topics/zf2f9j6/articles/z2tgr82
Part 3. 為什么是二進(jìn)制?

-
圖片來(lái)源:https://zhuanlan.zhihu.com/p/33439000
可為什么一定是二進(jìn)制呢?使用人類習(xí)慣的十進(jìn)制不好嗎?
理由一:物理上易于實(shí)現(xiàn)
計(jì)算機(jī)依靠電力工作,這也就意味著需要將數(shù)字信號(hào)映射到電信號(hào),實(shí)現(xiàn)這種映射最簡(jiǎn)單的方法是:
-
0 - 沒有電(0 V) -
1 - 有點(diǎn)(5 V)
二進(jìn)制在技術(shù)上最容易實(shí)現(xiàn)。這是因?yàn)榫哂袃煞N 穩(wěn)定狀態(tài) 的物理器件很多,如門電路的導(dǎo)通與截止、電壓的高與低等,而它們恰好可以對(duì)應(yīng)表示 “1” 和 “0” 這兩個(gè)數(shù)碼。假如采用十進(jìn)制,那么就要制造具有 10
種 穩(wěn)定狀態(tài) 的物理電路,而這是非常困難的。
理由二:機(jī)器可靠性高
為什么使用更復(fù)雜的數(shù)字系統(tǒng)是一個(gè)問題?
假設(shè)我們使用三元(3 位數(shù)字)數(shù)字系統(tǒng)涉及計(jì)算機(jī),如果我們具有從 0 V
到 5 V
的電壓,那么我們可以進(jìn)行以下的映射:
-
0 - 0 V; -
1 - 2.5 V; -
2 - 5 V;

-
圖片來(lái)源:https://pmihaylov.com/intro-binary-numbers/
看起來(lái)合理吧?但是,想象一下,我以 2.5 V
的電壓發(fā)送了一個(gè)數(shù)字。但是由于電路中的一些噪聲,我在輸出端得到 2.3 V
的電壓,因此將其視為 0
。結(jié)果是?
有人給我發(fā)送了 1
,但我將其視為 0
。數(shù)據(jù)丟失可是一個(gè)非常嚴(yán)重的問題。
使用二進(jìn)制則可靠得多,由于電壓的高和低、電流的有和無(wú)等都是一種 質(zhì)的變化,兩種物理狀態(tài)穩(wěn)定、分明,因此,二進(jìn)制碼傳輸?shù)目垢蓴_能力強(qiáng),鑒別信息的可靠性高。
為什么計(jì)算機(jī)系統(tǒng)必須有時(shí)鐘

-
圖片來(lái)源:http://programmedlessons.org/Java9/chap02/ch02_11.html
建立數(shù)字系統(tǒng)的目的是 僅在某些時(shí)間點(diǎn)測(cè)試開/關(guān)(二進(jìn)制)值,這使電線(或其他設(shè)備)有時(shí)間更換。這就是計(jì)算機(jī)系統(tǒng)有時(shí)鐘的原因。
時(shí)鐘會(huì)周期性地進(jìn)行信號(hào)的測(cè)量,圖中所示的 T1 和 T2 就是可以測(cè)量信號(hào)的時(shí)間點(diǎn)。
時(shí)鐘利用所有這些時(shí)間點(diǎn)來(lái)保持同步。更快的時(shí)鐘意味著每秒可以對(duì)電線進(jìn)行更多次測(cè)試,并且整個(gè)系統(tǒng)運(yùn)行得更快。2 GHz
處理器每秒檢查二進(jìn)制值 20
億次。在這些時(shí)間之間,允許值改變并穩(wěn)定下來(lái)。處理器芯片速度越快,每秒可以測(cè)試的次數(shù)就越多,每秒可以做出的決策就越多。
理由三:運(yùn)算規(guī)則簡(jiǎn)單
數(shù)學(xué)推導(dǎo)已經(jīng)證明,對(duì) N
進(jìn)制數(shù)進(jìn)行算術(shù)求和或求積運(yùn)算,其運(yùn)算規(guī)則各有 N(N+1)/2
種。如采用十進(jìn)制,則 N=10
,就有 55
種求和或求積的運(yùn)算規(guī)則;而采用二進(jìn)制,則 N=2
,僅有 3
種求和或求積的運(yùn)算規(guī)則,以上面提到的加法為例:
0+0=0,0+1=1 (1+0=1),1+1=10
因而可以大大簡(jiǎn)化運(yùn)算器等物理器件的設(shè)計(jì)。
理由四:邏輯判斷方便
采用二進(jìn)制后,僅有的兩個(gè)符號(hào) “1” 和 “0” 正好可以與邏輯命題的兩個(gè)值 “真” 和 “假” 相對(duì)應(yīng),能夠方便地使用邏輯代數(shù)這一有力工具來(lái)分析和設(shè)計(jì)計(jì)算機(jī)的邏輯電路。
雖然在 1950 年代就造出了更加高效的三元計(jì)算機(jī),但在效率和復(fù)雜度的取舍上,始終抵不過二進(jìn)制。二進(jìn)制仍然在當(dāng)今世界中長(zhǎng)期存在。
Part 4. CPU 的實(shí)際工作方式
上面我們了解到計(jì)算機(jī)以二進(jìn)制的形式運(yùn)行,它們只有兩種狀態(tài):開(1)和關(guān)(0),為了執(zhí)行二進(jìn)制計(jì)算,我們需要采用一種特殊的電子元器件,稱為 「晶體管」。暫時(shí)我們把它理解為一種開關(guān)吧,通電就打開,沒電流通過就關(guān)閉。
利用"開關(guān)"搭建邏輯電路
我們知道,給電燈通上電,它就會(huì)亮:

于是,結(jié)合上開關(guān),我們就能搭建出最基礎(chǔ)的 與門 和 或門。
與門

該電路的邏輯是:只有當(dāng) A 和 B 同時(shí)開啟時(shí),LED 燈才會(huì)亮,也就是認(rèn)為輸出 1,我們可以利用電信號(hào)來(lái)簡(jiǎn)單模擬一下:
A | B | Y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
或門

該電路的邏輯是:當(dāng) A 或者 B 開啟時(shí),LED 燈就會(huì)亮,也就是認(rèn)為輸出 1,我們可以利用電信號(hào)來(lái)簡(jiǎn)單模擬一下:
A | B | Y |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 1 |
其他門
類似地,我們可以借助更多的電子元器件來(lái)創(chuàng)造出基礎(chǔ)的 7
種邏輯門電路:

-
圖片來(lái)源:https://www.zhihu.com/question/348237008/answer/843382847 | @Zign
這里需要特別提一下 異或門,我們需要先知道有一種電子元器件可以利用電氣特性對(duì) 輸入取反,也就是說輸入 1
則輸出 0
,輸入 0
則輸出 1
,那么我們就可以 簡(jiǎn)單模擬 出異或門邏輯電路(實(shí)際會(huì)更復(fù)雜些,這里僅展示出異或的意思):

A'
和 B'
分別表示 A
和 B
開關(guān)的反值,從圖中我們很容易知道只有當(dāng) A
、B
只存在一個(gè)輸入 1
時(shí),整個(gè)電路才會(huì)輸出 1
。
利用邏輯門簡(jiǎn)單計(jì)算加法
OK,上面我們了解到我們能夠利用 "開關(guān)" 來(lái)模擬邏輯的運(yùn)算,我們接下來(lái)試著還原一個(gè)簡(jiǎn)單的加法運(yùn)算器是如何實(shí)現(xiàn)的:

僅需兩個(gè)門,就可以完成基本的二進(jìn)制加法運(yùn)算。上圖是利用 logic.ly
創(chuàng)建的半加法器,A
、B
相當(dāng)于使我們計(jì)算的兩個(gè)數(shù),最后一塊相當(dāng)于是我們的數(shù)顯芯片,它的功能是根據(jù)輸入顯示數(shù)字,從上到下的引腳(也就是圖中輸入的地方,通常我們這樣稱呼)分別對(duì)應(yīng)了 20=1、21=2、22=4、23=8 的輸入,沒有任何輸入時(shí)顯示為 0
,如果 引腳 1
(對(duì)應(yīng) 20=1)像上圖一樣有輸入,則顯示 0 + 1 = 1
。
我們來(lái)理解一下上方的電路:
-
如果僅打開一個(gè)輸入,但不同時(shí)打開兩個(gè)輸入,則此處的 XOR 門(異或門)將打開,此時(shí)對(duì)應(yīng)輸入 引腳 1
,顯示數(shù)字 1
(類似于1 + 0 和 0 + 1
); -
如果兩個(gè)輸入均打開,則 AND 門(與門)將打開,此時(shí)對(duì)應(yīng)輸入 引腳 2
,顯示數(shù)字 2
(類似于1 + 1
); -
如果沒有輸入,則 AND 門和 XOR 門都保持關(guān)閉,此時(shí)顯示 數(shù)字 0
(類似于0 + 0
);
因此,如果兩個(gè)都打開,則 XOR 保持關(guān)閉,并且 AND 門打開,得出正確的答案為 2
:

但這只是最基礎(chǔ)的半加法運(yùn)算器,不是太有用,因?yàn)樗荒芙鉀Q最簡(jiǎn)單的數(shù)學(xué)問題之一。但如果我們把它們兩個(gè)與另一個(gè)輸入連接,就會(huì)得到一個(gè)完整的加法器:

仔細(xì)思考幾遍,你就會(huì)得知這個(gè)三個(gè)輸入的加法器已經(jīng)可以計(jì)算 3
個(gè)二進(jìn)制數(shù)字的加法運(yùn)算了,我們?nèi)绶ㄅ谥?,可以通過連接更多的"進(jìn)位"來(lái)使這個(gè)加法器能夠運(yùn)算更多的數(shù),這當(dāng)然也意味著這個(gè)計(jì)算鏈條更長(zhǎng)。
大多數(shù)其他數(shù)學(xué)運(yùn)算都可以加法完成。乘法只是重復(fù)加法,減法可以通過一些奇特的位反轉(zhuǎn)來(lái)完成,而除法只是重復(fù)減法。并且,盡管所有現(xiàn)代計(jì)算機(jī)都具有基于硬件的解決方案以加快更復(fù)雜的操作,但從技術(shù)上講,您可以使用完整的加法器來(lái)完成全部操作。
總線和內(nèi)存
現(xiàn)在,我們的計(jì)算機(jī)只不過是一個(gè)計(jì)算器,它記不住任何內(nèi)容也對(duì)輸出沒有任何操作,上述電路只是接了一個(gè)顯示單元而已。

上面展示的是一個(gè)存儲(chǔ)單元。它使用了大量的 NAND 門,并且在實(shí)際生產(chǎn)中,根據(jù)存儲(chǔ)技術(shù)的不同,它們可能會(huì)大不相同,但其功能是相同的。
您給它一些輸入,并打開“寫”位(Write
輸入 1
),它將把輸入存儲(chǔ)在單元內(nèi)。這不僅是一個(gè)存儲(chǔ)單元,因?yàn)槲覀冞€需要一種從中讀取信息的方法。這是通過一個(gè)使能器完成的,該使能器是「存儲(chǔ)器」中每個(gè)位的“與”門的集合,所有位都與另一個(gè)輸入(即“讀取”位)綁定在一起。寫入和讀取位通常也稱為“設(shè)置”(set
)和“啟用”(enable
)。
上面整個(gè)存儲(chǔ)單元都包裹在所謂的寄存器中。這些寄存器連接到 總線,總線是圍繞整個(gè)系統(tǒng)運(yùn)行的一束電線,并連接到每個(gè)組件。即使現(xiàn)代計(jì)算機(jī)也具有總線,盡管它們可能具有多個(gè)總線以提高多任務(wù)處理性能。

每個(gè)寄存器仍有一個(gè)讀寫位,但是在這種設(shè)置下,輸入和輸出是一樣的。這實(shí)際上很好。例如:如果要將 R1 的內(nèi)容復(fù)制到 R2,則應(yīng)打開 R1 的讀取位,這會(huì)將 R1 的內(nèi)容壓入總線。當(dāng)讀取位打開時(shí),您將打開 R2 的寫入位,這會(huì)將總線內(nèi)容復(fù)制到 R2 中。
寄存器也用于制作 RAM。RAM 通常布置在網(wǎng)格中,并且導(dǎo)線有兩個(gè)方向:

解碼器采用二進(jìn)制輸入并打開相應(yīng)的編號(hào)線。例如,11
在二進(jìn)制數(shù)中是 3
,即最高的 2
位數(shù)字,因此解碼器將打開最高的線路。每個(gè)路口都有一個(gè)寄存器。所有這些都連接到中央總線以及中央寫入和讀取輸入。只有跨寄存器的兩條導(dǎo)線也都打開時(shí),讀和寫輸入才會(huì)打開,從而有效地允許您選擇要從中進(jìn)行讀寫的寄存器。同樣,現(xiàn)代 RAM 要復(fù)雜得多,但是此設(shè)置仍然有效。
時(shí)鐘,步進(jìn)器和解碼器
寄存器無(wú)處不在,是在 CPU 中移動(dòng)數(shù)據(jù)并將信息存儲(chǔ)在 CPU 中的基本工具。那么,是什么告訴他們移動(dòng)數(shù)據(jù)的呢?
時(shí)鐘是 CPU 核心中的第一個(gè)組件,它將按設(shè)置的時(shí)間間隔(以赫茲或每秒周期為單位)關(guān)閉和打開。這就是您看到的最直觀的 CPU 速度指標(biāo)。

時(shí)鐘具有三種不同的狀態(tài):基本時(shí)鐘,使能時(shí)鐘和設(shè)置時(shí)鐘?;緯r(shí)鐘將打開半個(gè)周期,另一半關(guān)閉。使能時(shí)鐘用于打開寄存器,并且需要更長(zhǎng)的時(shí)間才能確保數(shù)據(jù)被使能。設(shè)置時(shí)鐘必須始終與使能時(shí)鐘同時(shí)打開,否則可能會(huì)寫入錯(cuò)誤的數(shù)據(jù)。
時(shí)鐘連接到步進(jìn)器,步進(jìn)器將從 1
到最大步數(shù)進(jìn)行計(jì)數(shù),并在完成后將自身重置為 1
。時(shí)鐘還連接到 CPU 可以寫入的每個(gè)寄存器的 AND 門:

這些 “與” 門還連接到另一個(gè)組件的輸出,即指令解碼器。指令解碼器接受 SET R2 TO R1
之類的指令,并將其解碼為 CPU 可以理解的內(nèi)容。它有自己的內(nèi)部寄存器,稱為“指令寄存器”,該寄存器存儲(chǔ)了當(dāng)前操作。它的精確程度取決于您正在運(yùn)行的系統(tǒng),但是一旦解碼,它將打開正確的設(shè)置并啟用正確寄存器的位,這些寄存器將根據(jù)時(shí)鐘觸發(fā)。
程序指令存儲(chǔ)在 RAM(或現(xiàn)代系統(tǒng)中的 L1 高速緩存,更靠近 CPU)中。由于程序數(shù)據(jù)與其他所有變量一樣都存儲(chǔ)在寄存器中,因此可以隨時(shí)對(duì)其進(jìn)行操作以在程序中跳轉(zhuǎn)。這就是程序通過循環(huán)和 if
語(yǔ)句獲取結(jié)構(gòu)的方式。跳轉(zhuǎn)指令將指令解碼器正在讀取的存儲(chǔ)器中的當(dāng)前位置設(shè)置到其他位置。
一切如何配合

現(xiàn)在,我們對(duì) CPU 工作原理的有了一些基本的了解。主總線跨越整個(gè)系統(tǒng),并連接到所有寄存器。完整的加法器以及其他一系列運(yùn)算都打包在算術(shù)邏輯單元或 ALU 中。該 ALU 將與總線建立連接,并且還將具有自己的寄存器來(lái)存儲(chǔ)正在操作的第二個(gè)數(shù)字。
為了執(zhí)行計(jì)算,將程序數(shù)據(jù)從系統(tǒng) RAM 加載到控制部分。控制部分從 RAM 中讀取兩個(gè)數(shù)字,將第一個(gè)數(shù)字加載到 ALU 的指令寄存器中,然后將第二個(gè)數(shù)字加載到總線上。同時(shí),它向 ALU 發(fā)送指令代碼,告知其操作方法。然后,ALU 執(zhí)行所有計(jì)算,并將結(jié)果存儲(chǔ)在另一個(gè)寄存器中,CPU 可以從該寄存器中讀取該值,然后繼續(xù)該過程。
參考資料
-
原來(lái),我們是這樣記數(shù)的 - https://www.jianshu.com/p/58844323e4fb -
二進(jìn)制數(shù)的運(yùn)算方法 - https://www.jianshu.com/p/560aba49c9a4 -
文字,圖片,視頻,音頻的二進(jìn)制表示 - https://blog.csdn.net/c46550/article/details/91040925 -
知乎 - 計(jì)算機(jī)只認(rèn)識(shí)0和1但是怎么表示圖像和影視等等眾多應(yīng)用的?| @kross - https://www.zhihu.com/question/36269548 -
Introduction to binary numbers - https://pmihaylov.com/intro-binary-numbers/ -
What is Binary, and Why Do Computers Use It? - https://www.howtogeek.com/367621/what-is-binary-and-why-do-computers-use-it/ -
CPU 是怎樣認(rèn)識(shí)代碼的?| 知乎 - https://www.zhihu.com/question/348237008/answer/843382847 | @Zign -
HTG Explains: How Does a CPU Actually Work? - https://www.howtogeek.com/367931/htg-explains-how-does-a-cpu-actually-work/
特別推薦一個(gè)分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長(zhǎng)按關(guān)注一下:
長(zhǎng)按訂閱更多精彩▼
如有收獲,點(diǎn)個(gè)在看,誠(chéng)摯感謝
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!