搭上cache這列快車,讓應用再快一些吧!

快在當下互聯網中無疑是最重要的事情了。老闆們強調“一定要快,快速做出新產品,快速迭代,快速佔領市場”。

技術也不斷快速的迭代,宏觀的5G、大數據、人工智能、雲計算、物聯網等技術使得用戶更快的找到內容,微觀的Docker容器技術、Kubernetes技術、負載均衡技術、微服務架構等技術使得程序更快速的實現部署。

一切都像汽車上了高速公路一樣,開始飛速的運轉起來。那麼最根本的內容——程序也必須快起來啊。如果底層的程序運行耗時,那麼堆疊在上面的架構設計、容器部署、彈性伸縮也是巧婦難爲無米之炊,就像汽車引擎不快,即使有了技術高超的駕駛員、行走在高速公路、燃燒最好的汽油,也快不起來。所以代碼的運行快速特別重要,今天小編給大家帶來的便是cache緩存

 

今天分四個模塊給大家來深入淺出cache,第一模塊是代碼塊案例;第二模塊是程序如何運行;第三模塊是cache原理剖析;第四模塊是迴歸案例進行講解。

 

Part1:代碼塊案例

在介紹緩存之前,我們從一串代碼分析開始,對於二維數組的賦值,有兩種寫法。

第一種寫法是形成了一個100*10的二維數組,第二種寫法是10*100的二維數組。

在教科書中的教導使得大部分情況下我們都會使用第一種寫法,實質是因爲在程序運行效率中,第一種寫法運行效率高,背後的原因就是cache緩存了~

 

Part2:程序如何運行?

在計算機程序執行時所有的指令和數據全從存儲器中進行獲取,因此在瞭解cache的工作原理之前,我們先來介紹一下計算機中數據存儲的方式。

在計算機內部包含有如下存儲器,從外到內依次是硬盤、主存(如RAM、ROM)、cache、寄存器,硬盤的話就是平時我們使用的C盤、D盤,可存儲文件、視頻等,而主存&cache&寄存器用以存儲各類程序及處理的數據。

隨着技術的發展,各處理器的速度和性能得到了飛躍的提升,作爲拍檔的存儲器速度也必須提升起來,以保持整體系統的平衡。但實際上存儲器在容量尤其是訪問延時方面的性能增長越來越跟不上處理器性能發展的需要,因此在計算機內部採用層次化的存儲器體系結構用以減少二者的差距。

通過剛剛的講解,我們已經知道程序是運行在主存的RAM當中。那麼一個程序是如何運行起來的呢?通常一個程序就是一個進程,當這個進程起來的時候,首先從flash設備中把可執行程序加載在主存中進行運行,當需要對變量進行計算時,在CPU內部的通用寄存器將某地址ad1的變量進行計算。

總的來說分爲如下三個步驟:

1)CPU從主存中讀取地址ad1的數據到內部通用寄存器X0;

2)通用寄存器X0執行運算;

3)CPU將通用寄存器X0的值寫入主存。

如圖所示,寄存器與主存的運行速度相差10倍,也就是說CPU在寄存器獲取數據後要等待10倍的時間才能返回到主存,這樣的程序執行速度太慢了。

因此cache出現了,在寄存器和主存之前增加了cache,CPU需要對存儲器進行讀寫操作時,先訪問cache,如果cache中不存在操作數據時,再從主存中獲取,如果主存不存在,再從硬盤中獲取,在獲取了數據的同時也把該數據放一份在cache中,用以以後的執行獲取數據。cache的運行時間爲2ns,在整體運行效率上改善了8倍,提升了程序的運行速度。

 

Part3:cache講解

cache即緩存,將程序執行常用的數據放在cache中,CPU和主存之間直接數據傳輸的方式就變成了CPU和cache之間直接數據傳輸,cache則負責與主存之間的數據傳輸。

如果cache中有CPU需要的數據,這時候成爲命中hit,但是當cache中沒有想要的數據時(即Miss),CPU仍然需要等待從主存中獲取數據,爲了提升性能和命中率,在計算機系統中依次引入了多級cachememory、直接映射緩存、兩路組相連緩存、全相連緩存。

所謂多級緩存,即在CPU寄存器和主存中引入L1cache、L2cache、L3cache,等級越高容量越大速度也越慢.當CPU試圖獲取某地址的數據時,首先從L1cache中查詢,如果命中則返回寄存器,如果不命中則繼續從L2cache中進行查詢,如果命中,該數據在世界傳遞給CPU的同時也會傳遞給L1cache,如果不命中,則繼續往L3cache、主存查詢。整個的運轉流程如圖所示。

 

