提高程式效能、何為緩衝——從儲存空間結構說起
出處:http://www.cnblogs.com/yanlingyin/
開篇
上一篇博文
局部性原理淺析——良好代碼的基本素質
中對程式局部性有了一個簡單的介紹。基本上已經知道了如何編寫有良好局部性的代碼。但是為什麼有良好局部性的代碼就能有良好的運行效率,這個問題將在這篇博文中給出解答。至於儲存空間內部的組織實現,將在下篇文章中敘述。
儲存空間階層
我們知道,電腦裡的儲存空間有:硬碟、主存、快取(其中又有一級快取、二級快取等等)、在往上就是寄存器。
儲存空間在電腦內部的組織方式如所示:
相信大家並不陌生。wiki對The memory hierarchy 的介紹的時候也有此圖。
我們發現,越往上,儲存空間的容量越小、成本越高、速度越快。
為什麼會出現這樣的結構呢?早起的儲存空間階層只有三層:cpu寄存器、DRAM主存以及磁碟儲存。
由於CPU和主存之間巨大的速度差異,系統設計者被迫在CPU寄存器和主存之間插入了一個小的SRAM快取儲存空間稱為L1緩衝,大約可以在2--4個刻度內訪問。再後來發現L1快取和主存之間還是有較大差距,又在L1快取和主存之間插入了速度更快的L2緩衝,大約可以在10個刻度內訪問。於是,在這樣的模式下,在不斷的演變中形成了現在的儲存體系。
現在可以知道整個儲存空間體系被分為了很多層,那麼他們之間是如何協調工作以提高運行效率的呢?
何為緩衝
暫時你可以這樣理解:速度快的儲存空間緩衝了速度慢儲存空間的資料。準確的描述:對於每個k ,位於k層的更快更小的儲存空間裝置作為第k+1層的更大更慢存放裝置的緩衝。就是說,k層儲存了k+1層中經常被訪問的資料。在緩衝之間,資料是以塊為單位傳輸的。當然不同層次的緩衝,塊的大小會不同。一般來說是越往上,塊越小。
請看樣本
k是k+1的緩衝,他們之間的資料轉送是以塊大小為單位的。如中,k中緩衝了k+1中塊編號為 4、9、14、3的資料。
當程式需要這些塊中的資料時,可直接沖緩衝k中得到。這比從k+1層讀資料要快
快取命中
當程式需要第k+1層中的某個資料時d,會首先在它的緩衝k層中尋找。如果資料剛好在k層中,就稱為快取命中(cache hit)。
緩衝不命中
當需要的資料對象d不再緩衝k中時,稱為緩衝不命中。當發生緩衝不命中時,第k層的緩衝會從k+1層取出包含資料對象d的那個塊,如果k層的緩衝已經放滿的話,就會覆蓋其中的一個塊。至於要覆蓋哪一個塊,這是有緩衝中的替換策略決定的,比如說可以覆蓋使用頻率最小的塊,或者最先進入緩衝的塊。。這裡不再討論。在k層從k+1層中取出資料對象d後,程式就能在緩衝中讀取資料對象d了。
快取命中和局部性
這裡先簡單的說說為什麼局部性好的程式能有更好的效能
利用時間局部性:由於時間局部性,同一個資料對象會多次被使用。一旦一個資料對象從k+1層進入到k層的緩衝中,就希望它多次被引用。這樣能節省很多訪問造成的時間開支。
利用空間局部性:假設緩衝k能存n個資料區塊。在對數組訪問的時候,由於數組是連續存放的,對第一個元素訪問的時候,會把第一個元素後面的一共n個元素(緩衝k有n個資料區塊)拷貝到緩衝k中,這樣在對第二個元素到第n個元素的訪問時就可以直接從緩衝裡擷取,從而提高效能。
同理,訪問第n個元素的時候 ,n不在緩衝中,緩衝管理器會把從n到2n的元素拷貝到緩衝中,對它們的訪問就可以直接在緩衝中進行。
通過空間局部性,我們希望對後面對緩衝中其他對象的訪問能補償不命中後拷貝這些塊的時間花費。
現代系統中處處有緩衝,為了使大家能更好的理解,下表對於電腦中不同層次的儲存空間和效能等參數做了以總結(僅供參考)
小結
這篇文章主要介紹了電腦儲存空間內部的組織圖以及他們之間的關係,並簡單說了下緩衝實現機制,以及緩衝和局部性之間的關係。
至於緩衝內部如何?,程式如何從緩衝記憶體取資料,將在下一篇中給出
本人認知有限,如上述文章有不足之處歡迎指正交流。
參看資料:computer systems
如有轉載請註明出處:http://www.cnblogs.com/yanlingyin/
一條魚、yanlingyin@ 部落格園 2012-2-12
E-mail:yanlingyin@yeah.net
開篇
上一篇博文
局部性原理淺析——良好代碼的基本素質
中對程式局部性有了一個簡單的介紹。基本上已經知道了如何編寫有良好局部性的代碼。但是為什麼有良好局部性的代碼就能有良好的運行效率,這個問題將在這篇博文中給出解答。至於儲存空間內部的組織實現,將在下篇文章中敘述。
儲存空間階層
我們知道,電腦裡的儲存空間有:硬碟、主存、快取(其中又有一級快取、二級快取等等)、在往上就是寄存器。
儲存空間在電腦內部的組織方式如所示:
相信大家並不陌生。wiki對The memory hierarchy 的介紹的時候也有此圖。
我們發現,越往上,儲存空間的容量越小、成本越高、速度越快。
為什麼會出現這樣的結構呢?早起的儲存空間階層只有三層:cpu寄存器、DRAM主存以及磁碟儲存。
由於CPU和主存之間巨大的速度差異,系統設計者被迫在CPU寄存器和主存之間插入了一個小的SRAM快取儲存空間稱為L1緩衝,大約可以在2--4個刻度內訪問。再後來發現L1快取和主存之間還是有較大差距,又在L1快取和主存之間插入了速度更快的L2緩衝,大約可以在10個刻度內訪問。於是,在這樣的模式下,在不斷的演變中形成了現在的儲存體系。
現在可以知道整個儲存空間體系被分為了很多層,那麼他們之間是如何協調工作以提高運行效率的呢?
何為緩衝
暫時你可以這樣理解:速度快的儲存空間緩衝了速度慢儲存空間的資料。準確的描述:對於每個k ,位於k層的更快更小的儲存空間裝置作為第k+1層的更大更慢存放裝置的緩衝。就是說,k層儲存了k+1層中經常被訪問的資料。在緩衝之間,資料是以塊為單位傳輸的。當然不同層次的緩衝,塊的大小會不同。一般來說是越往上,塊越小。
請看樣本
k是k+1的緩衝,他們之間的資料轉送是以塊大小為單位的。如中,k中緩衝了k+1中塊編號為 4、9、14、3的資料。
當程式需要這些塊中的資料時,可直接沖緩衝k中得到。這比從k+1層讀資料要快
快取命中
當程式需要第k+1層中的某個資料時d,會首先在它的緩衝k層中尋找。如果資料剛好在k層中,就稱為快取命中(cache hit)。
緩衝不命中
當需要的資料對象d不再緩衝k中時,稱為緩衝不命中。當發生緩衝不命中時,第k層的緩衝會從k+1層取出包含資料對象d的那個塊,如果k層的緩衝已經放滿的話,就會覆蓋其中的一個塊。至於要覆蓋哪一個塊,這是有緩衝中的替換策略決定的,比如說可以覆蓋使用頻率最小的塊,或者最先進入緩衝的塊。。這裡不再討論。在k層從k+1層中取出資料對象d後,程式就能在緩衝中讀取資料對象d了。
快取命中和局部性
這裡先簡單的說說為什麼局部性好的程式能有更好的效能
利用時間局部性:由於時間局部性,同一個資料對象會多次被使用。一旦一個資料對象從k+1層進入到k層的緩衝中,就希望它多次被引用。這樣能節省很多訪問造成的時間開支。
利用空間局部性:假設緩衝k能存n個資料區塊。在對數組訪問的時候,由於數組是連續存放的,對第一個元素訪問的時候,會把第一個元素後面的一共n個元素(緩衝k有n個資料區塊)拷貝到緩衝k中,這樣在對第二個元素到第n個元素的訪問時就可以直接從緩衝裡擷取,從而提高效能。
同理,訪問第n個元素的時候 ,n不在緩衝中,緩衝管理器會把從n到2n的元素拷貝到緩衝中,對它們的訪問就可以直接在緩衝中進行。
通過空間局部性,我們希望對後面對緩衝中其他對象的訪問能補償不命中後拷貝這些塊的時間花費。
現代系統中處處有緩衝,為了使大家能更好的理解,下表對於電腦中不同層次的儲存空間和效能等參數做了以總結(僅供參考)
小結
這篇文章主要介紹了電腦儲存空間內部的組織圖以及他們之間的關係,並簡單說了下緩衝實現機制,以及緩衝和局部性之間的關係。
至於緩衝內部如何?,程式如何從緩衝記憶體取資料,將在下一篇中給出
本人認知有限,如上述文章有不足之處歡迎指正交流。
參看資料:computer systems
如有轉載請註明出處:http://www.cnblogs.com/yanlingyin/
一條魚、yanlingyin@ 部落格園 2012-2-12
E-mail:yanlingyin@yeah.net