關(guān)于CPU的胡言亂語(yǔ)
工作多年的資深程序員也未必說(shuō)得清楚,即便是匯編高手也不一定能準(zhǔn)確描述,大部分人對(duì)這些幾乎沒(méi)有興趣,照樣能寫(xiě)出優(yōu)秀的程序。
作為一個(gè)學(xué)生時(shí)代就開(kāi)始對(duì)電子電路發(fā)生興趣的愛(ài)好者,模擬電路自然很好理解,也很形象,比如一個(gè)波形經(jīng)過(guò)放大,變成電壓更高的相同的波形,比如發(fā)光二極管加上一個(gè)正向電壓就會(huì)發(fā)光......可是,一旦接觸到數(shù)字電路,這些東西都排不上了用場(chǎng),有種不會(huì)外語(yǔ)的中國(guó)人到了外國(guó)的感覺(jué)。
數(shù)字電路接觸多了,大概也理解了一些皮毛,不過(guò)是輸入一個(gè)高或低的電平,輸出一個(gè)高或低的電平,這些規(guī)則是設(shè)計(jì)好的(程序),這些與非或門就是最原始最純樸的CPU,而這些程序是固化的,焊接上去就那個(gè)樣子的,你輸入一串脈沖,它就按照規(guī)則輸出一串脈沖,如此這般。
后來(lái),接觸了編程,先學(xué)了高級(jí)語(yǔ)言VB、VB.net,再瀏覽過(guò)幾本C語(yǔ)言,瞻仰了一下匯編語(yǔ)言,不明覺(jué)歷?。r(shí)間長(zhǎng)了,感覺(jué)也就那么回事,沒(méi)什么深?yuàn)W的,只要下功夫研究,完全可以成為一個(gè)合格的程序員,就這么感覺(jué)著突然就少了興趣,唉,人就是這么及安!
許多年來(lái),對(duì)數(shù)字電路到程序之間的聯(lián)絡(luò),一直處于糊涂一盆的狀態(tài),苦于沒(méi)有名師指點(diǎn),也缺乏這方面的資料,頓時(shí)感到那些所謂講師都是書(shū)呆子,我堅(jiān)信他們可以照本宣科地把匯編指令倒背如流,卻講不明白CPU內(nèi)部那些神奇的脈沖是如何跳躍的,這是我所關(guān)心的,我想也是很多人關(guān)心的。
下面,就按我的個(gè)人傻瓜式的理解描述一下我認(rèn)為的CPU工作原理,太雷人,游客請(qǐng)止步,防止觸電身亡!
先說(shuō)內(nèi)存,內(nèi)存就像一張方格信紙,每行多個(gè)列,共有多上行都是固定的。這張方格紙被劃了幾個(gè)區(qū)域,分別存放不同性質(zhì)的數(shù)據(jù)。內(nèi)存又像一塊黑板,所有的演算過(guò)程都要在黑板上進(jìn)行。
舉個(gè)例子,老師在黑板上講課,學(xué)生問(wèn):“1+1=?”,老師拿起粉筆(CPU的指針),在黑板上寫(xiě)下了“1+1=” ,相當(dāng)于在方格紙上占了4個(gè)格(事實(shí)上不是那么少,先不管它),眾所周知,CPU是靠程序發(fā)出指令的,所以這時(shí)候程序員的指令必定是要求CPU進(jìn)行加法運(yùn)算,假設(shè)這個(gè)等號(hào)就是要求運(yùn)算的指令,那么“1+1”這個(gè)算式就會(huì)被CPU編譯成10010100101100010001110001......這樣的二進(jìn)制機(jī)器碼送進(jìn)CPU內(nèi)部的加法器,然后輸出一串011101010010011100101......之類的結(jié)果,結(jié)果放在哪里呢,自然是寫(xiě)在黑板上,同理,放在方格紙的指定位置(這個(gè)位置必須是閑置的,不然會(huì)將原來(lái)的格子里的數(shù)據(jù)擦除,帶來(lái)不可知的后果)。于是就完成了計(jì)算的過(guò)程。
如果覺(jué)得還是難以理解,那我舉個(gè)更淺顯的例子。以前給火鍋店修理過(guò)一臺(tái)羊肉切片機(jī),這種機(jī)器是通過(guò)調(diào)整切刀的間隙達(dá)到調(diào)整羊肉片的厚薄的,這里的羊肉就代表需要運(yùn)算的數(shù)據(jù),間隙的大小就代表邏輯算法,如果切刀間隙是固定的,那么你放進(jìn)去一斤羊肉,會(huì)切出5盤肉片(老板好黑?。矸胚M(jìn)兩斤羊肉就出出10盤肉片。這里的羊肉、肉片都是要占用空間的(內(nèi)存),羊肉片端出去上桌(輸出),內(nèi)存的數(shù)據(jù)就完成了任務(wù)。
按照這樣似是而非的邏輯,發(fā)揮我胡思亂想的特長(zhǎng),CPU內(nèi)部世界林立著幾億個(gè)二極管,這些二極管組成了各種各樣的邏輯電路,隨時(shí)等待著羊肉的到來(lái),在迅雷不及掩耳盜鈴的時(shí)間內(nèi)切出了一盤一盤的羊肉片,羊肉絲,羊肉塊,羊肉丁......
這是最簡(jiǎn)單的一個(gè)運(yùn)算,而程序往往十分復(fù)雜和冗長(zhǎng),CPU像一個(gè)不知疲倦的工人,時(shí)刻等著下一條指令。回到剛才方格紙那個(gè)思路上來(lái),所有的程序代碼必須在內(nèi)存上進(jìn)行存放才能進(jìn)入CPU進(jìn)行運(yùn)算,運(yùn)算后的結(jié)果也必須寫(xiě)在內(nèi)存里,這就像老師不能把1+1的結(jié)果“2”放在心里一樣,他必須寫(xiě)在黑板上。
CPU在內(nèi)存這張方格紙上讀取和寫(xiě)入數(shù)據(jù)的時(shí)候,并不像我們寫(xiě)文章從左到右,從上到下一個(gè)字一個(gè)字,一行一行地寫(xiě),而是隨時(shí)進(jìn)行跳轉(zhuǎn),神經(jīng)病一樣,它可能走著走著突然就跳走了,然后又突然跳回來(lái),它的節(jié)奏永遠(yuǎn)是那么齊整,他跳一百米和一米的時(shí)間是一樣的,不可思議吧!
這就是我所理解的CPU底層工作的狀態(tài),不管你懂不懂,反正我是似懂非懂。至于如何將結(jié)果送到顯示器,如何將鼠標(biāo)鍵盤的數(shù)據(jù)送進(jìn)來(lái),這不屬于最底層,不是今天學(xué)習(xí)的筆記。這些東西相對(duì)還是容易理解的,至少我真的略知一二。
評(píng)論