所謂直接映射緩存,則是爲了方便cache和主存之間交換信息,將cache和主存空間劃分爲相等的區域,在主存中的劃分區域大小劃分爲塊block,cache中存放主存塊的區域稱作行line,塊block與行line一一對應。比如cache的大小是64bytes,將其劃分爲64塊,那麼cacheline就是1字節,只能傳輸一字節的信息。

 

CPU獲取數據的方法仍然和多級緩存的方式一樣,先從cache中獲取,如果沒有再從主存中獲取,所不同的是將主存中的信息按塊複製到cache中,整體流程如下圖所示。

所謂全相連映射,則是將每個主存塊映射到cache的任意行中,組相連映射是將每個主存塊映射到cache固定組的任意行中,直接相連映射則是將每個主存塊映射到cache的固定行中。目前我們常見的CPU採用的是組相連映射方式,獲得了性能的提升和較低的硬件實現難度。

確定好cache的硬件設計方式後,下一步是cache的數據更新策略和分配策略。更新策略指的是什麼情況下進行數據的更新,包含寫直通和寫回兩種策略,寫直通策略就是CPU執行命令並且在緩存中命中時,更新cache中的數據和主存的數據,保障cache和主存的數據始終一致,寫回策略則是CPU執行命令並且在緩存中命中時只更新cache中的數據,此時cache和主存的數據可能不一致。

分配策略指的是什麼情況下進行數據的分配,包含讀分配和寫分配兩種策略,讀分配就是CPU去讀數據時發生數據缺失,分配一個cacheline緩存從主存讀取數據,寫分配就是CPU執行寫操作cache時發生數據缺失,從主存中加載數據到cacheline中,再更新cacheline的數據。

 

Part4:迴歸案例

在part1中的關於二維數據的計算有兩種方式,寫法2效率高於寫法1的原因就在於緩存命中率,因爲寫法2的賦值操作緩存命中率更高一些,所以花的時間更少。對於初接觸C語言的同學來說,可能以爲二維數組在內存中的分佈是這樣的:

 

然而由於計算機中的內存地址是一維的,所以即使是二維數組也按一維進行排列:

 

在寫法2中數據的獲取方式是連續的

 

而寫法1中數據獲取的方式卻是跳躍的,

寫法2獲取100個數據的時間如果需要100ns的話,那寫法1而獲取數據的時間則是10*100=1000ns(需要跳躍10次),因此寫法2的速率高於寫法1。

 

那麼爲什麼二者的效率不一樣呢?原因就在於緩存命中率不一樣。在part3中我們提到CPU採用組相連的硬件設計,獲取數據時先訪問緩存數據,再訪問主存數據。

 

一般來說cache的大小是64字節,在寫法1和寫法2中數據的類型都是int型,4字節數據,因此對於64字節的cache中可以緩存16個連續的整數,CPU直接訪問cache的這16個數當然比從內存裏訪問更快。在寫法1中雖然加載了16個整數,但數卻是跳躍的,相當於需要重複10*1000次,相比寫法的方式需要10倍的內存訪問次數,此時CPU只能等着內存操作完成再獲取數據,因此寫法2的速率比較快,寫法1比較慢。

 

總的來說,緩存的出現加快了CPU執行指令的速度,從而加快了程序的執行速度,最後加快了應用的響應速度,給到我們更快更好的用戶體驗。

 

這整個過程其實就和租房子差不多,現在在一線城市打拼的年輕人們一般都會租房子,租客就像CPU,找房東直租就像從主存直接獲取數據一樣,因爲房東有自己的工作要做、也有其它的事情要忙,房子的出租對於他來說不是最重要的事情,所以他反饋就不那麼技術,所以導致租客等待時間比較長。

 

中介的出現就像cache的出現一樣,拯救了CPU,因爲房屋出租成爲了中介的工作,所以他會快速的從各處房東那裏獲取信息,當租客想在西二旗租房時,直接找中介獲取該處的房源信息直接看房即可,如果在西二旗沒有合適的房源或沒有房源,中介會尋找合適的房東進行房源補充,同時反饋給租客,這就像在cache沒有命中數據時直接從主存中獲取並同步給緩存的原理差不多。

 

通過上述講解,相信你已經清楚了程序是如何運行的?迴歸文章中最初提到的“快速迭代、快速出新產品、快速佔領市場”的正確打開方式便是高效運行的代碼+化整爲零的微服務架構設計+快速部署的容器技術+彈性伸縮的雲計算+智能分析的大數據人工智能+5G~

 

喜歡我們的文章嗎?還想了解互聯網哪些技術,歡迎留言告訴我們

【AI課工場】互聯網知識也能如此好玩~

更多熱門互聯網技術文章搶先知微信公衆號【kgc-cn】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章