CPU阿甘的一天(以小說的形式,講述cpu,很精彩)

CPU Linux 阿甘正傳 小說 美文 鈺兒愛編程 2018-11-28
CPU阿甘的一天(以小說的形式,講述cpu,很精彩)


CPU阿甘的一天(以小說的形式,講述cpu,很精彩)

前言

CPU阿甘的一天(以小說的形式,講述cpu,很精彩)


上帝為你關閉了一扇門,就一定會為你打開一扇窗

這句話來形容我最合適不過了。

我是CPU, 他們都叫我阿甘, 因為我和《阿甘正傳》裡的阿甘一樣, 有點傻里傻氣的。

上帝把我製造出來, 給我了一個很小的腦容量, 為數不多的寄存器能臨時的記一點東西, 但是上帝給我打開了一扇特別的窗戶, 那就是像阿甘一樣,跑的飛快。

到底有多快呢? 我這麼比喻一下吧, 我的工作都是以納秒為單位的, 你們人間的一秒, 我可能已經做了1000,000,000 (10億)次動作了。

相比而言, 內存比我慢100倍, 硬盤比我慢1000多萬倍, 你說我快不快?

CPU阿甘的一天(以小說的形式,講述cpu,很精彩)

啟動

CPU阿甘的一天(以小說的形式,講述cpu,很精彩)


我住在一個機箱裡,每天早上一陣電流把我叫醒, 還夾雜著嗡嗡的聲音, 我知道我忠實的護衛電風扇又開始工作了, 我特別怕熱, 又運行的飛快, 如果沒有電風扇給我降溫, 我很快就會生病, 生病的後果很嚴重, 那就是我的夥伴們像內存了,硬盤了。。全部都要罷工了, 沒有我這個系統就會陷入的一片死寂。

我聽說有些CPU的福利很好,竟然待在恆溫恆溼,一塵不染的託管機房裡,讓我好生羨慕。

我的腦容量很小, 所以醒來後只想起了我的創造者告訴我的幾件事情 :

1. 你的工作就是運行指令

2. 你不能保存指令, 你的指令全在內存裡

3. 你的第一條指令在內存的最頂端處0xFFFFFFF0

那還有什麼可說的, 趕緊打電話給內存要指令,電話通過系統總線, 還得通過I/O橋電話局需要轉接一下, 再通過存儲總線接通 內存。

"哥們, 把這個地址處的指令給我說一下吧"

"你是誰?" 內存竟然把我忘了, 當然,他斷了電和我一樣,失憶了。

"我是阿甘啊, 我們經常聊天來著, 你忘了?"

內存磨磨唧唧半天才把數據發了過來(比我慢100倍啊), 這是一條跳轉指令, 我立刻回憶起來了, 這是我的老朋友BIOS 等著我去運行他那一堆指令呢。

我給BIOS打電話: “老弟,今天干點啥?”

“阿甘,早上好 " BIOS從不失憶,把所有人都記得清清楚楚 “ 還不是老一套啊,無非做一下系統的自檢, 看看內存,硬盤,顯卡等這些老夥計們有沒有問題, 有問題的話用小喇叭提示一下主人 ”

這些過程我已經輕車熟路了, 很快搞定, 像往常一樣,沒有問題, 我還把一個叫做中斷向量表的東西給弄好了, 我知道一會而要用

這些東西都搞完了,BIOS果然告訴: "阿甘, int 0x19"

我趕緊去剛弄好的中斷向量表中去查第19號, 順藤摸瓜又找到對應0x19的一大堆指令。

執行吧, 這堆指令把將磁盤的第一扇區(磁盤最開始的512字節)運到內存的0X0000:0X7C00處,然後我就從此處接著執行。

我想起來了, 接下來有一大堆精巧的指令把迷迷糊糊的操作系統從硬盤中喚醒, 運輸到內存中來。

(此處實在是複雜, 略去10萬字。。。。)

你看這就是為啥他們叫我阿甘, 我做事飛快,但非得別人告訴去哪裡執行才行, 要不然我就只會坐在那裡無所適從。

CPU阿甘的一天(以小說的形式,講述cpu,很精彩)

運行

