1. 程式人生 > >太慢不能忍!CPU又拿硬碟和網絡卡開刀了!

太慢不能忍!CPU又拿硬碟和網絡卡開刀了!

## 匯流排技術 我是CPU一號車間的阿Q,最近為了一件事兒搞得我挺煩的。 當初我們CPU工廠剛剛來到主機板上建廠時,那時候主機板上的單位還不多,跟我們打交道最多的就是記憶體那傢伙了。 後來,鍵盤、滑鼠、硬碟、網絡卡、音效卡、顯示卡等等裝置紛紛入駐主機板,這塊土地變得越來越熱鬧起來。 ![](https://imgkr.cn-bj.ufileos.com/bd9806e3-c6c6-4ef1-91ec-718e4932389b.png) 不過,他們的到來並沒有影響我們的地位,畢竟我們是中央處理器,所有人都得聽我們指揮。 為了和主機板上這些傢伙們通訊,我們花了重金鋪了一條線路,主機板上家家戶戶都連上了這條線路,我們把它叫做`匯流排`,雖然說是一條,但實際上它包含了傳輸資料的`資料匯流排`,傳輸地址的`地址匯流排`和進行控制管理的`控制匯流排`。 這樣一來,各單位就能一起聊天了。不過這線路是共用的,大家不能都一起傳資料,那就亂套了。為了統一管理,我們設立了一個新的單位叫`匯流排控制器`,這個單位來統一管理匯流排,大家要通訊就得找它申請,這就叫做`匯流排仲裁`。 ![](https://imgkr.cn-bj.ufileos.com/9d1ced59-f7ec-4495-b1f7-49bb2830b584.png) 不過啊,主機板上的單位之間的速度還是千差萬別的,像記憶體就比硬碟、網絡卡這些單位快多了(當然,跟我們CPU車間的工作速度那還是不能比),不僅如此,不同單位他們的介面還千差萬別,用一套匯流排矛盾就日益明顯了,後來就變成了多級匯流排,讓慢的跟慢的玩,快的跟快的玩,最後大家再用一個東西把不同匯流排連線起來,這個東西就是`橋`! 主機板上後來出現了兩個著名的橋,一個離我們CPU很近的叫`北橋`,記憶體那傢伙和我們通訊就會經過它,另一個離我們遠一點的叫`南橋`,那些慢一些的I/O裝置就通過南橋接進來。再後來,隨著我們CPU工廠的壯大,直接把`北橋`收購了,現在變成了我們廠裡的一個部門了。 ## PIO模式 現在我們可以和這些I/O裝置通訊了,就拿硬碟來說吧,它有I/O埠,我們提供了`in`和`out`兩條指令,就可以對它進行讀寫資料了。這種通訊的方式叫做`可程式設計輸入輸出模型`,Programming Input/Output Model,簡稱`PIO`。 ![](https://imgkr.cn-bj.ufileos.com/c816fa88-d44d-42bc-a085-9773e126036a.png) 我們是整個主機板上的核心,俗話說得好,能力越大,責任越大,但有時候真心覺得有點累。 隨著越來越多的裝置接入主機板,越來越多的程式需要等待我們去執行,工作量大的壓的我們喘不過氣來。 尤其是隨著技術進步,我們CPU工廠的速度越來越快,與硬碟的讀寫速度之間的差距越來越拉大,我們還用這種方式通訊就太浪費我們的時間了。 ## DMA技術 這幾天,我們幾個車間的Leader私下聚在一起討論起這個事情來。 “阿Q,你不覺得現在我們花了太多時間再讀寫硬碟上了嗎,這傢伙慢不是他的錯,扯我們後腿這就是他的錯了啊。傳輸一次資料,我們要執行好多次I/O埠讀寫,我們寶貴的時間都浪費在這上面了!”,二號車間的虎子一臉幽怨的說到。 ![](https://imgkr.cn-bj.ufileos.com/84d74e37-095b-40bb-84e0-d30ca6a8a928.png) “嗨,我最近也為這事發愁呢,程式越來越多,讀寫硬碟的時間越來越多了,尤其是那個叫MySQL的,老讓我訪問硬碟,可累死我了。” 沒想到我倆都憋了一肚子苦水呢。 這時,平日裡愛拍老闆馬屁的八號車間老大說了一句話:“你們說的問題確實存在,這工作太沒技術含量了,就是個體力活嘛,要不咱給老闆說說,讓他外包出去吧” 我倆一聽,妙啊,要是能把這體力活外包出去,那可簡直太好了,我們就可以專心做我們的專職工作了。 “你跟老闆平時走得近,這事你去說吧”,我給虎子使了個眼色,一起攛掇老八去說這事。 ![](https://imgkr.cn-bj.ufileos.com/53fe26ae-b734-4e71-8f0b-483179bc8fb6.png) “行,我去就我去”。 還別說,領導立馬就同意了這個想法,畢竟能提高我們的工作效率,他自然是舉雙手歡迎。 沒過多久,就成立了一個外包團隊,獨立出我們廠子,專門來負責這件事。和我們CPU一樣,他們也提供了幾個暫存器,傳輸資料的時候,只需要設定一下這些暫存器的內容,告訴他們要傳輸哪裡的資料,從哪到哪,長度是多少,接下來的事情我們就不用操心了,交由他們來完成。我們就可以騰出功夫做其他事情,等資料傳輸完畢了,他們再用中斷的方式告訴我們,我們直接去處理就好了,省去了讓我們親自去搬運的過程,真是爽的飛起~ ![](https://imgkr.cn-bj.ufileos.com/6080e9de-ed94-4d12-9d42-88458182bdff.png) 後來,我們給這項技術也取了一個名字,叫Direct Memory Access,直接儲存器訪問,簡稱`DMA`,這個外包團隊就是`DMAC`,DMA控制器。 ## DMA全面開花 前幾天的月總結會上,領導表揚了老八,說多虧他的建議讓廠裡的生產效率大大提升。早知道,當初就不攛掇老八去跟老闆提建議了,我自己去。 ![](https://imgkr.cn-bj.ufileos.com/e7c5c5d6-c21f-45a4-a231-5bdf04fe8069.png) 正想著走神,突然想到了一個問題,這一次我打算抓住機會掙個表現。 “老闆,這個DMA技術好是好,但現在只能用於硬碟哦。最近網絡卡那傢伙資料包也挺多的,我花了好多時間去把資料包從網絡卡讀取到記憶體中,又低效又沒有技術含量,可不可以把這技術推廣到網絡卡上啊?”,我起身說到。 老闆點了點頭,若有所思。 二號車間虎子見狀也起身說到:“老闆,除了硬碟和網絡卡,顯示器也有這個需求。我經常要疲於奔波於把記憶體資料傳輸到顯示器,也是勞神勞力,建議DMA技術也推廣到顯示器呢” 老闆聽完,皺了皺眉頭說到,“這個不同裝置之間的差別還是挺大的,沒法通用。難不成我們要為每個裝置成立一個外包團隊?這成本有點高啊···” 老闆果然還是老闆,還是把成本考慮在第一位。 這時,愛拍馬屁的老八又說話了,“老闆說的是。我倒是有個建議,這個DMA推廣到網絡卡、顯示器這些單位也可以,不過讓他們自己掏錢來增加DMAC,按照他們各自不同的需求來做。咱們不能當這冤大頭” 老闆一聽,喜形於色,大聲叫好! ![](https://imgkr.cn-bj.ufileos.com/6d10d8f7-fc6f-4fee-96ec-9a345030d79d.png) 就這樣,很快我們就把這項技術推廣了出去,主機板上以網絡卡、顯示器、攝像頭為首的那些個單位為了不落後於人,紛紛擁抱變化,集成了DMAC。 我們得到了徹底的解放,再也不用做枯燥的搬運工了~ ## 彩蛋 > “阿Q,聽說了嗎,最近Linux帝國新成立了一個公司,居然繞過我們CPU就能把資料從網絡卡寫入硬碟中” > > “不可能啊,至少得經過我們拷貝一下吧” > > “根本不用,他們號稱是**零拷貝技術**” > > *預知後事如何,請關注後續精彩······* ## 往期TOP5文章 [CPU明明8個核,網絡卡為啥拼命折騰一號核?](https://mp.weixin.qq.com/s/Xf3sbkJFWDQ7bzhKFEmkzA) [因為一個跨域請求,我差點丟了飯碗](https://mp.weixin.qq.com/s/K15IVpe57STOf0SxyLEg9A) [完了!CPU一味求快出事兒了!](https://mp.weixin.qq.com/s/NVIgNj4c7ixkJWsemOt--g) [雜湊表哪家強?幾大程式語言吵起來了!](https://mp.weixin.qq.com/s/erSqe-nItuQPxW4MT3LEVg) [一個HTTP資料包的奇幻之旅](https://mp.weixin.qq.com/s/axPUi-8kHtFQTwgRtyZtGQ) ![](https://imgkr.cn-bj.ufileos.com/4b6d4bd9-3924-4288-a3e9-a31ea0dd0