1. 程式人生 > >完了!CPU一味求快出事兒了!

完了!CPU一味求快出事兒了!

## 自我介紹 我叫阿Q,是CPU一號車間裡的員工,我所在的這個CPU足足有8個核,就有8個車間,幹起活來槓槓滴。 我所在的一號車間裡,除了負責執行指令的我,還有負責取指令的小A,負責分析指令的小胖和負責結果回寫的老K。 ![](https://imgkr.cn-bj.ufileos.com/93326468-113d-4ad1-9b07-b3efc386bcd1.png) CPU的每個車間都有一堆箱子,人們把這些箱子叫做`暫存器`,我所在的一號車間也不例外,我們每天的工作就是不斷執行指令,然後折騰這些箱子,往裡面存東西取東西。 由於我們四個人的出色工作,一號車間業績突出,在年會上還多次獲得了最佳CPU核心獎呢。 ## 快取 我們每天都需要跟記憶體打交道,不過由於記憶體這傢伙實在太慢了,我們浪費了很多時間等待他給我們資料傳輸。 ![](https://imgkr.cn-bj.ufileos.com/18a26bc6-2f45-498d-a0ef-b09b0c31a508.png) 終於有一天,上面給我們下了命令,說競爭對手CPU的速度快趕上我們了,讓我們想辦法提升工作效率。這一下可難倒了我們,我們平時幹活絕沒有偷懶,要怪只能怪記憶體那傢伙,是他拖了我們後腿。 一天晚上,我們哥四個在一起聚餐,討論起上面的這道命令來,大家都紛紛嘆氣。 就在一籌莫展之際,老K提出了一個想法:“兄弟們,我發現了一個現象,**咱們和記憶體打交道的時候,如果訪問了某個地址的資料,它周圍的資料隨後也大概率會被訪問到**”,說到這裡,老K停頓了一下。 ![](https://imgkr.cn-bj.ufileos.com/6b724612-d251-4672-9a66-79b79abc10dc.png) 我一邊聽一邊想著,小A倒是先開口:“然後呢?你想表達什麼意思?” 老K繼續說道:“咱每次資料都找記憶體要,太慢了,我尋思在咱們車間劃一塊區域,結合我發現的那個現象,以後讓記憶體一次性把目標區域附近的資料一起給我們,我們存在這塊區域,後面在需要用到的時候就先去這裡找,找不到再去找記憶體要,豈不省事?” 聽老K這麼一描述,感覺靠譜,我也趕緊附和:“好辦法!你們看啊,這記憶體老是拖咱後退,但是這傢伙一時半會也快不起來,要不咱先用這招試試,看看能不能加快一點工作效率,給上面也有個交代。” 說幹就幹,我們很快就付諸實踐了,我們還給這技術取了個名字叫`快取`,效果居然出奇的好,後來為了進一步優化,我們還把快取分為了兩塊,一塊離暫存器很近叫一級快取,剩下的叫二級快取。一級快取中進一步分了指令快取和資料快取兩塊。 ![](https://imgkr.cn-bj.ufileos.com/b2452b50-1aa8-4d08-90b7-356d9c832a10.png) 我們車間的工作效率那是飛速提升,但不知道是誰走漏了風聲,其他幾個車間也知道了這項技術,紛紛效仿。 這天,為了業績,我們決定再加第三級快取,這次把空間弄大點,不過咱們車間地盤有點侷促,放不下,我們偷偷給上面領導反饋了這事兒,想讓領導幫我們協調一下。 領導倒是同意了,不過告訴我們他得一碗水端平,平衡各車間的利益。但是咱廠裡空間也有限,不可能給每個車間都分配那麼大的空間,於是決定由廠裡統一安排一塊大的區域,讓各個車間來共享。沒有辦法,我們也只好同意了。 ![](https://imgkr.cn-bj.ufileos.com/065d25f8-dd3b-45d1-bc90-41114bf23030.png) 現在,我們用上了三級快取技術,記憶體那傢伙拖後腿的現象緩解了不少,相當部分時間我們都能從這三級快取裡面找到我們需要的資料。 ## 亂序執行 隨著技術的發展,咱們CPU工廠的工作效能也是不斷攀升,慢慢的,我們幾個又開始閒下來了,因為我們實在太快了,儘管有了快取,但我們還是有了不少閒暇時間。 這天我還是像往常一樣,小A取指令去了,我們知道這得要點時間,於是我和小胖還有老K我們仨鬥起了地主。 ![](https://imgkr.cn-bj.ufileos.com/76f1af5d-772e-4b4f-9e11-05ff6d0b22ec.png) 打了好幾把,小A才氣喘吁吁的回來,“小胖,該你去指令分析了,你起來讓我來打幾把”。小胖趕緊起身幹活,換上了小A上桌。 就這樣我們幾個輪流工作,一直保持著三個人的鬥地主牌桌。 沒想到的是,沒過多久,廠裡領導過來視察了,正好撞見我們幾個打牌,狠狠的訓斥了我們一頓。 ![](https://imgkr.cn-bj.ufileos.com/bb485784-7b71-4a13-b108-53e8148da77e.png) “你們幾個上班時間玩得挺嗨啊”,領導的臉拉的老長。 “領導,我們沒有偷懶,這取指令、譯碼、執行、回寫幾個步驟都得分步執行,但是我們工作太快,儲存器跟不上我們,我們等得無聊打發時間嘛”,我上前解釋到。 “乾等著你們也可以提前做一些後面的準備工作嘛,不要浪費時間,讓生產效率更上一層樓”,領導說完就離開了,留下我們幾個面面相覷。 不過領導的一番話倒是如一記重錘敲在我的頭上,對啊,我們有這打牌的時間不如提前把後續指令的準備工作先做了,肯定能提升不少效率呢! 我開始組織兄弟幾個商討方案,“兄弟們,我們最主要的時間都浪費在等待記憶體資料上了,如果我們能在等待的時間裡把後續指令需要的資料提前準備到快取中來,那可就節約不少時間了,不用每次都等那麼久。” ![](https://imgkr.cn-bj.ufileos.com/5e8b8407-7069-4c60-b1fa-8f3312496c5b.png) 老K聽後很讚賞我的思路,並補充到:“**不僅是準備工作,像有些指令,比如加法,如果參與加法的資料不依賴前面指令的結果,咱們完全可以提前把這加法指令執行了嘛,把結果儲存在快取中,等真正輪到這條指令執行的時候,再把快取中的結果寫到記憶體中,這不也是節約了時間嗎**” 大家開始頭腦風暴起來,原來可以做的事情還這麼多,之前光想著等靠要,現在要主動出擊了,因為打亂了順序提前會執行後面的指令,我們把這個技術叫做`亂序執行`. “這次大家要保密哦,不能讓隔壁車間知道咱們的這次討論內容”,會議結束前,我提醒大家。 ## 分支預測 按照這次會議討論的結果,咱們第二天準備實行,不過剛一開始,就遇到了麻煩。 按照計劃,我們在空閒時間裡,會提前把後續要執行的指令能做的工作先做了,但麻煩的是我們遇到了一條判斷指令,因為不知道最終結果是true還是false,我們沒法知道後續是應該執行分支A的指令還是分支B的指令。不敢輕舉妄動,怕一會做了無用功。 ![](https://imgkr.cn-bj.ufileos.com/0b0ddec9-fb18-4c81-bb0e-b289d5694ee3.png) 大家只好放棄了提前做準備工作的想法,還是一步步來。 不過很快我們發現,我們經常執行到這個判斷指令,而且每次結果都是去執行A分支,從沒有去過B分支。 ![](https://imgkr.cn-bj.ufileos.com/b179474d-d5ea-44d3-86d7-ee173c77686b.png) 於是我們幾個又商量,發明了一種叫`分支預測`的技術,**遇到分支跳轉時,按照之前的經驗,如果某個分支經常被執行,那後續再去這個分支的概率一定很大,那這樣咱們預測後面會去到這個分支,就提前把這個分支後面指令能做的工作先做了**。 果然,用上了`分支預測`和`亂序執行`後,我們車間的效率又狠狠的提升了一把,在工廠的集體大會上又一次表揚了我們,並且把我們的先進技術向全廠推廣。 **未完待續······** ## 彩蛋 > 然而幸福的日子沒過太長,我們就因為這兩項技術闖下了彌天大禍。 > > 那天,我們還是如往常一般工作,可不久發現我們的分支預測頻頻出錯,提前做的準備工作也屢屢白費,很快,我們發現出事兒了······ > > *預知後事如何,請關注後續精彩······* ## 往期熱門回顧 [雜湊表哪家強?幾大程式語言吵起來了!](https://mp.weixin.qq.com/s/h0FqX9AZByfpgUZrsRVTWg) [核心地址空間大冒險4:執行緒切換](https://mp.weixin.qq.com/s/v6nc9aIBY_R1S6ToPzj5Qg) [震撼!全網第一張原始碼分析全景圖揭祕Nginx](https://mp.weixin.qq.com/s/XrtH9-Eo7pzJu-Fzt89voQ) [一個整數+1引發的災難](https://mp.weixin.qq.com/s/gZPxqZzY2rnngxvvzexWTw) [一網打盡!每個程式猿都該瞭解的黑客技術大彙總](https://mp.weixin.qq.com/s/V7wBdl-5W4ehTAnACQFjGQ) [看過無數Java GC文章,這5個問題你也未必知道!](https://mp.weixin.qq.com/s/Bb2ugXYPR6r11QaGKbNBSw) [一個Java物件的回憶錄:垃圾回收](https://mp.weixin.qq.com/s/xp2S4_3UQTZ0TOIlVqM8uw) [誰動了你的HTTPS流量?](https://mp.weixin.qq.com/s/lxpHhHVIh6DktoHzrRLaKA) [路由器裡的廣告祕密](https://mp.weixin.qq.com/s/7gM31s4-hTJTprJnxsHgEA) [一個HTTP資料包的奇幻之旅](https://mp.weixin.qq.com/s/suzicCzb2g5b8NN71S5Ngw) [我是一個流氓軟體執行緒](https://mp.weixin.qq.com/s/-ggUa3aWkjjHjr9VwQL9TQ) ![](https://imgkr.cn-bj.ufileos.com/62b181b0-cb63-47a0-b836-131de3a562c7.png) ![](https://imgkr.cn-bj.ufileos.com/06d25f4e-bd38-404b-a901-173737bb7ccf.png)