CPU阿甘的一天(以小說的形式,講述cpu,很精彩)


操作系統一旦進入內存,立刻就是老大, 所有人都得聽他指揮。

我也發現我的周圍出現了一個屋子:進程屋

屋裡堆著一大堆東西, 什麼進程描述信息包裹了, 進程控制信息包裹了, 我都不太關心, 我只關心最最重要的兩件東西:

1. 我工作必備的寄存器, 就放在我面前的工作臺上。

2. 程序計數器, 我用它記住我要執行的下一條指令地址。

"阿甘, 別來無恙啊" , 操作系統對我還是挺不錯的, 先給我打招呼。

"Linux老大, 今天有什麼活啊", 我每次都表現的積極主動。

"來,把這個hello world 程序給運行了"

Hello world 程序還在硬盤上睡著呢, 得先把他也裝載到內存裡, 要不然我怎麼執行啊。

於是我就拿起電話打給硬盤, 電話通過系統總線來到IO橋電話局, 再轉接到IO總線,這才來到硬盤這裡。

我在電話裡請他把數據給我運過來, 然後我就無所事事的坐在那裡等。

Linux 老大立刻就怒了 : 阿甘, 告訴你多少次了, 你小子怎麼還在等硬盤給你發數據!

是的, 我忘了一件事,硬盤比我慢太多了, 我執行一條指令大概是1ns ,在用來讀磁盤的16ms裡, 我能潛在的執行1600多萬條指令啊。

我感到深深的愧疚, 趕緊拿起電話打給硬盤 : 哥們, 按我們之前商量好的,用直接內存訪問(DMA)啊, 你直接把數據裝載到內存吧, 不用經過我了, 裝載完成以後給我發個信號。

"這還差不多" Linux 老大心情好了些

“阿甘,數據還沒來, 別閒著, 這有一個菲波那切數列數列, 來算一下吧”

"肥波納妾數列? 這名字好古怪,老大, 其實你也知道, 我腦子小,懶得去理解那是啥意思, 你把進程屋切換下,把程序計數器設置好,指向下一條指令, 我一條條指令執行就得了“ 我挺沒追求的。

"真是個阿甘啊! ”老大感慨到。

我所處的進程屋立刻發生了變化(當然,這也是我輔助Linux老大幹的), 各種包裹的信息都變了, 尤其是寄存器和程序計數器。

於是我就開始計算這個什麼納妾數列 ,但是這個數列似乎無窮無盡, 哪個無腦子的程序員寫了個無限循環吧。

正在這時, 我便收到了一個電話, 說是Helloworld的數據已經裝載到內存了, 讓我去處理。

我放下手中的活, 保存好現場, 就去處理那個Helloworld, 果然數據已經都好了, 那就切換過去運行吧。

其實老大並不知道, 任何人,只要你運行了相當多的數量的指令以後, 你都能悟到這些程序的祕密。

我CPU阿甘雖然傻傻的, 但也架不住執行這數以萬萬億的指令給我的薰陶啊。

這個祕密就是:程序都是由順序,分支,循環來組成的。 其實分支和循環在我看來都是跳轉而已。

所以我的工作就是打電話問內存要一條指令, 執行這個指令, 如果是個跳轉指令的話,我就問內存要跳轉的目標地址的那一條指令, 繼續執行, 生活就是這麼簡單。

奧對了, 當然也有複雜的, 就是函數調用, 我得和內存緊密配合才能完成。 這個咱下回再說。

CPU阿甘的一天(以小說的形式,講述cpu,很精彩)

新裝備:緩存

CPU阿甘的一天(以小說的形式,講述cpu,很精彩)


提到內存, 這真是我的好哥們, 沒有他,我幾乎什麼事兒都幹不成, 更重要的是他比硬盤快的多, 讀取一次數據, 只需要 100 納秒左右。 這樣我們倆說起話來就輕鬆多了。

每次他都說: "阿甘, 幸虧有你給我聊天, 要不然我肯定被活活的悶死不可, 那個硬盤說話是在太慢了"

"它為啥那麼慢?" 我每次都問

"硬盤是個機械是的玩意, 一個磁頭在一碟高速旋轉的磁片上挪來挪去,光定位就慢死了"

"那主人為什麼要用硬盤?"

"人家雖然慢, 但是不怕停電, 哪像你和我,一停電全部都失去記憶了。"

確實是, 人不能把好事都佔全了啊。

我的指令中有些完全用我的寄存器就能完成, 但是有很多都需要讀寫內存的數據, 再加上所有的指令都在內存中存著, 雖然它只比我慢個100倍, 但指令多了我還是有點受不了。

我給內存說:"哥們, 你能不能再快點!"

內存說: 拜託, 這已經是我的極限了, 阿甘, 你自己再想想辦法吧 ! 我給你說啊, 我留意了你最近訪問的指令和數據, 我發現了個規律“

"啥規律?"

"比如說吧, 你訪問了我一個內存位置以後過不多久還會多次訪問, 還有,一個內存位置被訪問了, 附近的位置很快也會訪問到"

碼農翻身注: 這其實叫程序的局部性原理

我還以為是啥規律, 其實我早就注意到了。

"這有啥用啊?”

"既然你經常訪問同一塊區域的東西, 你想想如果把這些東西緩存在你那裡會怎麼樣.... "

我一想有道理啊! 加個緩存試試!

從此以後,我每次讀寫指令和數據, 都問緩存要, 緩存沒有才給內存打電話。

果然, 由於局部性原理的存在, 我發現的確是快了不少啊。

當然也有缺點, 那就是Linux老大在做程序切換的時候, 緩存就會失效,因為兩個程序之間沒什麼聯繫,局部性原理不起作用, 所以需要重建緩存。

CPU阿甘的一天(以小說的形式,講述cpu,很精彩)

自我提升:流水線

CPU阿甘的一天(以小說的形式,講述cpu,很精彩)


緩存讓我的工作更有效率, 得到了Linux老大的表揚:"阿甘, 我看你很聰明嘛, 都會用緩存了"

"我哪有那麼聰明,都是內存的點子。老大,不過我學會了一個重要的東西 :當你改變不了別人的話,抱怨也沒用, 還是先改變一下自己吧"

"挺有哲理的嗎, 希望你明天重啟後還能想起來" Linux老大笑話我。

"我最近又發現了一個問題, 正苦惱著呢, 你看我有四隻手, 第一隻手負責打電話問內存要指令, 第二隻手翻譯指令, 第三隻手真正執行, 第四隻手有時候還得把結果寫回內存。 問題是, 我發現經常只有一隻手在忙活, 其他都在閒著, 你看第一隻手取指令, 其他手只能等著。 第二隻手翻譯指令的時候,其他三隻也得等“

"看來以後我們不能叫你阿甘了, 你已經開始思考了" Linux老大笑了

“這問題好解決, 給你舉個例子,你聽說過洗車沒有? 和你差不多, 也是先噴水, 再打洗潔劑, 再擦洗, 最後烘乾, 但人家的工作方式和你不一樣,人家是流水線作業, 你想想, 一輛車在烘乾的時候, 後邊是不是還有三輛車,分別在噴水, 打清潔劑 和擦洗 , 每個步驟都不會空閒。 ”

"這麼簡單的道理我怎麼都沒有想到呢? 我也可以搞個流水線啊, 這樣每隻手都利用起來了"

別人都說我們高科技, 但其實原理都蘊含在生活之中啊。

有了緩存和流水線的幫助, 讓我的工作大大的加快了,大家都對我刮目相看。 他們想給我起個新名字:超人 , 不過我還是更喜歡 他們叫我“阿甘”, 多親切。

CPU阿甘的一天(以小說的形式,講述cpu,很精彩)

尾聲


我一絲不苟,兢兢業業的運行指令, 時不時和夥伴們聊天, 很快一天就過去了, 又到了晚上,我知道關機的時刻到了, 趕緊挨個給他們道別。

很快那些讓我興奮的電流消失了,風扇的嗡嗡聲也沒有了, 我再也無法打出電話,整個世界沉寂了。

明天將會是新的一天。

-----------------------------------------------------------------

轉自微信公眾號 碼農翻身

相關推薦

推薦中...